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_;