// 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. In HPACK, // 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. // In QPACK, in addition to these uses, these integers also identify streams. // // The caller will need to validate that the decoded value is in an acceptable // range. // // For details of the encoding, see: // http://httpwg.org/specs/rfc7541.html#integer.representation // // HpackVarintDecoder supports decoding any integer that can be represented on // uint64_t, thereby exceeding the requirements for QPACK: "QPACK // implementations MUST be able to decode integers up to 62 bits long." See // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.5.1.1 // // This decoder supports at most 10 extension bytes (bytes following the prefix, // also called continuation bytes). An encoder is allowed to zero pad the // encoded integer on the left, thereby increasing the number of extension // bytes. If an encoder uses so much padding that the number of extension bytes // exceeds the limit, then this decoder signals an error. #ifndef QUICHE_HTTP2_HPACK_VARINT_HPACK_VARINT_DECODER_H_ #define QUICHE_HTTP2_HPACK_VARINT_HPACK_VARINT_DECODER_H_ #include <cstdint> #include <limits> #include <string> #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/decode_status.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/platform/api/quiche_logging.h" namespace http2 { // Sentinel value for |HpackVarintDecoder::offset_| to signify that decoding is // completed. Only used in debug builds. #ifndef NDEBUG const uint8_t kHpackVarintDecoderOffsetDone = …; #endif // 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 QUICHE_EXPORT HpackVarintDecoder { … }; } // namespace http2 #endif // QUICHE_HTTP2_HPACK_VARINT_HPACK_VARINT_DECODER_H_