Make sure WebTransport over HTTP/3 is enabled on the client even when SETTINGS_ENABLE_CONNECT_PROTOCOL is not present. draft-ietf-webtrans-http3-02 says: "the SETTINGS_ENABLE_WEBTRANSPORT setting implies that an endpoint supports extended CONNECT". PiperOrigin-RevId: 408846213
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index 2d7d906..5a85927 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -1200,6 +1200,9 @@ return false; } peer_supports_webtransport_ = (value == 1); + if (perspective() == Perspective::IS_CLIENT && value == 1) { + allow_extended_connect_ = true; + } break; default: QUIC_DVLOG(1) << ENDPOINT << "Unknown setting identifier " << id
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc index 834cd18..5db1aab 100644 --- a/quic/core/http/quic_spdy_session_test.cc +++ b/quic/core/http/quic_spdy_session_test.cc
@@ -3735,6 +3735,33 @@ EXPECT_EQ(web_transport->NumberOfAssociatedStreams(), 0u); } +TEST_P(QuicSpdySessionTestClient, WebTransportWithoutExtendedConnect) { + if (!version().UsesHttp3()) { + return; + } + SetQuicReloadableFlag(quic_verify_request_headers_2, true); + SetQuicReloadableFlag(quic_act_upon_invalid_header, true); + session_.set_local_http_datagram_support(HttpDatagramSupport::kDraft00And04); + session_.set_supports_webtransport(true); + + EXPECT_FALSE(session_.SupportsWebTransport()); + CompleteHandshake(); + + SettingsFrame settings; + settings.values[SETTINGS_H3_DATAGRAM_DRAFT04] = 1; + settings.values[SETTINGS_WEBTRANS_DRAFT00] = 1; + // No SETTINGS_ENABLE_CONNECT_PROTOCOL here. + std::string data = std::string(1, kControlStream) + EncodeSettings(settings); + QuicStreamId control_stream_id = + session_.perspective() == Perspective::IS_SERVER + ? GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3) + : GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 3); + QuicStreamFrame frame(control_stream_id, /*fin=*/false, /*offset=*/0, data); + session_.OnStreamFrame(frame); + + EXPECT_TRUE(session_.SupportsWebTransport()); +} + class QuicSpdySessionTestServerNoExtendedConnect : public QuicSpdySessionTestBase { public: