Add QuicSpdySession::EnableServerPush(). Re-enable QuicSimpleServerSessionServerPushTests. gfe-relnote: Add method only used in tests, re-enable some tests. Not protected. PiperOrigin-RevId: 302431681 Change-Id: I3eeb630b0be43c76fa7c36be6c2ac1f13ee97abb
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index 713a8d0..26bd5d0 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -388,7 +388,6 @@ qpack_maximum_blocked_streams_(kDefaultMaximumBlockedStreams), max_inbound_header_list_size_(kDefaultMaxUncompressedHeaderSize), max_outbound_header_list_size_(std::numeric_limits<size_t>::max()), - server_push_enabled_(true), stream_id_( QuicUtils::GetInvalidStreamId(connection->transport_version())), promised_stream_id_( @@ -397,6 +396,8 @@ frame_len_(0), spdy_framer_(SpdyFramer::ENABLE_COMPRESSION), spdy_framer_visitor_(new SpdyFramerVisitor(this)), + server_push_enabled_(true), + ietf_server_push_enabled_(false), max_allowed_push_id_(0), destruction_indicator_(123456789), debug_visitor_(nullptr), @@ -708,8 +709,8 @@ } bool QuicSpdySession::server_push_enabled() const { - // TODO(b/151641466): Improve and enable server push for IETF QUIC. - return VersionUsesHttp3(transport_version()) ? false : server_push_enabled_; + return VersionUsesHttp3(transport_version()) ? ietf_server_push_enabled_ + : server_push_enabled_; } void QuicSpdySession::SendInitialData() { @@ -1223,6 +1224,13 @@ send_control_stream_->SendMaxPushIdFrame(max_allowed_push_id_); } +void QuicSpdySession::EnableServerPush() { + DCHECK(VersionUsesHttp3(transport_version())); + DCHECK_EQ(perspective(), Perspective::IS_SERVER); + + ietf_server_push_enabled_ = true; +} + void QuicSpdySession::CloseConnectionOnDuplicateHttp3UnidirectionalStreams( quiche::QuicheStringPiece type) { QUIC_PEER_BUG << quiche::QuicheStrCat("Received a duplicate ", type,
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h index 71a001d..631c036 100644 --- a/quic/core/http/quic_spdy_session.h +++ b/quic/core/http/quic_spdy_session.h
@@ -296,6 +296,14 @@ QuicStreamId max_allowed_push_id() { return max_allowed_push_id_; } + // Enables server push. + // Must only be called when using IETF QUIC, for which server push is disabled + // by default. Server push defaults to enabled and cannot be disabled for + // Google QUIC. + // Must only be called for a server. A client can effectively disable push by + // never calling SetMaxAllowedPushId(). + void EnableServerPush(); + int32_t destruction_indicator() const { return destruction_indicator_; } void set_debug_visitor(Http3DebugVisitor* debug_visitor) { @@ -476,10 +484,6 @@ // TODO(b/148616439): Honor this field when sending headers. size_t max_outbound_header_list_size_; - // Set during handshake. If true, resources in x-associated-content and link - // headers will be pushed. - bool server_push_enabled_; - // Data about the stream whose headers are being processed. QuicStreamId stream_id_; QuicStreamId promised_stream_id_; @@ -489,6 +493,16 @@ spdy::SpdyFramer spdy_framer_; http2::Http2DecoderAdapter h2_deframer_; std::unique_ptr<SpdyFramerVisitor> spdy_framer_visitor_; + + // Used in Google QUIC only. Set every time SETTINGS_ENABLE_PUSH is received. + // Defaults to true. + bool server_push_enabled_; + + // Used in IETF QUIC only, and only for servers. Set locally via + // EnableServerPush(), not influenced by data received from the client. + // Defaults to false. + bool ietf_server_push_enabled_; + QuicStreamId max_allowed_push_id_; // An integer used for live check. The indicator is assigned a value in
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc index 363dfd9..b127cd6 100644 --- a/quic/tools/quic_simple_server_session_test.cc +++ b/quic/tools/quic_simple_server_session_test.cc
@@ -754,13 +754,11 @@ // PUSH_PROMISE's will be sent out and only kMaxStreamsForTest streams will be // opened and send push response. TEST_P(QuicSimpleServerSessionServerPushTest, TestPromisePushResources) { - // TODO(b/151641466): Re-enable server push for IETF QUIC. - if (VersionUsesHttp3(transport_version())) { - return; - } - MaybeConsumeHeadersStreamData(); - session_->SetMaxAllowedPushId(kMaxQuicStreamId); + if (VersionUsesHttp3(transport_version())) { + session_->EnableServerPush(); + session_->SetMaxAllowedPushId(kMaxQuicStreamId); + } size_t num_resources = kMaxStreamsForTest + 5; PromisePushResources(num_resources); EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams()); @@ -770,13 +768,11 @@ // draining, a queued promised stream will become open and send push response. TEST_P(QuicSimpleServerSessionServerPushTest, HandlePromisedPushRequestsAfterStreamDraining) { - // TODO(b/151641466): Re-enable server push for IETF QUIC. - if (VersionUsesHttp3(transport_version())) { - return; - } - MaybeConsumeHeadersStreamData(); - session_->SetMaxAllowedPushId(kMaxQuicStreamId); + if (VersionUsesHttp3(transport_version())) { + session_->EnableServerPush(); + session_->SetMaxAllowedPushId(kMaxQuicStreamId); + } size_t num_resources = kMaxStreamsForTest + 1; QuicByteCount data_frame_header_length = PromisePushResources(num_resources); QuicStreamId next_out_going_stream_id; @@ -851,7 +847,10 @@ return; } MaybeConsumeHeadersStreamData(); - session_->SetMaxAllowedPushId(kMaxQuicStreamId); + if (VersionUsesHttp3(transport_version())) { + session_->EnableServerPush(); + session_->SetMaxAllowedPushId(kMaxQuicStreamId); + } // Having two extra resources to be send later. One of them will be reset, so // when opened stream become close, only one will become open. @@ -935,13 +934,11 @@ // the queue to be send out. TEST_P(QuicSimpleServerSessionServerPushTest, CloseStreamToHandleMorePromisedStream) { - // TODO(b/151641466): Re-enable server push for IETF QUIC. - if (VersionUsesHttp3(transport_version())) { - return; - } - MaybeConsumeHeadersStreamData(); - session_->SetMaxAllowedPushId(kMaxQuicStreamId); + if (VersionUsesHttp3(transport_version())) { + session_->EnableServerPush(); + session_->SetMaxAllowedPushId(kMaxQuicStreamId); + } size_t num_resources = kMaxStreamsForTest + 1; if (VersionHasIetfQuicFrames(transport_version())) { // V99 will send out a stream-id-blocked frame when the we desired to exceed