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

Unified Diff: net/spdy/spdy_headers_block_parser.cc

Issue 863253002: Update from https://crrev.com/312600 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 11 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
Index: net/spdy/spdy_headers_block_parser.cc
diff --git a/net/spdy/spdy_headers_block_parser.cc b/net/spdy/spdy_headers_block_parser.cc
index 968642770bf91147a70b9142790e8719a6cf97b8..1ec0d0da47731610a320219fd1d306694f27e4ab 100644
--- a/net/spdy/spdy_headers_block_parser.cc
+++ b/net/spdy/spdy_headers_block_parser.cc
@@ -7,6 +7,12 @@
#include "base/sys_byteorder.h"
namespace net {
+namespace {
+
+// 0 is invalid according to both the SPDY 3.1 and HTTP/2 specifications.
+const SpdyStreamId kInvalidStreamId = 0;
+
+} // anonymous namespace
const size_t SpdyHeadersBlockParser::kMaximumFieldLength = 16 * 1024;
@@ -19,6 +25,7 @@ SpdyHeadersBlockParser::SpdyHeadersBlockParser(
total_bytes_received_(0),
remaining_key_value_pairs_for_frame_(0),
handler_(handler),
+ stream_id_(kInvalidStreamId),
error_(OK),
spdy_version_(spdy_version) {
// The handler that we set must not be NULL.
@@ -34,15 +41,27 @@ bool SpdyHeadersBlockParser::HandleControlFrameHeadersData(
if (error_ == NEED_MORE_DATA) {
error_ = OK;
}
- CHECK_EQ(error_, OK);
+ if (error_ != OK) {
+ LOG(DFATAL) << "Unexpected error: " << error_;
+ return false;
+ }
// If this is the first call with the current header block,
// save its stream id.
- if (state_ == READING_HEADER_BLOCK_LEN) {
+ if (state_ == READING_HEADER_BLOCK_LEN && stream_id_ == kInvalidStreamId) {
stream_id_ = stream_id;
}
- CHECK_EQ(stream_id_, stream_id);
-
+ if (stream_id != stream_id_) {
+ LOG(DFATAL) << "Unexpected stream id: " << stream_id << " (expected "
+ << stream_id_ << ")";
+ error_ = UNEXPECTED_STREAM_ID;
+ return false;
+ }
+ if (stream_id_ == kInvalidStreamId) {
+ LOG(DFATAL) << "Expected nonzero stream id, saw: " << stream_id_;
+ error_ = UNEXPECTED_STREAM_ID;
+ return false;
+ }
total_bytes_received_ += headers_data_length;
SpdyPinnableBufferPiece prefix, key, value;
@@ -81,7 +100,7 @@ bool SpdyHeadersBlockParser::HandleControlFrameHeadersData(
if (!reader.ReadN(next_field_length_, &value)) {
error_ = NEED_MORE_DATA;
} else {
- handler_->OnHeader(stream_id, key, value);
+ handler_->OnHeader(key, value);
}
break;
case FINISHED_HEADER:
@@ -90,15 +109,14 @@ bool SpdyHeadersBlockParser::HandleControlFrameHeadersData(
next_state = READING_KEY_LEN;
} else {
next_state = READING_HEADER_BLOCK_LEN;
- handler_->OnHeaderBlockEnd(stream_id, total_bytes_received_);
+ handler_->OnHeaderBlockEnd(total_bytes_received_);
+ stream_id_ = kInvalidStreamId;
// Expect to have consumed all buffer.
if (reader.Available() != 0) {
error_ = TOO_MUCH_DATA;
}
}
break;
- default:
- CHECK(false) << "Not reached.";
}
if (error_ == OK) {
@@ -130,7 +148,7 @@ void SpdyHeadersBlockParser::ParseBlockLength(Reader* reader) {
error_ = HEADER_BLOCK_TOO_LARGE;
}
if (error_ == OK) {
- handler_->OnHeaderBlock(stream_id_, remaining_key_value_pairs_for_frame_);
+ handler_->OnHeaderBlock(remaining_key_value_pairs_for_frame_);
}
}

Powered by Google App Engine
This is Rietveld 408576698