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_; }