| Index: net/http2/hpack/decoder/hpack_varint_decoder.h
 | 
| diff --git a/net/http2/hpack/decoder/hpack_varint_decoder.h b/net/http2/hpack/decoder/hpack_varint_decoder.h
 | 
| deleted file mode 100644
 | 
| index b110fad23a983b40b0e7974e56bd43ca9bbf56e1..0000000000000000000000000000000000000000
 | 
| --- a/net/http2/hpack/decoder/hpack_varint_decoder.h
 | 
| +++ /dev/null
 | 
| @@ -1,181 +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.
 | 
| -
 | 
| -// HpackVarintDecoder decodes HPACK variable length unsigned integers. These
 | 
| -// integers are used to identify static or dynamic table index entries, to
 | 
| -// specify string lengths, and to update the size limit of the dynamic table.
 | 
| -//
 | 
| -// The caller will need to validate that the decoded value is in an acceptable
 | 
| -// range.
 | 
| -//
 | 
| -// In order to support naive encoders (i.e. which always output 5 extension
 | 
| -// bytes for a uint32 that is >= prefix_mask), the decoder supports an an
 | 
| -// encoding with up to 5 extension bytes, and a maximum value of 268,435,582
 | 
| -// (4 "full" extension bytes plus the maximum for a prefix, 127). It could be
 | 
| -// modified to support a lower maximum value (by requiring that extensions bytes
 | 
| -// be "empty"), or a larger value if valuable for some reason I can't see.
 | 
| -//
 | 
| -// For details of the encoding, see:
 | 
| -//        http://httpwg.org/specs/rfc7541.html#integer.representation
 | 
| -//
 | 
| -// TODO(jamessynge): Consider dropping support for encodings of more than 4
 | 
| -// bytes, including the prefix byte, as in practice we only see at most 3 bytes,
 | 
| -// and 4 bytes would cover any desire to support large (but not ridiculously
 | 
| -// large) header values.
 | 
| -
 | 
| -#ifndef NET_HTTP2_HPACK_DECODER_HPACK_VARINT_DECODER_H_
 | 
| -#define NET_HTTP2_HPACK_DECODER_HPACK_VARINT_DECODER_H_
 | 
| -
 | 
| -#include <string>
 | 
| -
 | 
| -#include "base/logging.h"
 | 
| -#include "net/base/net_export.h"
 | 
| -#include "net/http2/decoder/decode_buffer.h"
 | 
| -#include "net/http2/decoder/decode_status.h"
 | 
| -
 | 
| -namespace net {
 | 
| -// Decodes an HPACK variable length unsigned integer, in a resumable fashion
 | 
| -// so it can handle running out of input in the DecodeBuffer. Call Start or
 | 
| -// StartExtended the first time (when decoding the byte that contains the
 | 
| -// prefix), then call Resume later if it is necessary to resume. When done,
 | 
| -// call value() to retrieve the decoded value.
 | 
| -//
 | 
| -// No constructor or destructor. Holds no resources, so destruction isn't
 | 
| -// needed. Start and StartExtended handles the initialization of member
 | 
| -// variables. This is necessary in order for HpackVarintDecoder to be part
 | 
| -// of a union.
 | 
| -class NET_EXPORT_PRIVATE HpackVarintDecoder {
 | 
| - public:
 | 
| -  // |prefix_value| is the first byte of the encoded varint.
 | 
| -  // |prefix_mask| is the mask of the valid bits, i.e. without the top 1 to 4
 | 
| -  // high-bits set, as appropriate for the item being decoded; must be a
 | 
| -  // contiguous sequence of set bits, starting with the low-order bits.
 | 
| -  DecodeStatus Start(uint8_t prefix_value,
 | 
| -                     uint8_t prefix_mask,
 | 
| -                     DecodeBuffer* db) {
 | 
| -    DCHECK_LE(15, prefix_mask) << std::hex << prefix_mask;
 | 
| -    DCHECK_LE(prefix_mask, 127) << std::hex << prefix_mask;
 | 
| -    // Confirm that |prefix_mask| is a contiguous sequence of bits.
 | 
| -    DCHECK_EQ(0, (prefix_mask + 1) & prefix_mask) << std::hex << prefix_mask;
 | 
| -
 | 
| -    // Ignore the bits that aren't a part of the prefix of the varint.
 | 
| -    value_ = prefix_value & prefix_mask;
 | 
| -
 | 
| -    if (value_ < prefix_mask) {
 | 
| -      MarkDone();
 | 
| -      return DecodeStatus::kDecodeDone;
 | 
| -    }
 | 
| -
 | 
| -    offset_ = 0;
 | 
| -    return Resume(db);
 | 
| -  }
 | 
| -
 | 
| -  // The caller has already determined that the encoding requires multiple
 | 
| -  // bytes, i.e. that the 4 to 7 low-order bits (the number determined by the
 | 
| -  // prefix length, a value not passed into this function) of the first byte are
 | 
| -  // are all 1. The caller passes in |prefix_mask|, which is 2^prefix_length-1.
 | 
| -  DecodeStatus StartExtended(uint8_t prefix_mask, DecodeBuffer* db) {
 | 
| -    DCHECK_LE(15, prefix_mask) << std::hex << prefix_mask;
 | 
| -    DCHECK_LE(prefix_mask, 127) << std::hex << prefix_mask;
 | 
| -    // Confirm that |prefix_mask| is a contiguous sequence of bits.
 | 
| -    DCHECK_EQ(0, prefix_mask & (prefix_mask + 1)) << std::hex << prefix_mask;
 | 
| -
 | 
| -    value_ = prefix_mask;
 | 
| -    offset_ = 0;
 | 
| -    return Resume(db);
 | 
| -  }
 | 
| -
 | 
| -  // Resume decoding a variable length integer after an earlier
 | 
| -  // call to Start or StartExtended returned kDecodeInProgress.
 | 
| -  DecodeStatus Resume(DecodeBuffer* db) {
 | 
| -    CheckNotDone();
 | 
| -    do {
 | 
| -      if (db->Empty()) {
 | 
| -        return DecodeStatus::kDecodeInProgress;
 | 
| -      }
 | 
| -      uint8_t byte = db->DecodeUInt8();
 | 
| -      value_ += (byte & 0x7f) << offset_;
 | 
| -      if ((byte & 0x80) == 0) {
 | 
| -        if (offset_ < MaxOffset() || byte == 0) {
 | 
| -          MarkDone();
 | 
| -          return DecodeStatus::kDecodeDone;
 | 
| -        }
 | 
| -        break;
 | 
| -      }
 | 
| -      offset_ += 7;
 | 
| -    } while (offset_ <= MaxOffset());
 | 
| -    DLOG(WARNING) << "Variable length int encoding is too large or too long. "
 | 
| -                  << DebugString();
 | 
| -    MarkDone();
 | 
| -    return DecodeStatus::kDecodeError;
 | 
| -  }
 | 
| -
 | 
| -  uint32_t value() const {
 | 
| -    CheckDone();
 | 
| -    return value_;
 | 
| -  }
 | 
| -
 | 
| -  // This supports optimizations for the case of a varint with zero extension
 | 
| -  // bytes, where the handling of the prefix is done by the caller.
 | 
| -  void set_value(uint32_t v) {
 | 
| -    MarkDone();
 | 
| -    value_ = v;
 | 
| -  }
 | 
| -
 | 
| -  // All the public methods below are for supporting assertions and tests.
 | 
| -
 | 
| -  std::string DebugString() const;
 | 
| -
 | 
| -  // For benchmarking, these methods ensure the decoder
 | 
| -  // is NOT inlined into the caller.
 | 
| -  DecodeStatus StartForTest(uint8_t prefix_value,
 | 
| -                            uint8_t prefix_mask,
 | 
| -                            DecodeBuffer* db);
 | 
| -  DecodeStatus StartExtendedForTest(uint8_t prefix_mask, DecodeBuffer* db);
 | 
| -  DecodeStatus ResumeForTest(DecodeBuffer* db);
 | 
| -
 | 
| -  static constexpr uint32_t MaxExtensionBytes() { return 5; }
 | 
| -
 | 
| -  // Returns the highest value with the specified number of extension bytes and
 | 
| -  // the specified prefix length (bits).
 | 
| -  static uint64_t constexpr HiValueOfExtensionBytes(uint32_t extension_bytes,
 | 
| -                                                    uint32_t prefix_length) {
 | 
| -    return (1 << prefix_length) - 2 +
 | 
| -           (extension_bytes == 0 ? 0 : (1LLU << (extension_bytes * 7)));
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  // Protection in case Resume is called when it shouldn't be.
 | 
| -  void MarkDone() {
 | 
| -#ifndef NDEBUG
 | 
| -    // We support up to 5 extension bytes, so offset_ should never be > 28 when
 | 
| -    // it makes sense to call Resume().
 | 
| -    offset_ = MaxOffset() + 7;
 | 
| -#endif
 | 
| -  }
 | 
| -  void CheckNotDone() const {
 | 
| -#ifndef NDEBUG
 | 
| -    DCHECK_LE(offset_, MaxOffset());
 | 
| -#endif
 | 
| -  }
 | 
| -  void CheckDone() const {
 | 
| -#ifndef NDEBUG
 | 
| -    DCHECK_GT(offset_, MaxOffset());
 | 
| -#endif
 | 
| -  }
 | 
| -  static constexpr uint32_t MaxOffset() {
 | 
| -    return 7 * (MaxExtensionBytes() - 1);
 | 
| -  }
 | 
| -
 | 
| -  // These fields are initialized just to keep ASAN happy about reading
 | 
| -  // them from DebugString().
 | 
| -  uint32_t value_ = 0;
 | 
| -  uint32_t offset_ = 0;
 | 
| -};
 | 
| -
 | 
| -std::ostream& operator<<(std::ostream& out, const HpackVarintDecoder& v);
 | 
| -
 | 
| -}  // namespace net
 | 
| -
 | 
| -#endif  // NET_HTTP2_HPACK_DECODER_HPACK_VARINT_DECODER_H_
 | 
| 
 |