// 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. #ifndef QUICHE_HTTP2_HPACK_HUFFMAN_HPACK_HUFFMAN_DECODER_H_ #define QUICHE_HTTP2_HPACK_HUFFMAN_HPACK_HUFFMAN_DECODER_H_ // HpackHuffmanDecoder is an incremental decoder of strings that have been // encoded using the Huffman table defined in the HPACK spec. // By incremental, we mean that the HpackHuffmanDecoder::Decode method does // not require the entire string to be provided, and can instead decode the // string as fragments of it become available (e.g. as HPACK block fragments // are received for decoding by HpackEntryDecoder). #include <stddef.h> #include <cstdint> #include <iosfwd> #include <string> #include "absl/strings/string_view.h" #include "quiche/common/platform/api/quiche_export.h" namespace http2 { // HuffmanAccumulator is used to store bits during decoding, e.g. next N bits // that have not yet been decoded, but have been extracted from the encoded // string). An advantage of using a uint64 for the accumulator // is that it has room for the bits of the longest code plus the bits of a full // byte; that means that when adding more bits to the accumulator, it can always // be done in whole bytes. For example, if we currently have 26 bits in the // accumulator, and need more to decode the current symbol, we can add a whole // byte to the accumulator, and not have to do juggling with adding 6 bits (to // reach 30), and then keep track of the last two bits we've not been able to // add to the accumulator. HuffmanAccumulator; HuffmanAccumulatorBitCount; // HuffmanBitBuffer stores the leading edge of bits to be decoded. The high // order bit of accumulator_ is the next bit to be decoded. class QUICHE_EXPORT HuffmanBitBuffer { … }; inline std::ostream& operator<<(std::ostream& out, const HuffmanBitBuffer& v) { … } class QUICHE_EXPORT HpackHuffmanDecoder { … }; inline std::ostream& operator<<(std::ostream& out, const HpackHuffmanDecoder& v) { … } } // namespace http2 #endif // QUICHE_HTTP2_HPACK_HUFFMAN_HPACK_HUFFMAN_DECODER_H_