1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef NET_SPDY_HPACK_CONSTANTS_H_ 6#define NET_SPDY_HPACK_CONSTANTS_H_ 7 8#include <vector> 9 10#include "base/basictypes.h" 11#include "net/base/net_export.h" 12 13// All section references below are to 14// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-08 15 16namespace net { 17 18// An HpackPrefix signifies |bits| stored in the top |bit_size| bits 19// of an octet. 20struct HpackPrefix { 21 uint8 bits; 22 size_t bit_size; 23}; 24 25// Represents a symbol and its Huffman code (stored in most-significant bits). 26struct HpackHuffmanSymbol { 27 uint32 code; 28 uint8 length; 29 uint16 id; 30}; 31 32// An entry in the static table. Must be a POD in order to avoid static 33// initializers, i.e. no user-defined constructors or destructors. 34struct HpackStaticEntry { 35 const char* const name; 36 const size_t name_len; 37 const char* const value; 38 const size_t value_len; 39}; 40 41class HpackHuffmanTable; 42class HpackStaticTable; 43 44const uint32 kDefaultHeaderTableSizeSetting = 4096; 45 46// Largest string literal an HpackDecoder/HpackEncoder will attempt to process 47// before returning an error. 48const uint32 kDefaultMaxStringLiteralSize = 16 * 1024; 49 50// Maximum amount of encoded header buffer HpackDecoder will retain before 51// returning an error. 52// TODO(jgraettinger): Remove with SpdyHeadersHandlerInterface switch. 53const uint32 kMaxDecodeBufferSize = 32 * 1024; 54 55// 6.2: Flag for a string literal that is stored unmodified (i.e., 56// without Huffman encoding). 57const HpackPrefix kStringLiteralIdentityEncoded = { 0x0, 1 }; 58 59// 6.2: Flag for a Huffman-coded string literal. 60const HpackPrefix kStringLiteralHuffmanEncoded = { 0x1, 1 }; 61 62// 7.1: Opcode for an indexed header field. 63const HpackPrefix kIndexedOpcode = { 0x1, 1 }; 64 65// 7.2.1: Opcode for a literal header field with incremental indexing. 66const HpackPrefix kLiteralIncrementalIndexOpcode = { 0x1, 2 }; 67 68// 7.2.2: Opcode for a literal header field without indexing. 69const HpackPrefix kLiteralNoIndexOpcode = { 0x0, 4 }; 70 71// 7.2.3: Opcode for a literal header field which is never indexed. 72const HpackPrefix kLiteralNeverIndexOpcode = { 0x1, 4 }; 73 74// 7.3: Opcode for maximum header table size update. Begins a varint-encoded 75// table size with a 5-bit prefix. 76const HpackPrefix kHeaderTableSizeUpdateOpcode = { 0x1, 3 }; 77 78// Returns symbol code table from "Appendix C. Huffman Code". 79NET_EXPORT_PRIVATE std::vector<HpackHuffmanSymbol> HpackHuffmanCode(); 80 81// Returns static table from "Appendix B. Static Table Definition". 82NET_EXPORT_PRIVATE std::vector<HpackStaticEntry> HpackStaticTableVector(); 83 84// Returns a HpackHuffmanTable instance initialized with |kHpackHuffmanCode|. 85// The instance is read-only, has static lifetime, and is safe to share amoung 86// threads. This function is thread-safe. 87NET_EXPORT_PRIVATE const HpackHuffmanTable& ObtainHpackHuffmanTable(); 88 89// Returns a HpackStaticTable instance initialized with |kHpackStaticTable|. 90// The instance is read-only, has static lifetime, and is safe to share amoung 91// threads. This function is thread-safe. 92NET_EXPORT_PRIVATE const HpackStaticTable& ObtainHpackStaticTable(); 93 94// Pseudo-headers start with a colon. (HTTP2 8.1.2.1., HPACK 3.1.) 95const char kPseudoHeaderPrefix = ':'; 96 97} // namespace net 98 99#endif // NET_SPDY_HPACK_CONSTANTS_H_ 100