summaryrefslogtreecommitdiffstats
path: root/net/spdy/hpack_output_stream.cc
diff options
context:
space:
mode:
authorjgraettinger@chromium.org <jgraettinger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-30 22:44:20 +0000
committerjgraettinger@chromium.org <jgraettinger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-30 22:44:20 +0000
commite99d1287191bfdaad3448b7080b46ae39fb6c97a (patch)
tree698ac0b24d0fcb795aa08cc5ab18f61dda751616 /net/spdy/hpack_output_stream.cc
parent630e8545ebed7170f0b0d263c9312a0594710a58 (diff)
downloadchromium_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.cc29
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()));