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: