In QUIC, prevent applications from looking up stream_map_ directly.

Instead, a new method GetActiveStream() is exposed.

No behavior change. not protected.

PiperOrigin-RevId: 322685603
Change-Id: Id354bc418bd6634439e188e1247f40a3ce1727d3
diff --git a/quic/core/http/quic_spdy_client_session_base.cc b/quic/core/http/quic_spdy_client_session_base.cc
index 3050989..9bd7695 100644
--- a/quic/core/http/quic_spdy_client_session_base.cc
+++ b/quic/core/http/quic_spdy_client_session_base.cc
@@ -177,9 +177,9 @@
 
 QuicSpdyStream* QuicSpdyClientSessionBase::GetPromisedStream(
     const QuicStreamId id) {
-  StreamMap::iterator it = stream_map().find(id);
-  if (it != stream_map().end()) {
-    return static_cast<QuicSpdyStream*>(it->second.get());
+  QuicStream* stream = GetActiveStream(id);
+  if (stream != nullptr) {
+    return static_cast<QuicSpdyStream*>(stream);
   }
   return nullptr;
 }
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index a6286cc..d13166e 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -2069,6 +2069,14 @@
   return nullptr;
 }
 
+QuicStream* QuicSession::GetActiveStream(QuicStreamId id) const {
+  auto stream = stream_map_.find(id);
+  if (stream != stream_map_.end() && !stream->second->is_static()) {
+    return stream->second.get();
+  }
+  return nullptr;
+}
+
 bool QuicSession::OnFrameAcked(const QuicFrame& frame,
                                QuicTime::Delta ack_delay_time,
                                QuicTime receive_timestamp) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index db8c55f..635ffa9 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -645,6 +645,11 @@
     connection()->SetLossDetectionTuner(std::move(tuner));
   }
 
+  // Find stream with |id|, returns nullptr if the stream does not exist or
+  // closed. static streams and zombie streams are not considered active
+  // streams.
+  QuicStream* GetActiveStream(QuicStreamId id) const;
+
  private:
   friend class test::QuicSessionPeer;