| Index: net/spdy/hpack/hpack_input_stream.cc
|
| diff --git a/net/spdy/hpack/hpack_input_stream.cc b/net/spdy/hpack/hpack_input_stream.cc
|
| index ba64b410a7b654c2aa794a2f73aaba06362bc59d..79455e51fe7f02f62949e204c5d05534b2cfbfef 100644
|
| --- a/net/spdy/hpack/hpack_input_stream.cc
|
| +++ b/net/spdy/hpack/hpack_input_stream.cc
|
| @@ -19,7 +19,10 @@ HpackInputStream::HpackInputStream(uint32_t max_string_literal_size,
|
| StringPiece buffer)
|
| : max_string_literal_size_(max_string_literal_size),
|
| buffer_(buffer),
|
| - bit_offset_(0) {}
|
| + bit_offset_(0),
|
| + parsed_bytes_(0),
|
| + parsed_bytes_current_(0),
|
| + need_more_data_(false) {}
|
|
|
| HpackInputStream::~HpackInputStream() {}
|
|
|
| @@ -28,6 +31,11 @@ bool HpackInputStream::HasMoreData() const {
|
| }
|
|
|
| bool HpackInputStream::MatchPrefixAndConsume(HpackPrefix prefix) {
|
| + if (buffer_.empty()) {
|
| + need_more_data_ = true;
|
| + return false;
|
| + }
|
| +
|
| DCHECK_GT(prefix.bit_size, 0u);
|
| DCHECK_LE(prefix.bit_size, 8u);
|
|
|
| @@ -46,7 +54,11 @@ bool HpackInputStream::MatchPrefixAndConsume(HpackPrefix prefix) {
|
| }
|
|
|
| bool HpackInputStream::PeekNextOctet(uint8_t* next_octet) {
|
| - if ((bit_offset_ > 0) || buffer_.empty()) {
|
| + if (buffer_.empty()) {
|
| + need_more_data_ = true;
|
| + return false;
|
| + }
|
| + if ((bit_offset_ > 0)) {
|
| DVLOG(1) << "HpackInputStream::PeekNextOctet bit_offset_=" << bit_offset_;
|
| return false;
|
| }
|
| @@ -61,6 +73,7 @@ bool HpackInputStream::DecodeNextOctet(uint8_t* next_octet) {
|
| }
|
|
|
| buffer_.remove_prefix(1);
|
| + parsed_bytes_current_ += 1;
|
| return true;
|
| }
|
|
|
| @@ -76,7 +89,9 @@ bool HpackInputStream::DecodeNextUint32(uint32_t* I) {
|
| uint8_t next_marker = (1 << N) - 1;
|
| uint8_t next_octet = 0;
|
| if (!DecodeNextOctet(&next_octet)) {
|
| - DVLOG(1) << "HpackInputStream::DecodeNextUint32 initial octet error";
|
| + if (!need_more_data_) {
|
| + DVLOG(1) << "HpackInputStream::DecodeNextUint32 initial octet error";
|
| + }
|
| return false;
|
| }
|
| *I = next_octet & next_marker;
|
| @@ -86,7 +101,9 @@ bool HpackInputStream::DecodeNextUint32(uint32_t* I) {
|
| while (has_more && (shift < 32)) {
|
| uint8_t next_octet = 0;
|
| if (!DecodeNextOctet(&next_octet)) {
|
| - DVLOG(1) << "HpackInputStream::DecodeNextUint32 shift=" << shift;
|
| + if (!need_more_data_) {
|
| + DVLOG(1) << "HpackInputStream::DecodeNextUint32 shift=" << shift;
|
| + }
|
| return false;
|
| }
|
| has_more = (next_octet & 0x80) != 0;
|
| @@ -115,23 +132,28 @@ bool HpackInputStream::DecodeNextIdentityString(StringPiece* str) {
|
| }
|
|
|
| if (size > buffer_.size()) {
|
| + need_more_data_ = true;
|
| return false;
|
| }
|
|
|
| *str = StringPiece(buffer_.data(), size);
|
| buffer_.remove_prefix(size);
|
| + parsed_bytes_current_ += size;
|
| return true;
|
| }
|
|
|
| bool HpackInputStream::DecodeNextHuffmanString(string* str) {
|
| uint32_t encoded_size = 0;
|
| if (!DecodeNextUint32(&encoded_size)) {
|
| - DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString "
|
| - << "unable to decode size";
|
| + if (!need_more_data_) {
|
| + DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString "
|
| + << "unable to decode size";
|
| + }
|
| return false;
|
| }
|
|
|
| if (encoded_size > buffer_.size()) {
|
| + need_more_data_ = true;
|
| DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString " << encoded_size
|
| << " > " << buffer_.size();
|
| return false;
|
| @@ -140,6 +162,7 @@ bool HpackInputStream::DecodeNextHuffmanString(string* str) {
|
| HpackInputStream bounded_reader(max_string_literal_size_,
|
| StringPiece(buffer_.data(), encoded_size));
|
| buffer_.remove_prefix(encoded_size);
|
| + parsed_bytes_current_ += encoded_size;
|
|
|
| // DecodeString will not append more than |max_string_literal_size_| chars
|
| // to |str|.
|
| @@ -215,6 +238,7 @@ void HpackInputStream::ConsumeBits(size_t bit_count) {
|
| CHECK_GT(buffer_.size(), 0u);
|
| }
|
| buffer_.remove_prefix(byte_count);
|
| + parsed_bytes_current_ += byte_count;
|
| }
|
|
|
| void HpackInputStream::ConsumeByteRemainder() {
|
| @@ -223,4 +247,16 @@ void HpackInputStream::ConsumeByteRemainder() {
|
| }
|
| }
|
|
|
| +uint32_t HpackInputStream::ParsedBytes() const {
|
| + return parsed_bytes_;
|
| +}
|
| +
|
| +bool HpackInputStream::NeedMoreData() const {
|
| + return need_more_data_;
|
| +}
|
| +
|
| +void HpackInputStream::MarkCurrentPosition() {
|
| + parsed_bytes_ = parsed_bytes_current_;
|
| +}
|
| +
|
| } // namespace net
|
|
|