Create HTTP/3 unidirectional stream only when stream limit allows. gfe-relnote: n/a, v99 only. PiperOrigin-RevId: 260017164 Change-Id: Id0a7d8867eee873b182b78f1e30475f0c87d9fe0
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index 6352d7b..50332ee 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -12,6 +12,7 @@ #include "net/third_party/quiche/src/quic/core/http/http_constants.h" #include "net/third_party/quiche/src/quic/core/http/quic_headers_stream.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" +#include "net/third_party/quiche/src/quic/core/quic_versions.h" #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h" #include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h" #include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h" @@ -315,6 +316,8 @@ const QuicConfig& config, const ParsedQuicVersionVector& supported_versions) : QuicSession(connection, visitor, config, supported_versions), + send_control_stream_(nullptr), + receive_control_stream_(nullptr), max_inbound_header_list_size_(kDefaultMaxUncompressedHeaderSize), max_outbound_header_list_size_(kDefaultMaxUncompressedHeaderSize), server_push_enabled_(true), @@ -382,12 +385,7 @@ /*stream_already_counted = */ false); if (VersionHasStreamType(connection()->transport_version())) { - auto send_control = QuicMakeUnique<QuicSendControlStream>( - GetNextOutgoingUnidirectionalStreamId(), this, - max_inbound_header_list_size_); - send_control_stream_ = send_control.get(); - RegisterStaticStream(std::move(send_control), - /*stream_already_counted = */ false); + MaybeInitializeHttp3UnidirectionalStreams(); } spdy_framer_visitor_->set_max_header_list_size(max_inbound_header_list_size_); @@ -798,4 +796,23 @@ return false; } +void QuicSpdySession::MaybeInitializeHttp3UnidirectionalStreams() { + DCHECK(VersionHasStreamType(connection()->transport_version())); + if (!send_control_stream_ && CanOpenNextOutgoingUnidirectionalStream()) { + auto send_control = QuicMakeUnique<QuicSendControlStream>( + GetNextOutgoingUnidirectionalStreamId(), this, + max_inbound_header_list_size_); + send_control_stream_ = send_control.get(); + RegisterStaticStream(std::move(send_control), + /*stream_already_counted = */ false); + } +} + +void QuicSpdySession::OnCanCreateNewOutgoingStream(bool unidirectional) { + if (unidirectional && + VersionHasStreamType(connection()->transport_version())) { + MaybeInitializeHttp3UnidirectionalStreams(); + } +} + } // namespace quic
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h index 3fe5c66..1ce8166 100644 --- a/quic/core/http/quic_spdy_session.h +++ b/quic/core/http/quic_spdy_session.h
@@ -175,6 +175,10 @@ // Returns true if the session has active request streams. bool HasActiveRequestStreams() const; + // Initialze HTTP/3 unidirectional streams if |unidirectional| is true and + // those streams are not initialized yet. + void OnCanCreateNewOutgoingStream(bool unidirectional) override; + protected: // Override CreateIncomingStream(), CreateOutgoingBidirectionalStream() and // CreateOutgoingUnidirectionalStream() with QuicSpdyStream return type to @@ -261,6 +265,9 @@ // Called when the size of the compressed frame payload is available. void OnCompressedFrameSize(size_t frame_len); + // 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 ef70fdb..19a5455 100644 --- a/quic/tools/quic_simple_server_session.cc +++ b/quic/tools/quic_simple_server_session.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "net/third_party/quiche/src/quic/core/http/quic_spdy_session.h" #include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" @@ -229,6 +230,7 @@ void QuicSimpleServerSession::OnCanCreateNewOutgoingStream( bool unidirectional) { + QuicSpdySession::OnCanCreateNewOutgoingStream(unidirectional); if (unidirectional) { HandlePromisedPushRequests(); }
diff --git a/quic/tools/quic_simple_server_stream_test.cc b/quic/tools/quic_simple_server_stream_test.cc index fca04ff..75afb5d 100644 --- a/quic/tools/quic_simple_server_stream_test.cc +++ b/quic/tools/quic_simple_server_stream_test.cc
@@ -550,7 +550,7 @@ // Create a stream with even stream id and test against this stream. const QuicStreamId kServerInitiatedStreamId = GetNthServerInitiatedUnidirectionalStreamId( - connection_->transport_version(), 0); + connection_->transport_version(), 1); // Create a server initiated stream and pass it to session_. auto server_initiated_stream = new StrictMock<TestStream>(kServerInitiatedStreamId, &session_,