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 eab55d2ad298960745afb5061c973c23f9911384..2a302c187621bfe25bc947c51c4a5a0c97779e73 100644 |
--- a/net/spdy/spdy_headers_block_parser.cc |
+++ b/net/spdy/spdy_headers_block_parser.cc |
@@ -16,6 +16,7 @@ SpdyHeadersBlockParser::SpdyHeadersBlockParser( |
state_(READING_HEADER_BLOCK_LEN), |
length_field_size_(LengthFieldSizeForVersion(spdy_version)), |
max_headers_in_block_(MaxNumberOfHeadersForVersion(spdy_version)), |
+ total_bytes_received_(0), |
remaining_key_value_pairs_for_frame_(0), |
handler_(handler), |
error_(OK) { |
@@ -41,6 +42,8 @@ bool SpdyHeadersBlockParser::HandleControlFrameHeadersData( |
} |
CHECK_EQ(stream_id_, stream_id); |
+ total_bytes_received_ += headers_data_length; |
+ |
SpdyPinnableBufferPiece prefix, key, value; |
// Simultaneously tie lifetimes to the stack, and clear member variables. |
prefix.Swap(&headers_block_prefix_); |
@@ -86,7 +89,7 @@ bool SpdyHeadersBlockParser::HandleControlFrameHeadersData( |
next_state = READING_KEY_LEN; |
} else { |
next_state = READING_HEADER_BLOCK_LEN; |
- handler_->OnHeaderBlockEnd(stream_id); |
+ handler_->OnHeaderBlockEnd(stream_id, total_bytes_received_); |
// Expect to have consumed all buffer. |
if (reader.Available() != 0) { |
error_ = TOO_MUCH_DATA; |
@@ -102,6 +105,7 @@ bool SpdyHeadersBlockParser::HandleControlFrameHeadersData( |
if (next_state == READING_HEADER_BLOCK_LEN) { |
// We completed reading a full header block. Return to caller. |
+ total_bytes_received_ = 0; |
break; |
} |
} else if (error_ == NEED_MORE_DATA) { |
@@ -164,6 +168,7 @@ void SpdyHeadersBlockParser::Reset() { |
error_ = OK; |
state_ = READING_HEADER_BLOCK_LEN; |
stream_id_ = 0; |
+ total_bytes_received_ = 0; |
} |
size_t SpdyHeadersBlockParser::LengthFieldSizeForVersion( |