Handle the case when SETTINGS_ENABLE_WEBTRANSPORT = 0 correctly. PiperOrigin-RevId: 367167774 Change-Id: Ib48a0e9afe59987ee00b6056aeb5d3ce2567997b
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index fe75a05..8a4058c 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -1187,7 +1187,23 @@ break; } case SETTINGS_WEBTRANS_DRAFT00: - peer_supports_webtransport_ = true; + if (!WillNegotiateWebTransport()) { + break; + } + QUIC_DVLOG(1) << ENDPOINT + << "SETTINGS_ENABLE_WEBTRANSPORT received with value " + << value; + if (value != 0 && value != 1) { + std::string error_details = absl::StrCat( + "received SETTINGS_ENABLE_WEBTRANSPORT with invalid value ", + value); + QUIC_PEER_BUG(invalid SETTINGS_ENABLE_WEBTRANSPORT value) + << ENDPOINT << error_details; + CloseConnectionWithDetails(QUIC_HTTP_RECEIVE_SPDY_SETTING, + error_details); + return false; + } + peer_supports_webtransport_ = (value == 1); 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 7c22389..d8bfa78 100644 --- a/quic/core/http/quic_spdy_session_test.cc +++ b/quic/core/http/quic_spdy_session_test.cc
@@ -3586,6 +3586,36 @@ EXPECT_TRUE(session_.SupportsWebTransport()); } +TEST_P(QuicSpdySessionTestClient, WebTransportSettingSetToZero) { + if (!version().UsesHttp3()) { + return; + } + SetQuicReloadableFlag(quic_h3_datagram, true); + session_.set_supports_webtransport(true); + + EXPECT_FALSE(session_.SupportsWebTransport()); + + StrictMock<MockHttp3DebugVisitor> debug_visitor; + // Note that this does not actually fill out correct settings because the + // settings are filled in at the construction time. + EXPECT_CALL(debug_visitor, OnSettingsFrameSent(_)); + session_.set_debug_visitor(&debug_visitor); + CompleteHandshake(); + + SettingsFrame server_settings; + server_settings.values[SETTINGS_H3_DATAGRAM] = 1; + server_settings.values[SETTINGS_WEBTRANS_DRAFT00] = 0; + std::string data = + std::string(1, kControlStream) + EncodeSettings(server_settings); + QuicStreamId stream_id = + GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 3); + QuicStreamFrame frame(stream_id, /*fin=*/false, /*offset=*/0, data); + EXPECT_CALL(debug_visitor, OnPeerControlStreamCreated(stream_id)); + EXPECT_CALL(debug_visitor, OnSettingsFrameReceived(server_settings)); + session_.OnStreamFrame(frame); + EXPECT_FALSE(session_.SupportsWebTransport()); +} + TEST_P(QuicSpdySessionTestServer, WebTransportSetting) { if (!version().UsesHttp3()) { return;