Fix incorrect determination of stream type in QUIC T050.

Protected by gfe2_reloadable_flag_quic_fix_gquic_stream_type

PiperOrigin-RevId: 317208417
Change-Id: I9f139a5d5a3859b7642a6e7f45ea7ef1dcbd3368
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc
index c466a9f..6408667 100644
--- a/quic/core/http/quic_spdy_client_session_test.cc
+++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -1179,13 +1179,15 @@
     return;
   }
 
+  SetQuicReloadableFlag(quic_fix_gquic_stream_type, true);
+
   CompleteFirstConnection();
 
   // Create a second connection, but disable 0-RTT on the server.
   CreateConnection();
   QuicConfig config = DefaultQuicConfig();
   // Server doesn't allow any outgoing streams.
-  config.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(1);
+  config.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(2);
   config.SetInitialMaxStreamDataBytesUnidirectionalToSend(1);
   SSL_CTX_set_early_data_enabled(server_crypto_config_->ssl_ctx(), false);
   session_->CryptoConnect();
@@ -1207,7 +1209,7 @@
                 CloseConnection(
                     QUIC_ZERO_RTT_UNRETRANSMITTABLE,
                     "Server rejected 0-RTT, aborting because new stream max "
-                    "data 1 for stream 3 is less than currently used: 5",
+                    "data 2 for stream 3 is less than currently used: 5",
                     _))
         .Times(1)
         .WillOnce(testing::Invoke(connection_,
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index ad7fce3..fec3fe5 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -98,7 +98,9 @@
       use_http2_priority_write_scheduler_(false),
       is_configured_(false),
       enable_round_robin_scheduling_(false),
-      was_zero_rtt_rejected_(false) {
+      was_zero_rtt_rejected_(false),
+      fix_gquic_stream_type_(
+          GetQuicReloadableFlag(quic_fix_gquic_stream_type)) {
   closed_streams_clean_up_alarm_ =
       QuicWrapUnique<QuicAlarm>(connection_->alarm_factory()->CreateAlarm(
           new ClosedStreamsCleanUpDelegate(this)));
@@ -1324,8 +1326,15 @@
   // Inform all existing outgoing unidirectional streams about the new window.
   for (auto const& kv : stream_map_) {
     const QuicStreamId id = kv.first;
-    if (QuicUtils::IsBidirectionalStreamId(id)) {
-      continue;
+    if (fix_gquic_stream_type_ && !version().HasIetfQuicFrames()) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_gquic_stream_type, 1, 3);
+      if (kv.second->type() == BIDIRECTIONAL) {
+        continue;
+      }
+    } else {
+      if (QuicUtils::IsBidirectionalStreamId(id)) {
+        continue;
+      }
     }
     if (!QuicUtils::IsOutgoingStreamId(connection_->version(), id,
                                        perspective())) {
@@ -1351,8 +1360,15 @@
   // Inform all existing outgoing bidirectional streams about the new window.
   for (auto const& kv : stream_map_) {
     const QuicStreamId id = kv.first;
-    if (!QuicUtils::IsBidirectionalStreamId(id)) {
-      continue;
+    if (fix_gquic_stream_type_ && !version().HasIetfQuicFrames()) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_gquic_stream_type, 2, 3);
+      if (kv.second->type() != BIDIRECTIONAL) {
+        continue;
+      }
+    } else {
+      if (!QuicUtils::IsBidirectionalStreamId(id)) {
+        continue;
+      }
     }
     if (!QuicUtils::IsOutgoingStreamId(connection_->version(), id,
                                        perspective())) {
@@ -1378,8 +1394,15 @@
   // Inform all existing incoming bidirectional streams about the new window.
   for (auto const& kv : stream_map_) {
     const QuicStreamId id = kv.first;
-    if (!QuicUtils::IsBidirectionalStreamId(id)) {
-      continue;
+    if (fix_gquic_stream_type_ && !version().HasIetfQuicFrames()) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_gquic_stream_type, 3, 3);
+      if (kv.second->type() != BIDIRECTIONAL) {
+        continue;
+      }
+    } else {
+      if (!QuicUtils::IsBidirectionalStreamId(id)) {
+        continue;
+      }
     }
     if (QuicUtils::IsOutgoingStreamId(connection_->version(), id,
                                       perspective())) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index e5e794f..9233402 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -818,6 +818,9 @@
 
   // Whether the session has received a 0-RTT rejection (QUIC+TLS only).
   bool was_zero_rtt_rejected_;
+
+  // Latched value of flag quic_fix_gquic_stream_type.
+  const bool fix_gquic_stream_type_;
 };
 
 }  // namespace quic