Add client connection option to disable server push in gQUIC. Protected by connection option QNSP. PiperOrigin-RevId: 326310589 Change-Id: I5f09591fc2ea3ae4381c34733e0c6e657dbf3520
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h index 8d907d8..9bd5f17 100644 --- a/quic/core/crypto/crypto_protocol.h +++ b/quic/core/crypto/crypto_protocol.h
@@ -355,6 +355,9 @@ // Encapsulation. const QuicTag kQNZR = TAG('Q', 'N', 'Z', 'R'); // Turn off QUIC crypto 0-RTT. +const QuicTag kQNSP = TAG('Q', 'N', 'S', 'P'); // Turn off server push in + // gQUIC. + const QuicTag kMAD = TAG('M', 'A', 'D', 0); // Max Ack Delay (IETF QUIC) // Rejection tags
diff --git a/quic/core/http/quic_server_session_base.cc b/quic/core/http/quic_server_session_base.cc index 805816e..c408257 100644 --- a/quic/core/http/quic_server_session_base.cc +++ b/quic/core/http/quic_server_session_base.cc
@@ -9,6 +9,7 @@ #include "net/third_party/quiche/src/quic/core/proto/cached_network_parameters_proto.h" #include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/core/quic_stream.h" +#include "net/third_party/quiche/src/quic/core/quic_tag.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h" #include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h" @@ -51,6 +52,12 @@ return; } + // Disable server push if peer sends the corresponding connection option. + if (!version().UsesHttp3() && + ContainsQuicTag(config()->ReceivedConnectionOptions(), kQNSP)) { + OnSetting(spdy::SETTINGS_ENABLE_PUSH, 0); + } + // Enable bandwidth resumption if peer sent correct connection options. const bool last_bandwidth_resumption = ContainsQuicTag(config()->ReceivedConnectionOptions(), kBWRE);
diff --git a/quic/core/http/quic_server_session_base_test.cc b/quic/core/http/quic_server_session_base_test.cc index 6af67a6..c37bacc 100644 --- a/quic/core/http/quic_server_session_base_test.cc +++ b/quic/core/http/quic_server_session_base_test.cc
@@ -717,6 +717,20 @@ QuicServerSessionBasePeer::IsBandwidthResumptionEnabled(session_.get())); } +TEST_P(QuicServerSessionBaseTest, TurnOffServerPush) { + if (session_->version().UsesHttp3()) { + return; + } + + EXPECT_TRUE(session_->server_push_enabled()); + QuicTagVector copt; + copt.push_back(kQNSP); + QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt); + connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); + session_->OnConfigNegotiated(); + EXPECT_FALSE(session_->server_push_enabled()); +} + // Tests which check the lifetime management of data members of // QuicCryptoServerStream objects when async GetProof is in use. class StreamMemberLifetimeTest : public QuicServerSessionBaseTest {