Factors out a CreateStream method within OgHttp2Session.

This should be a no-op refactoring.

PiperOrigin-RevId: 387716176
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc
index b7ecf04..6aa98b8 100644
--- a/http2/adapter/oghttp2_session.cc
+++ b/http2/adapter/oghttp2_session.cc
@@ -432,19 +432,8 @@
   auto frame =
       absl::make_unique<spdy::SpdyHeadersIR>(stream_id, ToHeaderBlock(headers));
   // Add data source and user data to stream state
-  WindowManager::WindowUpdateListener listener =
-      [this, stream_id](size_t window_update_delta) {
-        SendWindowUpdate(stream_id, window_update_delta);
-      };
-  absl::flat_hash_map<Http2StreamId, StreamState>::iterator iter;
-  bool inserted;
-  std::tie(iter, inserted) = stream_map_.try_emplace(
-      stream_id,
-      StreamState(stream_receive_window_limit_, std::move(listener)));
-  if (!inserted) {
-    QUICHE_LOG(DFATAL) << "Stream " << stream_id << " already exists!";
-    return -501;  // NGHTTP2_ERR_INVALID_ARGUMENT
-  }
+  auto iter = CreateStream(stream_id);
+  write_scheduler_.MarkStreamReady(stream_id, false);
   if (data_source == nullptr) {
     frame->set_fin(true);
     iter->second.half_closed_local = true;
@@ -452,10 +441,6 @@
     iter->second.outbound_body = std::move(data_source);
   }
   iter->second.user_data = user_data;
-  // Add the stream to the write scheduler.
-  const WriteScheduler::StreamPrecedenceType precedence(3);
-  write_scheduler_.RegisterStream(stream_id, precedence);
-  write_scheduler_.MarkStreamReady(stream_id, false);
   // Enqueue headers frame
   EnqueueFrame(std::move(frame));
   return stream_id;
@@ -642,17 +627,7 @@
                                spdy::SpdyStreamId /*parent_stream_id*/,
                                bool /*exclusive*/, bool /*fin*/, bool /*end*/) {
   if (options_.perspective == Perspective::kServer) {
-    WindowManager::WindowUpdateListener listener =
-        [this, stream_id](size_t window_update_delta) {
-          SendWindowUpdate(stream_id, window_update_delta);
-        };
-    // TODO(birenroy): Factor out a CreateStream() method from here and
-    // SubmitRequest().
-    stream_map_.try_emplace(stream_id, StreamState(stream_receive_window_limit_,
-                                                   std::move(listener)));
-    // Add the stream to the write scheduler.
-    const WriteScheduler::StreamPrecedenceType precedence(3);
-    write_scheduler_.RegisterStream(stream_id, precedence);
+    CreateStream(stream_id);
   }
 }
 
@@ -772,5 +747,24 @@
   }
 }
 
+OgHttp2Session::StreamStateMap::iterator OgHttp2Session::CreateStream(
+    Http2StreamId stream_id) {
+  WindowManager::WindowUpdateListener listener =
+      [this, stream_id](size_t window_update_delta) {
+        SendWindowUpdate(stream_id, window_update_delta);
+      };
+  absl::flat_hash_map<Http2StreamId, StreamState>::iterator iter;
+  bool inserted;
+  std::tie(iter, inserted) = stream_map_.try_emplace(
+      stream_id,
+      StreamState(stream_receive_window_limit_, std::move(listener)));
+  if (inserted) {
+    // Add the stream to the write scheduler.
+    const WriteScheduler::StreamPrecedenceType precedence(3);
+    write_scheduler_.RegisterStream(stream_id, precedence);
+  }
+  return iter;
+}
+
 }  // namespace adapter
 }  // namespace http2
diff --git a/http2/adapter/oghttp2_session.h b/http2/adapter/oghttp2_session.h
index c6aca48..6bec0ca 100644
--- a/http2/adapter/oghttp2_session.h
+++ b/http2/adapter/oghttp2_session.h
@@ -164,6 +164,7 @@
     bool half_closed_local = false;
     bool half_closed_remote = false;
   };
+  using StreamStateMap = absl::flat_hash_map<Http2StreamId, StreamState>;
 
   class QUICHE_EXPORT_PRIVATE PassthroughHeadersHandler
       : public spdy::SpdyHeadersHandlerInterface {
@@ -210,6 +211,9 @@
   // Performs flow control accounting for data sent by the peer.
   void MarkDataBuffered(Http2StreamId stream_id, size_t bytes);
 
+  // Creates a stream and returns an iterator pointing to it.
+  StreamStateMap::iterator CreateStream(Http2StreamId stream_id);
+
   // Receives events when inbound frames are parsed.
   Http2VisitorInterface& visitor_;
 
@@ -220,7 +224,7 @@
   http2::Http2DecoderAdapter decoder_;
 
   // Maintains the state of all streams known to this session.
-  absl::flat_hash_map<Http2StreamId, StreamState> stream_map_;
+  StreamStateMap stream_map_;
 
   // Maintains the queue of outbound frames, and any serialized bytes that have
   // not yet been consumed.