OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 // Decoder for strings encoded using the HPACK Huffman Code (see | 5 // Decoder for strings encoded using the HPACK Huffman Code (see |
6 // https://httpwg.github.io/specs/rfc7541.html#huffman.code). | 6 // https://httpwg.github.io/specs/rfc7541.html#huffman.code). |
7 // | 7 // |
8 // This implementation is inspired by the One-Shift algorithm described in | 8 // This implementation is inspired by the One-Shift algorithm described in |
9 // "On the Implementation of Minimum Redundancy Prefix Codes", by Alistair | 9 // "On the Implementation of Minimum Redundancy Prefix Codes", by Alistair |
10 // Moffat and Andrew Turpin, 1997. | 10 // Moffat and Andrew Turpin, 1997. |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 // What is the position of the canonical symbol being decoded within | 285 // What is the position of the canonical symbol being decoded within |
286 // the canonical symbols of length |code_length|? | 286 // the canonical symbols of length |code_length|? |
287 HuffmanWord ordinal_in_length = | 287 HuffmanWord ordinal_in_length = |
288 ((bits - first_lj_code) >> (kHuffmanWordLength - code_length)); | 288 ((bits - first_lj_code) >> (kHuffmanWordLength - code_length)); |
289 | 289 |
290 // Combined these two to produce the position of the canonical symbol | 290 // Combined these two to produce the position of the canonical symbol |
291 // being decoded within all of the canonical symbols. | 291 // being decoded within all of the canonical symbols. |
292 return first_canonical + ordinal_in_length; | 292 return first_canonical + ordinal_in_length; |
293 } | 293 } |
294 | 294 |
295 char HpackHuffmanDecoder::CanonicalToSource(HuffmanWord canonical) { | 295 uint8_t HpackHuffmanDecoder::CanonicalToSource(HuffmanWord canonical) { |
296 DCHECK_LT(canonical, 256u); | 296 DCHECK_LT(canonical, 256u); |
297 return static_cast<char>(kCanonicalToSymbol[canonical]); | 297 return kCanonicalToSymbol[canonical]; |
298 } | 298 } |
299 | 299 |
300 // TODO(jamessynge): Maybe further refactorings, including just passing in a | 300 // TODO(jamessynge): Maybe further refactorings, including just passing in a |
301 // SpdyStringPiece instead of an HpackInputStream, thus avoiding the PeekBits | 301 // SpdyStringPiece instead of an HpackInputStream, thus avoiding the PeekBits |
302 // calls, and also allowing us to separate the code into portions dealing with | 302 // calls, and also allowing us to separate the code into portions dealing with |
303 // long strings, and a later portion dealing with the last few bytes of strings. | 303 // long strings, and a later portion dealing with the last few bytes of strings. |
304 // TODO(jamessynge): Determine if that is worth it by adding some counters to | 304 // TODO(jamessynge): Determine if that is worth it by adding some counters to |
305 // measure the distribution of string sizes seen in practice. | 305 // measure the distribution of string sizes seen in practice. |
306 bool HpackHuffmanDecoder::DecodeString(HpackInputStream* in, SpdyString* out) { | 306 bool HpackHuffmanDecoder::DecodeString(HpackInputStream* in, SpdyString* out) { |
307 out->clear(); | 307 out->clear(); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 // Get some more bits for decoding (up to 8). |peeked_success| is true | 391 // Get some more bits for decoding (up to 8). |peeked_success| is true |
392 // if we got any bits. | 392 // if we got any bits. |
393 peeked_success = in->PeekBits(&bits_available, &bits); | 393 peeked_success = in->PeekBits(&bits_available, &bits); |
394 } | 394 } |
395 DLOG_IF(WARNING, (VLOG_IS_ON(2) && bits_available < 32 && !peeked_success)) | 395 DLOG_IF(WARNING, (VLOG_IS_ON(2) && bits_available < 32 && !peeked_success)) |
396 << "no more peeking possible"; | 396 << "no more peeking possible"; |
397 } | 397 } |
398 } | 398 } |
399 | 399 |
400 } // namespace net | 400 } // namespace net |
OLD | NEW |