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