| Index: net/http2/hpack/decoder/hpack_entry_decoder.cc
|
| diff --git a/net/http2/hpack/decoder/hpack_entry_decoder.cc b/net/http2/hpack/decoder/hpack_entry_decoder.cc
|
| deleted file mode 100644
|
| index c47ef0cf7134f7ea19807e892755dda4cceb375c..0000000000000000000000000000000000000000
|
| --- a/net/http2/hpack/decoder/hpack_entry_decoder.cc
|
| +++ /dev/null
|
| @@ -1,233 +0,0 @@
|
| -// Copyright 2016 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/http2/hpack/decoder/hpack_entry_decoder.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/macros.h"
|
| -
|
| -namespace net {
|
| -namespace {
|
| -// Converts calls from HpackStringDecoder when decoding a header name into the
|
| -// appropriate HpackEntryDecoderListener::OnName* calls.
|
| -class NameDecoderListener {
|
| - public:
|
| - explicit NameDecoderListener(HpackEntryDecoderListener* listener)
|
| - : listener_(listener) {}
|
| - bool OnStringStart(bool huffman_encoded, size_t len) {
|
| - listener_->OnNameStart(huffman_encoded, len);
|
| - return true;
|
| - }
|
| - void OnStringData(const char* data, size_t len) {
|
| - listener_->OnNameData(data, len);
|
| - }
|
| - void OnStringEnd() { listener_->OnNameEnd(); }
|
| -
|
| - private:
|
| - HpackEntryDecoderListener* listener_;
|
| -};
|
| -
|
| -// Converts calls from HpackStringDecoder when decoding a header value into
|
| -// the appropriate HpackEntryDecoderListener::OnValue* calls.
|
| -class ValueDecoderListener {
|
| - public:
|
| - explicit ValueDecoderListener(HpackEntryDecoderListener* listener)
|
| - : listener_(listener) {}
|
| - bool OnStringStart(bool huffman_encoded, size_t len) {
|
| - listener_->OnValueStart(huffman_encoded, len);
|
| - return true;
|
| - }
|
| - void OnStringData(const char* data, size_t len) {
|
| - listener_->OnValueData(data, len);
|
| - }
|
| - void OnStringEnd() { listener_->OnValueEnd(); }
|
| -
|
| - private:
|
| - HpackEntryDecoderListener* listener_;
|
| -};
|
| -} // namespace
|
| -
|
| -// Only call Resume if the previous call (Start or Resume) returned
|
| -// kDecodeInProgress; Resume is also called from Start when it has succeeded
|
| -// in decoding the entry type and its varint.
|
| -DecodeStatus HpackEntryDecoder::Resume(DecodeBuffer* db,
|
| - HpackEntryDecoderListener* listener) {
|
| - DCHECK(db != nullptr);
|
| - DCHECK(listener != nullptr);
|
| -
|
| - DecodeStatus status;
|
| -
|
| - do {
|
| - switch (state_) {
|
| - case EntryDecoderState::kResumeDecodingType:
|
| - // entry_type_decoder_ returned kDecodeInProgress when last called.
|
| - DVLOG(1) << "kResumeDecodingType: db->Remaining=" << db->Remaining();
|
| - status = entry_type_decoder_.Resume(db);
|
| - if (status != DecodeStatus::kDecodeDone) {
|
| - return status;
|
| - }
|
| - state_ = EntryDecoderState::kDecodedType;
|
| - // FALLTHROUGH_INTENDED
|
| -
|
| - case EntryDecoderState::kDecodedType:
|
| - // entry_type_decoder_ returned kDecodeDone, now need to decide how
|
| - // to proceed.
|
| - DVLOG(1) << "kDecodedType: db->Remaining=" << db->Remaining();
|
| - if (DispatchOnType(listener)) {
|
| - // All done.
|
| - return DecodeStatus::kDecodeDone;
|
| - }
|
| - continue;
|
| -
|
| - case EntryDecoderState::kStartDecodingName:
|
| - DVLOG(1) << "kStartDecodingName: db->Remaining=" << db->Remaining();
|
| - {
|
| - NameDecoderListener ncb(listener);
|
| - status = string_decoder_.Start(db, &ncb);
|
| - }
|
| - if (status != DecodeStatus::kDecodeDone) {
|
| - // On the assumption that the status is kDecodeInProgress, set
|
| - // state_ accordingly; unnecessary if status is kDecodeError, but
|
| - // that will only happen if the varint encoding the name's length
|
| - // is too long.
|
| - state_ = EntryDecoderState::kResumeDecodingName;
|
| - return status;
|
| - }
|
| - state_ = EntryDecoderState::kStartDecodingValue;
|
| - // FALLTHROUGH_INTENDED
|
| -
|
| - case EntryDecoderState::kStartDecodingValue:
|
| - DVLOG(1) << "kStartDecodingValue: db->Remaining=" << db->Remaining();
|
| - {
|
| - ValueDecoderListener vcb(listener);
|
| - status = string_decoder_.Start(db, &vcb);
|
| - }
|
| - if (status == DecodeStatus::kDecodeDone) {
|
| - // Done with decoding the literal value, so we've reached the
|
| - // end of the header entry.
|
| - return status;
|
| - }
|
| - // On the assumption that the status is kDecodeInProgress, set
|
| - // state_ accordingly; unnecessary if status is kDecodeError, but
|
| - // that will only happen if the varint encoding the value's length
|
| - // is too long.
|
| - state_ = EntryDecoderState::kResumeDecodingValue;
|
| - return status;
|
| -
|
| - case EntryDecoderState::kResumeDecodingName:
|
| - // The literal name was split across decode buffers.
|
| - DVLOG(1) << "kResumeDecodingName: db->Remaining=" << db->Remaining();
|
| - {
|
| - NameDecoderListener ncb(listener);
|
| - status = string_decoder_.Resume(db, &ncb);
|
| - }
|
| - if (status != DecodeStatus::kDecodeDone) {
|
| - // On the assumption that the status is kDecodeInProgress, set
|
| - // state_ accordingly; unnecessary if status is kDecodeError, but
|
| - // that will only happen if the varint encoding the name's length
|
| - // is too long.
|
| - state_ = EntryDecoderState::kResumeDecodingName;
|
| - return status;
|
| - }
|
| - state_ = EntryDecoderState::kStartDecodingValue;
|
| - break;
|
| -
|
| - case EntryDecoderState::kResumeDecodingValue:
|
| - // The literal value was split across decode buffers.
|
| - DVLOG(1) << "kResumeDecodingValue: db->Remaining=" << db->Remaining();
|
| - {
|
| - ValueDecoderListener vcb(listener);
|
| - status = string_decoder_.Resume(db, &vcb);
|
| - }
|
| - if (status == DecodeStatus::kDecodeDone) {
|
| - // Done with decoding the value, therefore the entry as a whole.
|
| - return status;
|
| - }
|
| - // On the assumption that the status is kDecodeInProgress, set
|
| - // state_ accordingly; unnecessary if status is kDecodeError, but
|
| - // that will only happen if the varint encoding the value's length
|
| - // is too long.
|
| - state_ = EntryDecoderState::kResumeDecodingValue;
|
| - return status;
|
| - }
|
| - } while (true);
|
| -}
|
| -
|
| -bool HpackEntryDecoder::DispatchOnType(HpackEntryDecoderListener* listener) {
|
| - const HpackEntryType entry_type = entry_type_decoder_.entry_type();
|
| - const uint32_t varint = entry_type_decoder_.varint();
|
| - switch (entry_type) {
|
| - case HpackEntryType::kIndexedHeader:
|
| - // The entry consists solely of the entry type and varint. See:
|
| - // http://httpwg.org/specs/rfc7541.html#indexed.header.representation
|
| - listener->OnIndexedHeader(varint);
|
| - return true;
|
| -
|
| - case HpackEntryType::kIndexedLiteralHeader:
|
| - case HpackEntryType::kUnindexedLiteralHeader:
|
| - case HpackEntryType::kNeverIndexedLiteralHeader:
|
| - // The entry has a literal value, and if the varint is zero also has a
|
| - // literal name preceding the value. See:
|
| - // http://httpwg.org/specs/rfc7541.html#literal.header.representation
|
| - listener->OnStartLiteralHeader(entry_type, varint);
|
| - if (varint == 0) {
|
| - state_ = EntryDecoderState::kStartDecodingName;
|
| - } else {
|
| - state_ = EntryDecoderState::kStartDecodingValue;
|
| - }
|
| - return false;
|
| -
|
| - case HpackEntryType::kDynamicTableSizeUpdate:
|
| - // The entry consists solely of the entry type and varint. FWIW, I've
|
| - // never seen this type of entry in production (primarily browser
|
| - // traffic) so if you're designing an HPACK successor someday, consider
|
| - // dropping it or giving it a much longer prefix. See:
|
| - // http://httpwg.org/specs/rfc7541.html#encoding.context.update
|
| - listener->OnDynamicTableSizeUpdate(varint);
|
| - return true;
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return true;
|
| -}
|
| -
|
| -void HpackEntryDecoder::OutputDebugString(std::ostream& out) const {
|
| - out << "HpackEntryDecoder(state=" << state_ << ", " << entry_type_decoder_
|
| - << ", " << string_decoder_ << ")";
|
| -}
|
| -
|
| -std::string HpackEntryDecoder::DebugString() const {
|
| - std::stringstream s;
|
| - s << *this;
|
| - return s.str();
|
| -}
|
| -
|
| -std::ostream& operator<<(std::ostream& out, const HpackEntryDecoder& v) {
|
| - v.OutputDebugString(out);
|
| - return out;
|
| -}
|
| -
|
| -std::ostream& operator<<(std::ostream& out,
|
| - HpackEntryDecoder::EntryDecoderState state) {
|
| - typedef HpackEntryDecoder::EntryDecoderState EntryDecoderState;
|
| - switch (state) {
|
| - case EntryDecoderState::kResumeDecodingType:
|
| - return out << "kResumeDecodingType";
|
| - case EntryDecoderState::kDecodedType:
|
| - return out << "kDecodedType";
|
| - case EntryDecoderState::kStartDecodingName:
|
| - return out << "kStartDecodingName";
|
| - case EntryDecoderState::kResumeDecodingName:
|
| - return out << "kResumeDecodingName";
|
| - case EntryDecoderState::kStartDecodingValue:
|
| - return out << "kStartDecodingValue";
|
| - case EntryDecoderState::kResumeDecodingValue:
|
| - return out << "kResumeDecodingValue";
|
| - }
|
| - return out << static_cast<int>(state);
|
| -}
|
| -
|
| -} // namespace net
|
|
|