diff options
author | jgraettinger@chromium.org <jgraettinger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-30 22:44:20 +0000 |
---|---|---|
committer | jgraettinger@chromium.org <jgraettinger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-30 22:44:20 +0000 |
commit | e99d1287191bfdaad3448b7080b46ae39fb6c97a (patch) | |
tree | 698ac0b24d0fcb795aa08cc5ab18f61dda751616 /net/spdy/hpack_output_stream.cc | |
parent | 630e8545ebed7170f0b0d263c9312a0594710a58 (diff) | |
download | chromium_src-e99d1287191bfdaad3448b7080b46ae39fb6c97a.zip chromium_src-e99d1287191bfdaad3448b7080b46ae39fb6c97a.tar.gz chromium_src-e99d1287191bfdaad3448b7080b46ae39fb6c97a.tar.bz2 |
Implement a minimal decoder for HPACK (HTTP/2 compression)
The decoder assumes everything is encoded as literals without indexing and does
not use Huffman encoding.
The decoder will be expanded to handle everything in the spec in future CLs.
This lands server change 60496510 by akalin.
BUG=339578
Review URL: https://codereview.chromium.org/150453002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@248064 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy/hpack_output_stream.cc')
-rw-r--r-- | net/spdy/hpack_output_stream.cc | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/net/spdy/hpack_output_stream.cc b/net/spdy/hpack_output_stream.cc index 0a20d96..e499fbf 100644 --- a/net/spdy/hpack_output_stream.cc +++ b/net/spdy/hpack_output_stream.cc @@ -5,7 +5,8 @@ #include "net/spdy/hpack_output_stream.h" #include "base/logging.h" -#include "net/spdy/hpack_constants.h" + +using base::StringPiece; namespace net { @@ -18,9 +19,9 @@ HpackOutputStream::HpackOutputStream(uint32 max_string_literal_size) HpackOutputStream::~HpackOutputStream() {} bool HpackOutputStream::AppendLiteralHeaderNoIndexingWithName( - base::StringPiece name, base::StringPiece value) { - AppendBits(kLiteralNoIndexOpcode, kLiteralNoIndexOpcodeSize); - AppendBits(0x0, 8 - kLiteralNoIndexOpcodeSize); + StringPiece name, StringPiece value) { + AppendPrefix(kLiteralNoIndexOpcode); + AppendBits(0x0, 8 - kLiteralNoIndexOpcode.bit_size); if (!AppendStringLiteral(name)) return false; if (!AppendStringLiteral(value)) @@ -37,15 +38,15 @@ void HpackOutputStream::TakeString(string* output) { bit_offset_ = 0; } -void HpackOutputStream::AppendBits(uint8 bits, size_t size) { - DCHECK_GT(size, 0u); - DCHECK_LE(size, 8u); - DCHECK_EQ(bits >> size, 0); - size_t new_bit_offset = bit_offset_ + size; +void HpackOutputStream::AppendBits(uint8 bits, size_t bit_size) { + DCHECK_GT(bit_size, 0u); + DCHECK_LE(bit_size, 8u); + DCHECK_EQ(bits >> bit_size, 0); + size_t new_bit_offset = bit_offset_ + bit_size; if (bit_offset_ == 0) { // Buffer ends on a byte boundary. - DCHECK_LE(size, 8u); - buffer_.append(1, bits << (8 - size)); + DCHECK_LE(bit_size, 8u); + buffer_.append(1, bits << (8 - bit_size)); } else if (new_bit_offset <= 8) { // Buffer does not end on a byte boundary but the given bits fit // in the remainder of the last byte. @@ -59,6 +60,10 @@ void HpackOutputStream::AppendBits(uint8 bits, size_t size) { bit_offset_ = new_bit_offset % 8; } +void HpackOutputStream::AppendPrefix(HpackPrefix prefix) { + AppendBits(prefix.bits, prefix.bit_size); +} + void HpackOutputStream::AppendUint32(uint32 I) { // The algorithm below is adapted from the pseudocode in 4.1.1. size_t N = 8 - bit_offset_; @@ -79,7 +84,7 @@ void HpackOutputStream::AppendUint32(uint32 I) { bool HpackOutputStream::AppendStringLiteral(base::StringPiece str) { DCHECK_EQ(bit_offset_, 0u); // TODO(akalin): Implement Huffman encoding. - AppendBits(kStringLiteralIdentityEncoded, kStringLiteralIdentityEncodedSize); + AppendPrefix(kStringLiteralIdentityEncoded); if (str.size() > max_string_literal_size_) return false; AppendUint32(static_cast<uint32>(str.size())); |