OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/spdy/hpack/hpack_input_stream.h" | 5 #include "net/spdy/hpack/hpack_input_stream.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "net/spdy/hpack/hpack_huffman_decoder.h" | 10 #include "net/spdy/hpack/hpack_huffman_decoder.h" |
11 #include "net/spdy/spdy_bug_tracker.h" | 11 #include "net/spdy/spdy_bug_tracker.h" |
12 | 12 |
13 namespace net { | 13 namespace net { |
14 | 14 |
15 using base::StringPiece; | 15 using base::StringPiece; |
16 using std::string; | 16 using std::string; |
17 | 17 |
18 HpackInputStream::HpackInputStream(uint32_t max_string_literal_size, | 18 HpackInputStream::HpackInputStream(StringPiece buffer) |
19 StringPiece buffer) | 19 : buffer_(buffer), |
20 : max_string_literal_size_(max_string_literal_size), | |
21 buffer_(buffer), | |
22 bit_offset_(0), | 20 bit_offset_(0), |
23 parsed_bytes_(0), | 21 parsed_bytes_(0), |
24 parsed_bytes_current_(0), | 22 parsed_bytes_current_(0), |
25 need_more_data_(false) {} | 23 need_more_data_(false) {} |
26 | 24 |
27 HpackInputStream::~HpackInputStream() {} | 25 HpackInputStream::~HpackInputStream() {} |
28 | 26 |
29 bool HpackInputStream::HasMoreData() const { | 27 bool HpackInputStream::HasMoreData() const { |
30 return !buffer_.empty(); | 28 return !buffer_.empty(); |
31 } | 29 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 | 118 |
121 return !has_more; | 119 return !has_more; |
122 } | 120 } |
123 | 121 |
124 bool HpackInputStream::DecodeNextIdentityString(StringPiece* str) { | 122 bool HpackInputStream::DecodeNextIdentityString(StringPiece* str) { |
125 uint32_t size = 0; | 123 uint32_t size = 0; |
126 if (!DecodeNextUint32(&size)) { | 124 if (!DecodeNextUint32(&size)) { |
127 return false; | 125 return false; |
128 } | 126 } |
129 | 127 |
130 if (size > max_string_literal_size_) { | |
131 return false; | |
132 } | |
133 | |
134 if (size > buffer_.size()) { | 128 if (size > buffer_.size()) { |
135 need_more_data_ = true; | 129 need_more_data_ = true; |
136 return false; | 130 return false; |
137 } | 131 } |
138 | 132 |
139 *str = StringPiece(buffer_.data(), size); | 133 *str = StringPiece(buffer_.data(), size); |
140 buffer_.remove_prefix(size); | 134 buffer_.remove_prefix(size); |
141 parsed_bytes_current_ += size; | 135 parsed_bytes_current_ += size; |
142 return true; | 136 return true; |
143 } | 137 } |
144 | 138 |
145 bool HpackInputStream::DecodeNextHuffmanString(string* str) { | 139 bool HpackInputStream::DecodeNextHuffmanString(string* str) { |
146 uint32_t encoded_size = 0; | 140 uint32_t encoded_size = 0; |
147 if (!DecodeNextUint32(&encoded_size)) { | 141 if (!DecodeNextUint32(&encoded_size)) { |
148 if (!need_more_data_) { | 142 if (!need_more_data_) { |
149 DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString " | 143 DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString " |
150 << "unable to decode size"; | 144 << "unable to decode size"; |
151 } | 145 } |
152 return false; | 146 return false; |
153 } | 147 } |
154 | 148 |
155 if (encoded_size > buffer_.size()) { | 149 if (encoded_size > buffer_.size()) { |
156 need_more_data_ = true; | 150 need_more_data_ = true; |
157 DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString " << encoded_size | 151 DVLOG(1) << "HpackInputStream::DecodeNextHuffmanString " << encoded_size |
158 << " > " << buffer_.size(); | 152 << " > " << buffer_.size(); |
159 return false; | 153 return false; |
160 } | 154 } |
161 | 155 |
162 HpackInputStream bounded_reader(max_string_literal_size_, | 156 HpackInputStream bounded_reader(StringPiece(buffer_.data(), encoded_size)); |
163 StringPiece(buffer_.data(), encoded_size)); | |
164 buffer_.remove_prefix(encoded_size); | 157 buffer_.remove_prefix(encoded_size); |
165 parsed_bytes_current_ += encoded_size; | 158 parsed_bytes_current_ += encoded_size; |
166 | 159 |
167 // DecodeString will not append more than |max_string_literal_size_| chars | 160 return HpackHuffmanDecoder::DecodeString(&bounded_reader, str); |
168 // to |str|. | |
169 return HpackHuffmanDecoder::DecodeString(&bounded_reader, | |
170 max_string_literal_size_, str); | |
171 } | 161 } |
172 | 162 |
173 bool HpackInputStream::PeekBits(size_t* peeked_count, uint32_t* out) const { | 163 bool HpackInputStream::PeekBits(size_t* peeked_count, uint32_t* out) const { |
174 size_t byte_offset = (bit_offset_ + *peeked_count) / 8; | 164 size_t byte_offset = (bit_offset_ + *peeked_count) / 8; |
175 size_t bit_offset = (bit_offset_ + *peeked_count) % 8; | 165 size_t bit_offset = (bit_offset_ + *peeked_count) % 8; |
176 | 166 |
177 if (*peeked_count >= 32 || byte_offset >= buffer_.size()) { | 167 if (*peeked_count >= 32 || byte_offset >= buffer_.size()) { |
178 return false; | 168 return false; |
179 } | 169 } |
180 // We'll read the minimum of the current byte remainder, | 170 // We'll read the minimum of the current byte remainder, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 243 |
254 bool HpackInputStream::NeedMoreData() const { | 244 bool HpackInputStream::NeedMoreData() const { |
255 return need_more_data_; | 245 return need_more_data_; |
256 } | 246 } |
257 | 247 |
258 void HpackInputStream::MarkCurrentPosition() { | 248 void HpackInputStream::MarkCurrentPosition() { |
259 parsed_bytes_ = parsed_bytes_current_; | 249 parsed_bytes_ = parsed_bytes_current_; |
260 } | 250 } |
261 | 251 |
262 } // namespace net | 252 } // namespace net |
OLD | NEW |