Internal change

PiperOrigin-RevId: 481619831
diff --git a/quiche/quic/core/http/quic_spdy_stream.cc b/quiche/quic/core/http/quic_spdy_stream.cc
index cd5590e..e27a23a 100644
--- a/quiche/quic/core/http/quic_spdy_stream.cc
+++ b/quiche/quic/core/http/quic_spdy_stream.cc
@@ -888,7 +888,6 @@
   return headers_decompressed_ && header_list_.empty();
 }
 
-// static
 bool QuicSpdyStream::ParseHeaderStatusCode(const Http2HeaderBlock& header,
                                            int* status_code) {
   Http2HeaderBlock::const_iterator it = header.find(spdy::kHttp2StatusHeader);
@@ -896,6 +895,11 @@
     return false;
   }
   const absl::string_view status(it->second);
+  return ParseHeaderStatusCode(status, status_code);
+}
+
+bool QuicSpdyStream::ParseHeaderStatusCode(absl::string_view status,
+                                           int* status_code) {
   if (status.size() != 3) {
     return false;
   }
diff --git a/quiche/quic/core/http/quic_spdy_stream.h b/quiche/quic/core/http/quic_spdy_stream.h
index 4718591..5ba4400 100644
--- a/quiche/quic/core/http/quic_spdy_stream.h
+++ b/quiche/quic/core/http/quic_spdy_stream.h
@@ -180,6 +180,10 @@
   // code to |status_code|.
   static bool ParseHeaderStatusCode(const spdy::Http2HeaderBlock& header,
                                     int* status_code);
+  // Returns true if status_value (associated with :status) contains a valid
+  // 3-digit status and parse the status code to |status_code|.
+  static bool ParseHeaderStatusCode(absl::string_view status_value,
+                                    int* status_code);
 
   // Returns true when all data from the peer has been read and consumed,
   // including the fin.
diff --git a/quiche/quic/tools/quic_simple_server_stream.cc b/quiche/quic/tools/quic_simple_server_stream.cc
index f4dec74..d8b7a7b 100644
--- a/quiche/quic/tools/quic_simple_server_stream.cc
+++ b/quiche/quic/tools/quic_simple_server_stream.cc
@@ -459,8 +459,13 @@
   if (response_headers.has_value()) {
     QUIC_DLOG(INFO) << "Stream " << id() << " writing headers (fin = false) : "
                     << response_headers.value().DebugString();
+    // Do not mark response sent for early 100 continue response.
+    int response_code;
+    if (!ParseHeaderStatusCode(*response_headers, &response_code) ||
+        response_code != 100) {
+      response_sent_ = true;
+    }
     WriteHeaders(std::move(response_headers).value(), /*fin=*/false, nullptr);
-    response_sent_ = true;
   }
 
   QUIC_DLOG(INFO) << "Stream " << id()
diff --git a/quiche/quic/tools/quic_simple_server_stream.h b/quiche/quic/tools/quic_simple_server_stream.h
index 85ce8b5..2cabefd 100644
--- a/quiche/quic/tools/quic_simple_server_stream.h
+++ b/quiche/quic/tools/quic_simple_server_stream.h
@@ -110,7 +110,7 @@
   }
 
   bool response_sent() const { return response_sent_; }
-
+  void set_response_sent() { response_sent_ = true; }
   // The parsed headers received from the client.
   spdy::Http2HeaderBlock request_headers_;
   int64_t content_length_;