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_ |