| Index: net/spdy/hpack_decoder.cc
|
| diff --git a/net/spdy/hpack_decoder.cc b/net/spdy/hpack_decoder.cc
|
| index abd579ad007049be6730eccd728e881109da6fa2..6ce5d60ca69859f060cf3908c3a5f236c98c2dc9 100644
|
| --- a/net/spdy/hpack_decoder.cc
|
| +++ b/net/spdy/hpack_decoder.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "net/spdy/hpack_decoder.h"
|
|
|
| +#include <utility>
|
| +
|
| #include "base/basictypes.h"
|
| #include "base/logging.h"
|
| #include "net/spdy/hpack_constants.h"
|
| @@ -16,10 +18,6 @@ using std::string;
|
|
|
| namespace {
|
|
|
| -const uint8 kNoState = 0;
|
| -// Set on entries added to the reference set during this decoding.
|
| -const uint8 kReferencedThisEncoding = 1;
|
| -
|
| const char kCookieKey[] = "cookie";
|
|
|
| } // namespace
|
| @@ -56,21 +54,6 @@ bool HpackDecoder::HandleControlFrameHeadersComplete(SpdyStreamId id) {
|
| }
|
| headers_block_buffer_.clear();
|
|
|
| - // Emit everything in the reference set that hasn't already been emitted.
|
| - // Also clear entry state for the next decoded headers block.
|
| - // TODO(jgraettinger): We may need to revisit the order in which headers
|
| - // are emitted (b/14051713).
|
| - for (HpackHeaderTable::OrderedEntrySet::const_iterator it =
|
| - header_table_.reference_set().begin();
|
| - it != header_table_.reference_set().end(); ++it) {
|
| - HpackEntry* entry = *it;
|
| -
|
| - if (entry->state() == kNoState) {
|
| - HandleHeaderRepresentation(entry->name(), entry->value());
|
| - } else {
|
| - entry->set_state(kNoState);
|
| - }
|
| - }
|
| // Emit the Cookie header, if any crumbles were encountered.
|
| if (!cookie_value_.empty()) {
|
| decoded_block_[kCookieKey] = cookie_value_;
|
| @@ -121,31 +104,24 @@ bool HpackDecoder::DecodeNextOpcode(HpackInputStream* input_stream) {
|
| return DecodeNextLiteralHeader(input_stream, false);
|
| }
|
| // Implements 4.4: Encoding context update.
|
| - if (input_stream->MatchPrefixAndConsume(kEncodingContextOpcode)) {
|
| - return DecodeNextContextUpdate(input_stream);
|
| + if (input_stream->MatchPrefixAndConsume(kHeaderTableSizeUpdateOpcode)) {
|
| + return DecodeNextHeaderTableSizeUpdate(input_stream);
|
| }
|
| // Unrecognized opcode.
|
| return false;
|
| }
|
|
|
| -bool HpackDecoder::DecodeNextContextUpdate(HpackInputStream* input_stream) {
|
| - if (input_stream->MatchPrefixAndConsume(kEncodingContextEmptyReferenceSet)) {
|
| - header_table_.ClearReferenceSet();
|
| - return true;
|
| +bool HpackDecoder::DecodeNextHeaderTableSizeUpdate(
|
| + HpackInputStream* input_stream) {
|
| + uint32 size = 0;
|
| + if (!input_stream->DecodeNextUint32(&size)) {
|
| + return false;
|
| }
|
| - if (input_stream->MatchPrefixAndConsume(kEncodingContextNewMaximumSize)) {
|
| - uint32 size = 0;
|
| - if (!input_stream->DecodeNextUint32(&size)) {
|
| - return false;
|
| - }
|
| - if (size > header_table_.settings_size_bound()) {
|
| - return false;
|
| - }
|
| - header_table_.SetMaxSize(size);
|
| - return true;
|
| + if (size > header_table_.settings_size_bound()) {
|
| + return false;
|
| }
|
| - // Unrecognized encoding context update.
|
| - return false;
|
| + header_table_.SetMaxSize(size);
|
| + return true;
|
| }
|
|
|
| bool HpackDecoder::DecodeNextIndexedHeader(HpackInputStream* input_stream) {
|
| @@ -157,22 +133,7 @@ bool HpackDecoder::DecodeNextIndexedHeader(HpackInputStream* input_stream) {
|
| if (entry == NULL)
|
| return false;
|
|
|
| - if (entry->IsStatic()) {
|
| - HandleHeaderRepresentation(entry->name(), entry->value());
|
| -
|
| - HpackEntry* new_entry = header_table_.TryAddEntry(
|
| - entry->name(), entry->value());
|
| - if (new_entry) {
|
| - header_table_.Toggle(new_entry);
|
| - new_entry->set_state(kReferencedThisEncoding);
|
| - }
|
| - } else {
|
| - entry->set_state(kNoState);
|
| - if (header_table_.Toggle(entry)) {
|
| - HandleHeaderRepresentation(entry->name(), entry->value());
|
| - entry->set_state(kReferencedThisEncoding);
|
| - }
|
| - }
|
| + HandleHeaderRepresentation(entry->name(), entry->value());
|
| return true;
|
| }
|
|
|
| @@ -191,11 +152,7 @@ bool HpackDecoder::DecodeNextLiteralHeader(HpackInputStream* input_stream,
|
| if (!should_index)
|
| return true;
|
|
|
| - HpackEntry* new_entry = header_table_.TryAddEntry(name, value);
|
| - if (new_entry) {
|
| - header_table_.Toggle(new_entry);
|
| - new_entry->set_state(kReferencedThisEncoding);
|
| - }
|
| + ignore_result(header_table_.TryAddEntry(name, value));
|
| return true;
|
| }
|
|
|
|
|