• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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