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-07 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 class HpackHuffmanTable; 33 34 const uint32 kDefaultHeaderTableSizeSetting = 4096; 35 36 // Largest string literal an HpackDecoder/HpackEncoder will attempt to process 37 // before returning an error. 38 const uint32 kDefaultMaxStringLiteralSize = 16 * 1024; 39 40 // Maximum amount of encoded header buffer HpackDecoder will retain before 41 // returning an error. 42 // TODO(jgraettinger): Remove with SpdyHeadersHandlerInterface switch. 43 const uint32 kMaxDecodeBufferSize = 32 * 1024; 44 45 // 4.1.2: Flag for a string literal that is stored unmodified (i.e., 46 // without Huffman encoding). 47 const HpackPrefix kStringLiteralIdentityEncoded = { 0x0, 1 }; 48 49 // 4.1.2: Flag for a Huffman-coded string literal. 50 const HpackPrefix kStringLiteralHuffmanEncoded = { 0x1, 1 }; 51 52 // 4.2: Opcode for an indexed header field. 53 const HpackPrefix kIndexedOpcode = { 0x1, 1 }; 54 55 // 4.3.1: Opcode for a literal header field with incremental indexing. 56 const HpackPrefix kLiteralIncrementalIndexOpcode = { 0x1, 2 }; 57 58 // 4.3.2: Opcode for a literal header field without indexing. 59 const HpackPrefix kLiteralNoIndexOpcode = { 0x0, 4 }; 60 61 // 4.3.3: Opcode for a literal header field which is never indexed. 62 const HpackPrefix kLiteralNeverIndexOpcode = { 0x1, 4 }; 63 64 // 4.4: Opcode for an encoding context update. 65 const HpackPrefix kEncodingContextOpcode = { 0x1, 3 }; 66 67 // 4.4: Flag following an |kEncodingContextOpcode|, which indicates 68 // the reference set should be cleared. 69 const HpackPrefix kEncodingContextEmptyReferenceSet = { 0x10, 5 }; 70 71 // 4.4: Flag following an |kEncodingContextOpcode|, which indicates 72 // the encoder is using a new maximum headers table size. Begins a 73 // varint-encoded table size with a 4-bit prefix. 74 const HpackPrefix kEncodingContextNewMaximumSize = { 0x0, 1 }; 75 76 // Returns symbol code table from "Appendix C. Huffman Codes". 77 NET_EXPORT_PRIVATE std::vector<HpackHuffmanSymbol> HpackHuffmanCode(); 78 79 // Returns a HpackHuffmanTable instance initialized with |kHpackHuffmanCode|. 80 // The instance is read-only, has static lifetime, and is safe to share amoung 81 // threads. This function is thread-safe. 82 NET_EXPORT_PRIVATE const HpackHuffmanTable& ObtainHpackHuffmanTable(); 83 84 } // namespace net 85 86 #endif // NET_SPDY_HPACK_CONSTANTS_H_ 87