Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(762)

Unified Diff: net/spdy/spdy_stream.cc

Issue 2779763005: Reset stream if HTTP/2 response status is invalid. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/spdy/spdy_stream_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_stream.cc
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index d8cbe4dcc31da3d70183dc54c84f1adcaa67ecdb..b21cf2b1d37cc395a6a2ab22343174a6f69cce16 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -32,38 +32,6 @@ namespace net {
namespace {
-enum StatusHeader {
- STATUS_HEADER_NOT_INCLUDED = 0,
- STATUS_HEADER_DOES_NOT_START_WITH_NUMBER = 1,
- STATUS_HEADER_IS_NUMBER = 2,
- STATUS_HEADER_HAS_STATUS_TEXT = 3,
- STATUS_HEADER_MAX = STATUS_HEADER_HAS_STATUS_TEXT
-};
-
-StatusHeader ParseStatusHeaderImpl(const SpdyHeaderBlock& response_headers,
- int* status) {
- SpdyHeaderBlock::const_iterator it = response_headers.find(":status");
- if (it == response_headers.end())
- return STATUS_HEADER_NOT_INCLUDED;
-
- // Save status in |*status| even if some text follows the status code.
- SpdyStringPiece status_string = it->second;
- SpdyStringPiece::size_type end = status_string.find(' ');
- if (!StringToInt(status_string.substr(0, end), status))
- return STATUS_HEADER_DOES_NOT_START_WITH_NUMBER;
-
- return end == SpdyStringPiece::npos ? STATUS_HEADER_IS_NUMBER
- : STATUS_HEADER_HAS_STATUS_TEXT;
-}
-
-StatusHeader ParseStatusHeader(const SpdyHeaderBlock& response_headers,
- int* status) {
- StatusHeader status_header = ParseStatusHeaderImpl(response_headers, status);
- UMA_HISTOGRAM_ENUMERATION("Net.Http2ResponseStatusHeader", status_header,
- STATUS_HEADER_MAX + 1);
- return status_header;
-}
-
std::unique_ptr<base::Value> NetLogSpdyStreamErrorCallback(
SpdyStreamId stream_id,
int status,
@@ -411,34 +379,32 @@ void SpdyStream::OnHeadersReceived(const SpdyHeaderBlock& response_headers,
base::Time response_time,
base::TimeTicks recv_first_byte_time) {
switch (response_state_) {
- case READY_FOR_HEADERS: {
+ case READY_FOR_HEADERS:
// No header block has been received yet.
DCHECK(response_headers_.empty());
- int status;
- switch (ParseStatusHeader(response_headers, &status)) {
- case STATUS_HEADER_NOT_INCLUDED: {
+
+ {
+ SpdyHeaderBlock::const_iterator it = response_headers.find(":status");
+ if (it == response_headers.end()) {
const std::string error("Response headers do not include :status.");
LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
session_->ResetStream(stream_id_, ERROR_CODE_PROTOCOL_ERROR, error);
return;
}
- case STATUS_HEADER_DOES_NOT_START_WITH_NUMBER: {
+
+ int status;
+ if (!StringToInt(it->second, &status)) {
const std::string error("Cannot parse :status.");
LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
session_->ResetStream(stream_id_, ERROR_CODE_PROTOCOL_ERROR, error);
return;
}
- // Intentional fallthrough for the following two cases,
- // to maintain compatibility with broken servers that include
- // status text in the response.
- case STATUS_HEADER_IS_NUMBER:
- case STATUS_HEADER_HAS_STATUS_TEXT:
- // Ignore informational headers.
- // TODO(bnc): Add support for 103 Early Hints,
- // https://crbug.com/671310.
- if (status / 100 == 1) {
- return;
- }
+
+ // Ignore informational headers.
+ // TODO(bnc): Add support for 103 Early Hints, https://crbug.com/671310.
+ if (status / 100 == 1) {
+ return;
+ }
}
response_state_ = READY_FOR_DATA_OR_TRAILERS;
@@ -476,7 +442,7 @@ void SpdyStream::OnHeadersReceived(const SpdyHeaderBlock& response_headers,
SaveResponseHeaders(response_headers);
break;
- }
+
case READY_FOR_DATA_OR_TRAILERS:
// Second header block is trailers.
if (type_ == SPDY_PUSH_STREAM) {
« no previous file with comments | « no previous file | net/spdy/spdy_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698