Improve hard-coded QuicSimpleServerStream's push promise id. In IETF world, HTTP/3 static unidirectional streams are not guaranteed to be created at initialization. So we need to explicitly adjust highest_push_promise_id_ when a new H/3 static stream is created. gfe-relnote: v99 change only, not protected. PiperOrigin-RevId: 262976660 Change-Id: I3182356ae6560486b5677abdc73846f452598b24
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h index 1f94a79..68becb6 100644 --- a/quic/core/http/quic_spdy_session.h +++ b/quic/core/http/quic_spdy_session.h
@@ -249,6 +249,9 @@ return receive_control_stream_; } + // Initializes HTTP/3 unidirectional streams if not yet initialzed. + virtual void MaybeInitializeHttp3UnidirectionalStreams(); + private: friend class test::QuicSpdySessionPeer; @@ -266,9 +269,6 @@ void OnPriority(spdy::SpdyStreamId stream_id, const spdy::SpdyStreamPrecedence& precedence); - // Initializes HTTP/3 unidirectional streams if not yet initialzed. - void MaybeInitializeHttp3UnidirectionalStreams(); - std::unique_ptr<QpackEncoder> qpack_encoder_; std::unique_ptr<QpackDecoder> qpack_decoder_;
diff --git a/quic/tools/quic_simple_server_session.cc b/quic/tools/quic_simple_server_session.cc index 8f7dcf8..cf2c569 100644 --- a/quic/tools/quic_simple_server_session.cc +++ b/quic/tools/quic_simple_server_session.cc
@@ -33,11 +33,7 @@ crypto_config, compressed_certs_cache), highest_promised_stream_id_( - VersionHasStreamType(connection->transport_version()) - ? QuicUtils::GetFirstUnidirectionalStreamId( - connection->transport_version(), - Perspective::IS_SERVER) - : QuicUtils::GetInvalidStreamId(connection->transport_version())), + QuicUtils::GetInvalidStreamId(connection->transport_version())), quic_simple_server_backend_(quic_simple_server_backend) { DCHECK(quic_simple_server_backend_); } @@ -238,4 +234,14 @@ HandlePromisedPushRequests(); } } + +void QuicSimpleServerSession::MaybeInitializeHttp3UnidirectionalStreams() { + size_t previous_static_stream_count = num_outgoing_static_streams(); + QuicSpdySession::MaybeInitializeHttp3UnidirectionalStreams(); + size_t current_static_stream_count = num_outgoing_static_streams(); + DCHECK_GE(current_static_stream_count, previous_static_stream_count); + highest_promised_stream_id_ += + QuicUtils::StreamIdDelta(transport_version()) * + (current_static_stream_count - previous_static_stream_count); +} } // namespace quic
diff --git a/quic/tools/quic_simple_server_session.h b/quic/tools/quic_simple_server_session.h index 12748ad..d485e7c 100644 --- a/quic/tools/quic_simple_server_session.h +++ b/quic/tools/quic_simple_server_session.h
@@ -102,6 +102,8 @@ return quic_simple_server_backend_; } + void MaybeInitializeHttp3UnidirectionalStreams() override; + private: friend class test::QuicSimpleServerSessionPeer;