Ignore invalid values in WT-Protocol header rather than rejecting them.

New version of the draft says we MUST. https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-13.html#name-application-protocol-negoti

PiperOrigin-RevId: 788890876
diff --git a/quiche/quic/core/http/quic_spdy_stream_test.cc b/quiche/quic/core/http/quic_spdy_stream_test.cc
index 95e3ffb..575a64f 100644
--- a/quiche/quic/core/http/quic_spdy_stream_test.cc
+++ b/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -3325,7 +3325,7 @@
   EXPECT_EQ(stream_->web_transport()->GetNegotiatedSubprotocol(), "moqt-01");
 }
 
-TEST_P(QuicSpdyStreamTest, WebTransportRejectSubprotocolsThatWereNotOffered) {
+TEST_P(QuicSpdyStreamTest, WebTransportIgnoreSubprotocolsThatWereNotOffered) {
   if (!UsesHttp3()) {
     return;
   }
@@ -3354,7 +3354,7 @@
   response_headers["wt-protocol"] = "\"moqt-02\"";
   stream_->web_transport()->HeadersReceived(response_headers);
   EXPECT_EQ(stream_->web_transport()->rejection_reason(),
-            WebTransportHttp3RejectionReason::kSubprotocolMismatch);
+            WebTransportHttp3RejectionReason::kNone);
   EXPECT_EQ(stream_->web_transport()->GetNegotiatedSubprotocol(), std::nullopt);
 }
 
@@ -3387,7 +3387,7 @@
   response_headers["wt-protocol"] = "12345.67";
   stream_->web_transport()->HeadersReceived(response_headers);
   EXPECT_EQ(stream_->web_transport()->rejection_reason(),
-            WebTransportHttp3RejectionReason::kSubprotocolParseError);
+            WebTransportHttp3RejectionReason::kNone);
   EXPECT_EQ(stream_->web_transport()->GetNegotiatedSubprotocol(), std::nullopt);
 }
 
diff --git a/quiche/quic/core/http/web_transport_http3.cc b/quiche/quic/core/http/web_transport_http3.cc
index 86d6086..e2d1466 100644
--- a/quiche/quic/core/http/web_transport_http3.cc
+++ b/quiche/quic/core/http/web_transport_http3.cc
@@ -188,12 +188,7 @@
       rejection_reason_ = WebTransportHttp3RejectionReason::kWrongStatusCode;
       return;
     }
-    WebTransportHttp3RejectionReason subprotocol_result =
-        MaybeSetSubprotocolFromResponseHeaders(headers);
-    if (subprotocol_result != WebTransportHttp3RejectionReason::kNone) {
-      rejection_reason_ = subprotocol_result;
-      return;
-    }
+    MaybeSetSubprotocolFromResponseHeaders(headers);
   }
 
   QUIC_DVLOG(1) << ENDPOINT << "WebTransport session " << id_ << " ready.";
@@ -483,12 +478,11 @@
          webtransport_error_code / 0x1e;
 }
 
-WebTransportHttp3RejectionReason
-WebTransportHttp3::MaybeSetSubprotocolFromResponseHeaders(
+void WebTransportHttp3::MaybeSetSubprotocolFromResponseHeaders(
     const quiche::HttpHeaderBlock& headers) {
   auto subprotocol_it = headers.find(webtransport::kSubprotocolResponseHeader);
   if (subprotocol_it == headers.end()) {
-    return WebTransportHttp3RejectionReason::kNone;
+    return;
   }
 
   absl::StatusOr<std::string> subprotocol =
@@ -496,8 +490,8 @@
   if (!subprotocol.ok()) {
     QUIC_DVLOG(1) << ENDPOINT
                   << "WebTransport server has malformed WT-Protocol "
-                     "header, rejecting.";
-    return WebTransportHttp3RejectionReason::kSubprotocolParseError;
+                     "header, ignoring.";
+    return;
   }
 
   if (session_->perspective() == Perspective::IS_CLIENT &&
@@ -505,12 +499,11 @@
     QUIC_DVLOG(1) << ENDPOINT
                   << "WebTransport server has offered a subprotocol value \""
                   << *subprotocol
-                  << "\", which was not one of the ones offered, rejecting.";
-    return WebTransportHttp3RejectionReason::kSubprotocolMismatch;
+                  << "\", which was not one of the ones offered, ignoring.";
+    return;
   }
 
   subprotocol_selected_ = *std::move(subprotocol);
-  return WebTransportHttp3RejectionReason::kNone;
 }
 
 }  // namespace quic
diff --git a/quiche/quic/core/http/web_transport_http3.h b/quiche/quic/core/http/web_transport_http3.h
index 789dc52..a360986 100644
--- a/quiche/quic/core/http/web_transport_http3.h
+++ b/quiche/quic/core/http/web_transport_http3.h
@@ -38,8 +38,6 @@
   kWrongStatusCode,
   kMissingDraftVersion,
   kUnsupportedDraftVersion,
-  kSubprotocolMismatch,
-  kSubprotocolParseError,
 };
 
 // A session of WebTransport over HTTP/3.  The session is owned by
@@ -132,7 +130,7 @@
   std::optional<std::string> GetNegotiatedSubprotocol() const override {
     return subprotocol_selected_;
   }
-  WebTransportHttp3RejectionReason MaybeSetSubprotocolFromResponseHeaders(
+  void MaybeSetSubprotocolFromResponseHeaders(
       const quiche::HttpHeaderBlock& headers);
 
  private: