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