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 16 namespace net { 17 18 // An HpackPrefix signifies |bits| stored in the top |bit_size| bits 19 // of an octet. 20 struct HpackPrefix { 21 uint8 bits; 22 size_t bit_size; 23 }; 24 25 // Represents a symbol and its Huffman code (stored in most-significant bits). 26 struct 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. 34 struct 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 41 class HpackHuffmanTable; 42 class HpackStaticTable; 43 44 const uint32 kDefaultHeaderTableSizeSetting = 4096; 45 46 // Largest string literal an HpackDecoder/HpackEncoder will attempt to process 47 // before returning an error. 48 const 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. 53 const uint32 kMaxDecodeBufferSize = 32 * 1024; 54 55 // 6.2: Flag for a string literal that is stored unmodified (i.e., 56 // without Huffman encoding). 57 const HpackPrefix kStringLiteralIdentityEncoded = { 0x0, 1 }; 58 59 // 6.2: Flag for a Huffman-coded string literal. 60 const HpackPrefix kStringLiteralHuffmanEncoded = { 0x1, 1 }; 61 62 // 7.1: Opcode for an indexed header field. 63 const HpackPrefix kIndexedOpcode = { 0x1, 1 }; 64 65 // 7.2.1: Opcode for a literal header field with incremental indexing. 66 const HpackPrefix kLiteralIncrementalIndexOpcode = { 0x1, 2 }; 67 68 // 7.2.2: Opcode for a literal header field without indexing. 69 const HpackPrefix kLiteralNoIndexOpcode = { 0x0, 4 }; 70 71 // 7.2.3: Opcode for a literal header field which is never indexed. 72 const 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. 76 const HpackPrefix kHeaderTableSizeUpdateOpcode = { 0x1, 3 }; 77 78 // Returns symbol code table from "Appendix C. Huffman Code". 79 NET_EXPORT_PRIVATE std::vector<HpackHuffmanSymbol> HpackHuffmanCode(); 80 81 // Returns static table from "Appendix B. Static Table Definition". 82 NET_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. 87 NET_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. 92 NET_EXPORT_PRIVATE const HpackStaticTable& ObtainHpackStaticTable(); 93 94 // Pseudo-headers start with a colon. (HTTP2 8.1.2.1., HPACK 3.1.) 95 const char kPseudoHeaderPrefix = ':'; 96 97 } // namespace net 98 99 #endif // NET_SPDY_HPACK_CONSTANTS_H_ 100