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