In oghttp2, do not deliver OnWindowUpdate() for non-existent streams.

Discovered as part of testing for b/228093860, where oghttp2 receives a
WINDOW_UPDATE on a stream that has already been closed due to RST_STREAM. This
CL increases functional parity with nghttp2.

PiperOrigin-RevId: 439692076
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc
index 9c8523c..fd572d9 100644
--- a/http2/adapter/oghttp2_adapter_test.cc
+++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -1977,8 +1977,6 @@
   EXPECT_CALL(visitor, OnFrameHeader(0, 4, WINDOW_UPDATE, 0));
   EXPECT_CALL(visitor, OnWindowUpdate(0, 42));
   EXPECT_CALL(visitor, OnFrameHeader(1, 4, WINDOW_UPDATE, 0));
-  // TODO(b/228093860): Do not pass WINDOW_UPDATE events on closed streams.
-  EXPECT_CALL(visitor, OnWindowUpdate(1, 42));
 
   const int64_t stream_result = adapter->ProcessBytes(stream_frames);
   EXPECT_EQ(stream_frames.size(), static_cast<size_t>(stream_result));
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc
index ed4e7fe..0381625 100644
--- a/http2/adapter/oghttp2_session.cc
+++ b/http2/adapter/oghttp2_session.cc
@@ -1373,8 +1373,9 @@
         // Receiving WINDOW_UPDATE before HEADERS is a connection error.
         LatchErrorAndNotify(Http2ErrorCode::PROTOCOL_ERROR,
                             ConnectionError::kWrongFrameSequence);
-        return;
       }
+      // Do not inform the visitor of a WINDOW_UPDATE for a non-existent stream.
+      return;
     } else {
       if (streams_reset_.contains(stream_id)) {
         return;