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