Index: net/spdy/hpack_decoder.cc |
diff --git a/net/spdy/hpack_decoder.cc b/net/spdy/hpack_decoder.cc |
deleted file mode 100644 |
index a5852ffa467a5f02dc8273253af6538589d419d2..0000000000000000000000000000000000000000 |
--- a/net/spdy/hpack_decoder.cc |
+++ /dev/null |
@@ -1,206 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/spdy/hpack_decoder.h" |
- |
-#include "base/basictypes.h" |
-#include "base/logging.h" |
-#include "net/spdy/hpack_constants.h" |
-#include "net/spdy/hpack_output_stream.h" |
- |
-namespace net { |
- |
-using base::StringPiece; |
-using std::string; |
- |
-namespace { |
- |
-const char kCookieKey[] = "cookie"; |
- |
-} // namespace |
- |
-HpackDecoder::HpackDecoder(const HpackHuffmanTable& table) |
- : max_string_literal_size_(kDefaultMaxStringLiteralSize), |
- regular_header_seen_(false), |
- huffman_table_(table) {} |
- |
-HpackDecoder::~HpackDecoder() {} |
- |
-bool HpackDecoder::HandleControlFrameHeadersData(SpdyStreamId id, |
- const char* headers_data, |
- size_t headers_data_length) { |
- decoded_block_.clear(); |
- |
- size_t new_size = headers_block_buffer_.size() + headers_data_length; |
- if (new_size > kMaxDecodeBufferSize) { |
- return false; |
- } |
- headers_block_buffer_.insert(headers_block_buffer_.end(), |
- headers_data, |
- headers_data + headers_data_length); |
- return true; |
-} |
- |
-bool HpackDecoder::HandleControlFrameHeadersComplete(SpdyStreamId id) { |
- HpackInputStream input_stream(max_string_literal_size_, |
- headers_block_buffer_); |
- regular_header_seen_ = false; |
- while (input_stream.HasMoreData()) { |
- if (!DecodeNextOpcode(&input_stream)) { |
- headers_block_buffer_.clear(); |
- return false; |
- } |
- } |
- headers_block_buffer_.clear(); |
- |
- // Emit the Cookie header, if any crumbles were encountered. |
- if (!cookie_value_.empty()) { |
- decoded_block_[kCookieKey] = cookie_value_; |
- cookie_value_.clear(); |
- } |
- return true; |
-} |
- |
-bool HpackDecoder::HandleHeaderRepresentation(StringPiece name, |
- StringPiece value) { |
- typedef std::pair<std::map<string, string>::iterator, bool> InsertResult; |
- |
- // Fail if pseudo-header follows regular header. |
- if (name.size() > 0) { |
- if (name[0] == kPseudoHeaderPrefix) { |
- if (regular_header_seen_) return false; |
- } else { |
- regular_header_seen_ = true; |
- } |
- } |
- |
- if (name == kCookieKey) { |
- if (cookie_value_.empty()) { |
- cookie_value_.assign(value.data(), value.size()); |
- } else { |
- cookie_value_ += "; "; |
- cookie_value_.insert(cookie_value_.end(), value.begin(), value.end()); |
- } |
- } else { |
- InsertResult result = decoded_block_.insert( |
- std::make_pair(name.as_string(), value.as_string())); |
- if (!result.second) { |
- result.first->second.push_back('\0'); |
- result.first->second.insert(result.first->second.end(), |
- value.begin(), |
- value.end()); |
- } |
- } |
- return true; |
-} |
- |
-bool HpackDecoder::DecodeNextOpcode(HpackInputStream* input_stream) { |
- // Implements 7.1: Indexed Header Field Representation. |
- if (input_stream->MatchPrefixAndConsume(kIndexedOpcode)) { |
- return DecodeNextIndexedHeader(input_stream); |
- } |
- // Implements 7.2.1: Literal Header Field with Incremental Indexing. |
- if (input_stream->MatchPrefixAndConsume(kLiteralIncrementalIndexOpcode)) { |
- return DecodeNextLiteralHeader(input_stream, true); |
- } |
- // Implements 7.2.2: Literal Header Field without Indexing. |
- if (input_stream->MatchPrefixAndConsume(kLiteralNoIndexOpcode)) { |
- return DecodeNextLiteralHeader(input_stream, false); |
- } |
- // Implements 7.2.3: Literal Header Field never Indexed. |
- // TODO(jgraettinger): Preserve the never-indexed bit. |
- if (input_stream->MatchPrefixAndConsume(kLiteralNeverIndexOpcode)) { |
- return DecodeNextLiteralHeader(input_stream, false); |
- } |
- // Implements 7.3: Header Table Size Update. |
- if (input_stream->MatchPrefixAndConsume(kHeaderTableSizeUpdateOpcode)) { |
- return DecodeNextHeaderTableSizeUpdate(input_stream); |
- } |
- // Unrecognized opcode. |
- return false; |
-} |
- |
-bool HpackDecoder::DecodeNextHeaderTableSizeUpdate( |
- HpackInputStream* input_stream) { |
- 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; |
-} |
- |
-bool HpackDecoder::DecodeNextIndexedHeader(HpackInputStream* input_stream) { |
- uint32 index = 0; |
- if (!input_stream->DecodeNextUint32(&index)) |
- return false; |
- |
- const HpackEntry* entry = header_table_.GetByIndex(index); |
- if (entry == NULL) |
- return false; |
- |
- return HandleHeaderRepresentation(entry->name(), entry->value()); |
-} |
- |
-bool HpackDecoder::DecodeNextLiteralHeader(HpackInputStream* input_stream, |
- bool should_index) { |
- StringPiece name; |
- if (!DecodeNextName(input_stream, &name)) |
- return false; |
- |
- StringPiece value; |
- if (!DecodeNextStringLiteral(input_stream, false, &value)) |
- return false; |
- |
- if (!HandleHeaderRepresentation(name, value)) return false; |
- |
- if (!should_index) |
- return true; |
- |
- ignore_result(header_table_.TryAddEntry(name, value)); |
- return true; |
-} |
- |
-bool HpackDecoder::DecodeNextName( |
- HpackInputStream* input_stream, StringPiece* next_name) { |
- uint32 index_or_zero = 0; |
- if (!input_stream->DecodeNextUint32(&index_or_zero)) |
- return false; |
- |
- if (index_or_zero == 0) |
- return DecodeNextStringLiteral(input_stream, true, next_name); |
- |
- const HpackEntry* entry = header_table_.GetByIndex(index_or_zero); |
- if (entry == NULL) { |
- return false; |
- } else if (entry->IsStatic()) { |
- *next_name = entry->name(); |
- } else { |
- // |entry| could be evicted as part of this insertion. Preemptively copy. |
- key_buffer_.assign(entry->name()); |
- *next_name = key_buffer_; |
- } |
- return true; |
-} |
- |
-bool HpackDecoder::DecodeNextStringLiteral(HpackInputStream* input_stream, |
- bool is_key, |
- StringPiece* output) { |
- if (input_stream->MatchPrefixAndConsume(kStringLiteralHuffmanEncoded)) { |
- string* buffer = is_key ? &key_buffer_ : &value_buffer_; |
- bool result = input_stream->DecodeNextHuffmanString(huffman_table_, buffer); |
- *output = StringPiece(*buffer); |
- return result; |
- } else if (input_stream->MatchPrefixAndConsume( |
- kStringLiteralIdentityEncoded)) { |
- return input_stream->DecodeNextIdentityString(output); |
- } else { |
- return false; |
- } |
-} |
- |
-} // namespace net |