Consider pending streams in ShouldKeepConnectionAlive. gfe-relnote: protected by disabled v99 flag. PiperOrigin-RevId: 276140643 Change-Id: Ie7d8c35ab325998ecbd1856927db665f611e051d
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index 1c8664f..6099f7d 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -639,7 +639,10 @@ // True if there are open HTTP requests. bool QuicSpdySession::ShouldKeepConnectionAlive() const { - return GetNumActiveStreams() > 0; + if (!VersionUsesHttp3(transport_version())) { + DCHECK(pending_streams().empty()); + } + return GetNumActiveStreams() + pending_streams().size() > 0; } bool QuicSpdySession::UsesPendingStreams() const {
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc index d0a30f6..dadccf8 100644 --- a/quic/core/http/quic_spdy_session_test.cc +++ b/quic/core/http/quic_spdy_session_test.cc
@@ -296,6 +296,7 @@ } using QuicSession::closed_streams; + using QuicSession::ShouldKeepConnectionAlive; using QuicSession::zombie_streams; using QuicSpdySession::ProcessPendingStream; using QuicSpdySession::UsesPendingStreams; @@ -1749,6 +1750,21 @@ session_.OnStreamFrame(data1); } +TEST_P(QuicSpdySessionTestClient, PendingStreamKeepsConnectionAlive) { + if (!VersionUsesHttp3(transport_version())) { + return; + } + + QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId( + transport_version(), Perspective::IS_SERVER); + + QuicStreamFrame frame(stream_id, false, 1, "test"); + EXPECT_FALSE(session_.ShouldKeepConnectionAlive()); + session_.OnStreamFrame(frame); + EXPECT_TRUE(QuicSessionPeer::GetPendingStream(&session_, stream_id)); + EXPECT_TRUE(session_.ShouldKeepConnectionAlive()); +} + TEST_P(QuicSpdySessionTestClient, AvailableStreamsClient) { ASSERT_TRUE(session_.GetOrCreateStream( GetNthServerInitiatedBidirectionalId(2)) != nullptr);
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index 498fb57..d221fe6 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -538,6 +538,10 @@ StreamMap& stream_map() { return stream_map_; } const StreamMap& stream_map() const { return stream_map_; } + const PendingStreamMap& pending_streams() const { + return pending_stream_map_; + } + ClosedStreams* closed_streams() { return &closed_streams_; } const ZombieStreamMap& zombie_streams() const { return zombie_streams_; }