Fix a bug where HTTP/3 client stack will treat any extended CONNECT request as WebTransport. Patch by @wbpcode originally submitted via <https://github.com/google/quiche/pull/146>, adopted with slight modifications. PiperOrigin-RevId: 933344786
diff --git a/quiche/quic/core/http/quic_spdy_stream.cc b/quiche/quic/core/http/quic_spdy_stream.cc index 55f7824..e0d7f96 100644 --- a/quiche/quic/core/http/quic_spdy_stream.cc +++ b/quiche/quic/core/http/quic_spdy_stream.cc
@@ -1462,7 +1462,7 @@ if (method_it == headers.end() || protocol_it == headers.end()) { return; } - if (method_it->second != "CONNECT" && protocol_it->second != "webtransport") { + if (method_it->second != "CONNECT" || protocol_it->second != "webtransport") { return; }
diff --git a/quiche/quic/core/http/quic_spdy_stream_test.cc b/quiche/quic/core/http/quic_spdy_stream_test.cc index d64b402..6bd56f1 100644 --- a/quiche/quic/core/http/quic_spdy_stream_test.cc +++ b/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -3333,6 +3333,32 @@ EXPECT_EQ(stream_->web_transport()->GetNegotiatedSubprotocol(), "moqt-01"); } +TEST_P(QuicSpdyStreamTest, DoNotProcessNonWebTransportExtendedConnectAsClient) { + if (!IsIetfQuic()) { + return; + } + + InitializeWithPerspective(kShouldProcessData, Perspective::IS_CLIENT); + session_->set_local_http_datagram_support(HttpDatagramSupport::kRfc); + session_->EnableWebTransport(); + session_->OnSetting(SETTINGS_ENABLE_CONNECT_PROTOCOL, 1); + QuicSpdySessionPeer::EnableWebTransport(session_.get()); + QuicSpdySessionPeer::SetHttpDatagramSupport(session_.get(), + HttpDatagramSupport::kRfc); + + EXPECT_CALL(*stream_, WriteHeadersMock(false)); + EXPECT_CALL(*session_, WritevData(stream_->id(), _, _, _, _, _)) + .Times(AnyNumber()); + + // Ensure that the client does not attempt to set up a WebTransport session if + // the `:protocol` value is not "webtransport". + quiche::HttpHeaderBlock request_headers; + request_headers[":method"] = "CONNECT"; + request_headers[":protocol"] = "websocket"; + stream_->WriteHeaders(std::move(request_headers), /*fin=*/false, nullptr); + EXPECT_EQ(stream_->web_transport(), nullptr); +} + TEST_P(QuicSpdyStreamTest, WebTransportIgnoreSubprotocolsThatWereNotOffered) { if (!IsIetfQuic()) { return;