blob: 30f0d469e38b01580d1be6eaa7b9b57a7ee5448a [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Craig Tiller06059952015-02-18 08:34:56 -08003 * Copyright 2015, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34#include "src/core/transport/chttp2/hpack_parser.h"
Craig Tiller3719f072015-06-12 17:19:51 -070035#include "src/core/transport/chttp2/internal.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
37#include <stddef.h>
38#include <string.h>
39#include <assert.h>
40
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080041#include <grpc/support/alloc.h>
42#include <grpc/support/log.h>
43#include <grpc/support/port_platform.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080044#include <grpc/support/useful.h>
45
Craig Tiller9d35a1f2015-11-02 14:16:12 -080046#include "src/core/profiling/timers.h"
47#include "src/core/support/string.h"
48#include "src/core/transport/chttp2/bin_encoder.h"
49
Craig Tillera82950e2015-09-22 12:33:20 -070050typedef enum {
ctiller33023c42014-12-12 16:28:33 -080051 NOT_BINARY,
52 B64_BYTE0,
53 B64_BYTE1,
54 B64_BYTE2,
55 B64_BYTE3
56} binary_state;
57
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080058/* How parsing works:
59
60 The parser object keeps track of a function pointer which represents the
61 current parse state.
62
63 Each time new bytes are presented, we call into the current state, which
64 recursively parses until all bytes in the given chunk are exhausted.
65
66 The parse state that terminates then saves its function pointer to be the
67 current state so that it can resume when more bytes are available.
68
69 It's expected that most optimizing compilers will turn this code into
70 a set of indirect jumps, and so not waste stack space. */
71
72/* forward declarations for parsing states */
Craig Tillera82950e2015-09-22 12:33:20 -070073static int parse_begin(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
74 const gpr_uint8 *end);
75static int parse_error(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
76 const gpr_uint8 *end);
Craig Tiller027a74c2015-11-10 08:37:46 +000077static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
Craig Tiller3c53bb22015-11-10 14:24:36 +000078 const gpr_uint8 *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080079
Craig Tillera82950e2015-09-22 12:33:20 -070080static int parse_string_prefix(grpc_chttp2_hpack_parser *p,
81 const gpr_uint8 *cur, const gpr_uint8 *end);
82static int parse_key_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
83 const gpr_uint8 *end);
84static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
85 const gpr_uint8 *cur,
86 const gpr_uint8 *end);
87static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p,
88 const gpr_uint8 *cur,
89 const gpr_uint8 *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080090
Craig Tillera82950e2015-09-22 12:33:20 -070091static int parse_value0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
92 const gpr_uint8 *end);
93static int parse_value1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
94 const gpr_uint8 *end);
95static int parse_value2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
96 const gpr_uint8 *end);
97static int parse_value3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
98 const gpr_uint8 *end);
99static int parse_value4(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
100 const gpr_uint8 *end);
101static int parse_value5up(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
102 const gpr_uint8 *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800103
Craig Tillera82950e2015-09-22 12:33:20 -0700104static int parse_indexed_field(grpc_chttp2_hpack_parser *p,
105 const gpr_uint8 *cur, const gpr_uint8 *end);
106static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
107 const gpr_uint8 *cur, const gpr_uint8 *end);
108static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p,
109 const gpr_uint8 *cur, const gpr_uint8 *end);
110static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
111 const gpr_uint8 *cur, const gpr_uint8 *end);
112static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
113 const gpr_uint8 *cur, const gpr_uint8 *end);
114static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p,
115 const gpr_uint8 *cur, const gpr_uint8 *end);
116static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
117 const gpr_uint8 *cur, const gpr_uint8 *end);
118static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
119 const gpr_uint8 *cur, const gpr_uint8 *end);
120static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
121 const gpr_uint8 *cur, const gpr_uint8 *end);
122static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
123 const gpr_uint8 *cur, const gpr_uint8 *end);
124static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
125 const gpr_uint8 *cur, const gpr_uint8 *end);
126static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
127 const gpr_uint8 *end);
128static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
129 const gpr_uint8 *cur, const gpr_uint8 *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800130
131/* we translate the first byte of a hpack field into one of these decoding
132 cases, then use a lookup table to jump directly to the appropriate parser.
133
134 _X => the integer index is all ones, meaning we need to do varint decoding
135 _V => the integer index is all zeros, meaning we need to decode an additional
136 string value */
Craig Tillera82950e2015-09-22 12:33:20 -0700137typedef enum {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800138 INDEXED_FIELD,
139 INDEXED_FIELD_X,
140 LITHDR_INCIDX,
141 LITHDR_INCIDX_X,
142 LITHDR_INCIDX_V,
143 LITHDR_NOTIDX,
144 LITHDR_NOTIDX_X,
145 LITHDR_NOTIDX_V,
146 LITHDR_NVRIDX,
147 LITHDR_NVRIDX_X,
148 LITHDR_NVRIDX_V,
149 MAX_TBL_SIZE,
150 MAX_TBL_SIZE_X,
151 ILLEGAL
152} first_byte_type;
153
154/* jump table of parse state functions -- order must match first_byte_type
155 above */
156static const grpc_chttp2_hpack_parser_state first_byte_action[] = {
Craig Tiller71a0f9d2015-09-28 17:22:01 -0700157 parse_indexed_field, parse_indexed_field_x, parse_lithdr_incidx,
158 parse_lithdr_incidx_x, parse_lithdr_incidx_v, parse_lithdr_notidx,
159 parse_lithdr_notidx_x, parse_lithdr_notidx_v, parse_lithdr_nvridx,
160 parse_lithdr_nvridx_x, parse_lithdr_nvridx_v, parse_max_tbl_size,
Craig Tiller027a74c2015-11-10 08:37:46 +0000161 parse_max_tbl_size_x, parse_illegal_op};
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800162
163/* indexes the first byte to a parse state function - generated by
164 gen_hpack_tables.c */
165static const gpr_uint8 first_byte_lut[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700166 LITHDR_NOTIDX_V, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
167 LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
168 LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
169 LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX_X,
170 LITHDR_NVRIDX_V, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
171 LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
172 LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
173 LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX_X,
Craig Tiller027a74c2015-11-10 08:37:46 +0000174 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
Craig Tillera82950e2015-09-22 12:33:20 -0700175 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
176 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
177 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
178 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
179 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
180 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
181 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE_X,
182 LITHDR_INCIDX_V, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
183 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
184 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
185 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
186 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
187 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
188 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
189 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
190 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
191 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
192 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
193 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
194 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
195 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
196 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
197 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX_X,
198 ILLEGAL, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
199 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
200 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
201 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
202 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
203 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
204 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
205 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
206 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
207 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
208 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
209 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
210 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
211 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
212 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
213 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
214 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
215 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
216 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
217 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
218 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
219 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
220 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
221 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
222 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
223 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
224 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
225 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
226 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
227 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
228 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
229 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD_X,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700230};
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800231
232/* state table for huffman decoding: given a state, gives an index/16 into
233 next_sub_tbl. Taking that index and adding the value of the nibble being
234 considered returns the next state.
235
236 generated by gen_hpack_tables.c */
237static const gpr_uint8 next_tbl[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700238 0, 1, 2, 3, 4, 1, 2, 5, 6, 1, 7, 8, 1, 3, 3, 9, 10, 11, 1, 1,
239 1, 12, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
240 14, 1, 15, 16, 1, 17, 1, 15, 2, 7, 3, 18, 19, 1, 1, 1, 1, 20, 1, 1,
241 1, 1, 1, 1, 1, 1, 1, 1, 15, 2, 2, 7, 21, 1, 22, 1, 1, 1, 1, 1,
242 1, 1, 1, 15, 2, 2, 2, 2, 2, 2, 23, 24, 25, 1, 1, 1, 1, 2, 2, 2,
243 26, 3, 3, 27, 10, 28, 1, 1, 1, 1, 1, 1, 2, 3, 29, 10, 30, 1, 1, 1,
244 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 2,
245 2, 2, 2, 2, 2, 2, 2, 32, 1, 1, 15, 33, 1, 34, 35, 9, 36, 1, 1, 1,
246 1, 1, 1, 1, 37, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 26, 9,
247 38, 1, 1, 1, 1, 1, 1, 1, 15, 2, 2, 2, 2, 26, 3, 3, 39, 1, 1, 1,
248 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 7, 3, 3, 3, 40, 2,
249 41, 1, 1, 1, 42, 43, 1, 1, 44, 1, 1, 1, 1, 15, 2, 2, 2, 2, 2, 2,
250 3, 3, 3, 45, 46, 1, 1, 2, 2, 2, 35, 3, 3, 18, 47, 2,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700251};
Craig Tiller45724b32015-09-22 10:42:19 -0700252
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800253/* next state, based upon current state and the current nibble: see above.
254 generated by gen_hpack_tables.c */
255static const gpr_int16 next_sub_tbl[48 * 16] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700256 1, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
257 218, 2, 6, 10, 13, 14, 15, 16, 17, 2, 6, 10, 13, 14, 15,
258 16, 17, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7, 11, 24, 3,
259 7, 11, 24, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8,
260 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
261 199, 200, 201, 202, 203, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0,
262 0, 0, 0, 0, 0, 0, 9, 133, 134, 135, 136, 137, 138, 139, 140,
263 141, 142, 143, 144, 145, 146, 147, 3, 7, 11, 24, 3, 7, 11, 24,
264 4, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, 0, 0, 0, 0, 12, 132, 4, 8, 4, 8, 4, 8,
266 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
268 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 4, 8, 4,
269 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 22, 23, 91, 25, 26,
270 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 3,
271 7, 11, 24, 3, 7, 11, 24, 0, 0, 0, 0, 0, 41, 42, 43,
272 2, 6, 10, 13, 14, 15, 16, 17, 3, 7, 11, 24, 3, 7, 11,
273 24, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0,
274 44, 45, 2, 6, 10, 13, 14, 15, 16, 17, 46, 47, 48, 49, 50,
275 51, 52, 57, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
276 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
277 0, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
278 68, 69, 70, 71, 72, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 73, 75, 76, 77, 78, 79, 80, 81, 82,
280 83, 84, 85, 86, 87, 88, 89, 90, 3, 7, 11, 24, 3, 7, 11,
281 24, 3, 7, 11, 24, 0, 0, 0, 0, 3, 7, 11, 24, 3, 7,
282 11, 24, 4, 8, 4, 8, 0, 0, 0, 92, 0, 0, 0, 93, 94,
283 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 3, 7, 11, 24,
284 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4,
285 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286 0, 0, 0, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 4,
287 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0,
288 0, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
289 131, 2, 6, 10, 13, 14, 15, 16, 17, 4, 8, 4, 8, 4, 8,
290 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 148,
291 149, 150, 151, 3, 7, 11, 24, 4, 8, 4, 8, 0, 0, 0, 0,
292 0, 0, 152, 153, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7, 11,
293 24, 154, 155, 156, 164, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7,
294 11, 24, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
295 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 171, 172,
296 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
297 188, 189, 190, 191, 192, 193, 194, 195, 196, 4, 8, 4, 8, 4, 8,
298 4, 8, 4, 8, 4, 8, 4, 8, 197, 198, 4, 8, 4, 8, 4,
299 8, 4, 8, 0, 0, 0, 0, 0, 0, 219, 220, 3, 7, 11, 24,
300 4, 8, 4, 8, 4, 8, 0, 0, 221, 222, 223, 224, 3, 7, 11,
301 24, 3, 7, 11, 24, 4, 8, 4, 8, 4, 8, 225, 228, 4, 8,
302 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 229,
303 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
304 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0,
305 0, 0, 0, 0, 0, 0, 0, 245, 246, 247, 248, 249, 250, 251, 252,
306 253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
307 0, 0, 255,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700308};
Craig Tiller45724b32015-09-22 10:42:19 -0700309
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800310/* emission table: indexed like next_tbl, ultimately gives the byte to be
311 emitted, or -1 for no byte, or 256 for end of stream
312
313 generated by gen_hpack_tables.c */
314static const gpr_uint16 emit_tbl[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700315 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 13,
316 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 23, 24, 25, 26, 27,
317 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
318 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0, 55, 56,
319 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 0,
320 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
321 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
322 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
323 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
324 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
325 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 0,
326 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
327 0, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
328 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
329 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
330 219, 220, 221, 0, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
331 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
332 248,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700333};
Craig Tiller45724b32015-09-22 10:42:19 -0700334
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800335/* generated by gen_hpack_tables.c */
336static const gpr_int16 emit_sub_tbl[249 * 16] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700337 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
338 -1, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49,
339 49, 49, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 97,
340 97, 97, 97, 48, 48, 49, 49, 50, 50, 97, 97, 99, 99, 101, 101,
341 105, 105, 111, 111, 48, 49, 50, 97, 99, 101, 105, 111, 115, 116, -1,
342 -1, -1, -1, -1, -1, 32, 32, 32, 32, 32, 32, 32, 32, 37, 37,
343 37, 37, 37, 37, 37, 37, 99, 99, 99, 99, 101, 101, 101, 101, 105,
344 105, 105, 105, 111, 111, 111, 111, 115, 115, 116, 116, 32, 37, 45, 46,
345 47, 51, 52, 53, 54, 55, 56, 57, 61, 61, 61, 61, 61, 61, 61,
346 61, 65, 65, 65, 65, 65, 65, 65, 65, 115, 115, 115, 115, 116, 116,
347 116, 116, 32, 32, 37, 37, 45, 45, 46, 46, 61, 65, 95, 98, 100,
348 102, 103, 104, 108, 109, 110, 112, 114, 117, -1, -1, 58, 58, 58, 58,
349 58, 58, 58, 58, 66, 66, 66, 66, 66, 66, 66, 66, 47, 47, 51,
350 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 61, 61,
351 65, 65, 95, 95, 98, 98, 100, 100, 102, 102, 103, 103, 104, 104, 108,
352 108, 109, 109, 110, 110, 112, 112, 114, 114, 117, 117, 58, 66, 67, 68,
353 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
354 84, 85, 86, 87, 89, 106, 107, 113, 118, 119, 120, 121, 122, -1, -1,
355 -1, -1, 38, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42,
356 42, 42, 42, 44, 44, 44, 44, 44, 44, 44, 44, 59, 59, 59, 59,
357 59, 59, 59, 59, 88, 88, 88, 88, 88, 88, 88, 88, 90, 90, 90,
358 90, 90, 90, 90, 90, 33, 33, 34, 34, 40, 40, 41, 41, 63, 63,
359 39, 43, 124, -1, -1, -1, 35, 35, 35, 35, 35, 35, 35, 35, 62,
360 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 36, 36, 36, 36,
361 64, 64, 64, 64, 91, 91, 91, 91, 69, 69, 69, 69, 69, 69, 69,
362 69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71,
363 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73,
364 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75,
365 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77,
366 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79,
367 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81,
368 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82,
369 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84,
370 84, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86,
371 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 89, 89, 89, 89, 89,
372 89, 89, 89, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107,
373 107, 107, 107, 107, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118,
374 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120,
375 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 122,
376 122, 122, 122, 122, 122, 122, 122, 38, 38, 38, 38, 42, 42, 42, 42,
377 44, 44, 44, 44, 59, 59, 59, 59, 88, 88, 88, 88, 90, 90, 90,
378 90, 33, 34, 40, 41, 63, -1, -1, -1, 39, 39, 39, 39, 39, 39,
379 39, 39, 43, 43, 43, 43, 43, 43, 43, 43, 124, 124, 124, 124, 124,
380 124, 124, 124, 35, 35, 35, 35, 62, 62, 62, 62, 0, 0, 36, 36,
381 64, 64, 91, 91, 93, 93, 126, 126, 94, 125, -1, -1, 60, 60, 60,
382 60, 60, 60, 60, 60, 96, 96, 96, 96, 96, 96, 96, 96, 123, 123,
383 123, 123, 123, 123, 123, 123, -1, -1, -1, -1, -1, -1, -1, -1, 92,
384 92, 92, 92, 92, 92, 92, 92, 195, 195, 195, 195, 195, 195, 195, 195,
385 208, 208, 208, 208, 208, 208, 208, 208, 128, 128, 128, 128, 130, 130, 130,
386 130, 131, 131, 131, 131, 162, 162, 162, 162, 184, 184, 184, 184, 194, 194,
387 194, 194, 224, 224, 224, 224, 226, 226, 226, 226, 153, 153, 161, 161, 167,
388 167, 172, 172, 176, 176, 177, 177, 179, 179, 209, 209, 216, 216, 217, 217,
389 227, 227, 229, 229, 230, 230, 129, 132, 133, 134, 136, 146, 154, 156, 160,
390 163, 164, 169, 170, 173, 178, 181, 185, 186, 187, 189, 190, 196, 198, 228,
391 232, 233, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 135,
392 135, 135, 135, 135, 135, 135, 135, 137, 137, 137, 137, 137, 137, 137, 137,
393 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139,
394 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141,
395 141, 141, 143, 143, 143, 143, 143, 143, 143, 143, 147, 147, 147, 147, 147,
396 147, 147, 147, 149, 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, 150,
397 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
398 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 157, 157,
399 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 165,
400 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
401 168, 168, 168, 168, 168, 168, 168, 168, 174, 174, 174, 174, 174, 174, 174,
402 174, 175, 175, 175, 175, 175, 175, 175, 175, 180, 180, 180, 180, 180, 180,
403 180, 180, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183,
404 183, 183, 183, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191,
405 191, 191, 191, 191, 197, 197, 197, 197, 197, 197, 197, 197, 231, 231, 231,
406 231, 231, 231, 231, 231, 239, 239, 239, 239, 239, 239, 239, 239, 9, 9,
407 9, 9, 142, 142, 142, 142, 144, 144, 144, 144, 145, 145, 145, 145, 148,
408 148, 148, 148, 159, 159, 159, 159, 171, 171, 171, 171, 206, 206, 206, 206,
409 215, 215, 215, 215, 225, 225, 225, 225, 236, 236, 236, 236, 237, 237, 237,
410 237, 199, 199, 207, 207, 234, 234, 235, 235, 192, 193, 200, 201, 202, 205,
411 210, 213, 218, 219, 238, 240, 242, 243, 255, -1, 203, 203, 203, 203, 203,
412 203, 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, 211, 211, 211, 211,
413 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 214, 214, 214,
414 214, 214, 214, 214, 214, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222,
415 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, 241,
416 241, 241, 241, 241, 241, 241, 241, 244, 244, 244, 244, 244, 244, 244, 244,
417 245, 245, 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246,
418 246, 247, 247, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, 248,
419 248, 248, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251,
420 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253,
421 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 2, 2, 2,
422 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
423 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 11, 11, 11, 11, 12,
424 12, 12, 12, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
425 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20,
426 20, 21, 21, 21, 21, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25,
427 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29,
428 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 127, 127, 127, 127,
429 220, 220, 220, 220, 249, 249, 249, 249, 10, 13, 22, 256, 93, 93, 93,
430 93, 126, 126, 126, 126, 94, 94, 125, 125, 60, 96, 123, -1, 92, 195,
431 208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 128,
432 128, 128, 128, 128, 128, 128, 128, 130, 130, 130, 130, 130, 130, 130, 130,
433 131, 131, 131, 131, 131, 131, 131, 131, 162, 162, 162, 162, 162, 162, 162,
434 162, 184, 184, 184, 184, 184, 184, 184, 184, 194, 194, 194, 194, 194, 194,
435 194, 194, 224, 224, 224, 224, 224, 224, 224, 224, 226, 226, 226, 226, 226,
436 226, 226, 226, 153, 153, 153, 153, 161, 161, 161, 161, 167, 167, 167, 167,
437 172, 172, 172, 172, 176, 176, 176, 176, 177, 177, 177, 177, 179, 179, 179,
438 179, 209, 209, 209, 209, 216, 216, 216, 216, 217, 217, 217, 217, 227, 227,
439 227, 227, 229, 229, 229, 229, 230, 230, 230, 230, 129, 129, 132, 132, 133,
440 133, 134, 134, 136, 136, 146, 146, 154, 154, 156, 156, 160, 160, 163, 163,
441 164, 164, 169, 169, 170, 170, 173, 173, 178, 178, 181, 181, 185, 185, 186,
442 186, 187, 187, 189, 189, 190, 190, 196, 196, 198, 198, 228, 228, 232, 232,
443 233, 233, 1, 135, 137, 138, 139, 140, 141, 143, 147, 149, 150, 151, 152,
444 155, 157, 158, 165, 166, 168, 174, 175, 180, 182, 183, 188, 191, 197, 231,
445 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, 9,
446 9, 9, 9, 9, 9, 142, 142, 142, 142, 142, 142, 142, 142, 144, 144,
447 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 148,
448 148, 148, 148, 148, 148, 148, 148, 159, 159, 159, 159, 159, 159, 159, 159,
449 171, 171, 171, 171, 171, 171, 171, 171, 206, 206, 206, 206, 206, 206, 206,
450 206, 215, 215, 215, 215, 215, 215, 215, 215, 225, 225, 225, 225, 225, 225,
451 225, 225, 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237,
452 237, 237, 237, 199, 199, 199, 199, 207, 207, 207, 207, 234, 234, 234, 234,
453 235, 235, 235, 235, 192, 192, 193, 193, 200, 200, 201, 201, 202, 202, 205,
454 205, 210, 210, 213, 213, 218, 218, 219, 219, 238, 238, 240, 240, 242, 242,
455 243, 243, 255, 255, 203, 204, 211, 212, 214, 221, 222, 223, 241, 244, 245,
456 246, 247, 248, 250, 251, 252, 253, 254, -1, -1, -1, -1, -1, -1, -1,
457 -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2,
458 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
459 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
460 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
461 8, 8, 8, 8, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12,
462 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15,
463 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
464 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18,
465 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20,
466 20, 21, 21, 21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23,
467 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25,
468 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27,
469 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29,
470 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31,
471 31, 31, 31, 31, 31, 31, 127, 127, 127, 127, 127, 127, 127, 127, 220,
472 220, 220, 220, 220, 220, 220, 220, 249, 249, 249, 249, 249, 249, 249, 249,
473 10, 10, 13, 13, 22, 22, 256, 256, 67, 67, 67, 67, 67, 67, 67,
474 67, 68, 68, 68, 68, 68, 68, 68, 68, 95, 95, 95, 95, 95, 95,
475 95, 95, 98, 98, 98, 98, 98, 98, 98, 98, 100, 100, 100, 100, 100,
476 100, 100, 100, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103,
477 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 108, 108, 108,
478 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110,
479 110, 110, 110, 110, 110, 110, 112, 112, 112, 112, 112, 112, 112, 112, 114,
480 114, 114, 114, 114, 114, 114, 114, 117, 117, 117, 117, 117, 117, 117, 117,
481 58, 58, 58, 58, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68,
482 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72,
483 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76,
484 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79,
485 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83,
486 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87,
487 87, 87, 89, 89, 89, 89, 106, 106, 106, 106, 107, 107, 107, 107, 113,
488 113, 113, 113, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120,
489 121, 121, 121, 121, 122, 122, 122, 122, 38, 38, 42, 42, 44, 44, 59,
490 59, 88, 88, 90, 90, -1, -1, -1, -1, 33, 33, 33, 33, 33, 33,
491 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 40, 40, 40, 40, 40,
492 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 63, 63, 63, 63,
493 63, 63, 63, 63, 39, 39, 39, 39, 43, 43, 43, 43, 124, 124, 124,
494 124, 35, 35, 62, 62, 0, 36, 64, 91, 93, 126, -1, -1, 94, 94,
495 94, 94, 94, 94, 94, 94, 125, 125, 125, 125, 125, 125, 125, 125, 60,
496 60, 60, 60, 96, 96, 96, 96, 123, 123, 123, 123, -1, -1, -1, -1,
497 92, 92, 92, 92, 195, 195, 195, 195, 208, 208, 208, 208, 128, 128, 130,
498 130, 131, 131, 162, 162, 184, 184, 194, 194, 224, 224, 226, 226, 153, 161,
499 167, 172, 176, 177, 179, 209, 216, 217, 227, 229, 230, -1, -1, -1, -1,
500 -1, -1, -1, 129, 129, 129, 129, 129, 129, 129, 129, 132, 132, 132, 132,
501 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
502 134, 134, 134, 134, 134, 136, 136, 136, 136, 136, 136, 136, 136, 146, 146,
503 146, 146, 146, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, 156,
504 156, 156, 156, 156, 156, 156, 156, 160, 160, 160, 160, 160, 160, 160, 160,
505 163, 163, 163, 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
506 164, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
507 170, 170, 173, 173, 173, 173, 173, 173, 173, 173, 178, 178, 178, 178, 178,
508 178, 178, 178, 181, 181, 181, 181, 181, 181, 181, 181, 185, 185, 185, 185,
509 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187,
510 187, 187, 187, 187, 187, 189, 189, 189, 189, 189, 189, 189, 189, 190, 190,
511 190, 190, 190, 190, 190, 190, 196, 196, 196, 196, 196, 196, 196, 196, 198,
512 198, 198, 198, 198, 198, 198, 198, 228, 228, 228, 228, 228, 228, 228, 228,
513 232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233,
514 233, 1, 1, 1, 1, 135, 135, 135, 135, 137, 137, 137, 137, 138, 138,
515 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 143,
516 143, 143, 143, 147, 147, 147, 147, 149, 149, 149, 149, 150, 150, 150, 150,
517 151, 151, 151, 151, 152, 152, 152, 152, 155, 155, 155, 155, 157, 157, 157,
518 157, 158, 158, 158, 158, 165, 165, 165, 165, 166, 166, 166, 166, 168, 168,
519 168, 168, 174, 174, 174, 174, 175, 175, 175, 175, 180, 180, 180, 180, 182,
520 182, 182, 182, 183, 183, 183, 183, 188, 188, 188, 188, 191, 191, 191, 191,
521 197, 197, 197, 197, 231, 231, 231, 231, 239, 239, 239, 239, 9, 9, 142,
522 142, 144, 144, 145, 145, 148, 148, 159, 159, 171, 171, 206, 206, 215, 215,
523 225, 225, 236, 236, 237, 237, 199, 207, 234, 235, 192, 192, 192, 192, 192,
524 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 200, 200, 200, 200,
525 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, 202, 202, 202,
526 202, 202, 202, 202, 202, 205, 205, 205, 205, 205, 205, 205, 205, 210, 210,
527 210, 210, 210, 210, 210, 210, 213, 213, 213, 213, 213, 213, 213, 213, 218,
528 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219,
529 238, 238, 238, 238, 238, 238, 238, 238, 240, 240, 240, 240, 240, 240, 240,
530 240, 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243,
531 243, 243, 255, 255, 255, 255, 255, 255, 255, 255, 203, 203, 203, 203, 204,
532 204, 204, 204, 211, 211, 211, 211, 212, 212, 212, 212, 214, 214, 214, 214,
533 221, 221, 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, 241, 241, 241,
534 241, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246, 247, 247,
535 247, 247, 248, 248, 248, 248, 250, 250, 250, 250, 251, 251, 251, 251, 252,
536 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 2, 2, 3, 3,
537 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 11, 11, 12, 12, 14,
538 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21,
539 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
540 30, 31, 31, 127, 127, 220, 220, 249, 249, -1, -1, 10, 10, 10, 10,
541 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 22, 22, 22,
542 22, 22, 22, 22, 22, 256, 256, 256, 256, 256, 256, 256, 256, 45, 45,
543 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 47,
544 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51,
545 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53,
546 53, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55,
547 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57,
548 57, 57, 57, 50, 50, 50, 50, 50, 50, 50, 50, 97, 97, 97, 97,
549 97, 97, 97, 97, 99, 99, 99, 99, 99, 99, 99, 99, 101, 101, 101,
550 101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 105, 105, 105, 111, 111,
551 111, 111, 111, 111, 111, 111, 115, 115, 115, 115, 115, 115, 115, 115, 116,
552 116, 116, 116, 116, 116, 116, 116, 32, 32, 32, 32, 37, 37, 37, 37,
553 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 51, 51, 51,
554 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55,
555 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 61, 61, 61, 61, 65,
556 65, 65, 65, 95, 95, 95, 95, 98, 98, 98, 98, 100, 100, 100, 100,
557 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 108, 108, 108,
558 108, 109, 109, 109, 109, 110, 110, 110, 110, 112, 112, 112, 112, 114, 114,
559 114, 114, 117, 117, 117, 117, 58, 58, 66, 66, 67, 67, 68, 68, 69,
560 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76,
561 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84,
562 84, 85, 85, 86, 86, 87, 87, 89, 89, 106, 106, 107, 107, 113, 113,
563 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 38, 42, 44, 59, 88,
564 90, -1, -1, 33, 33, 33, 33, 34, 34, 34, 34, 40, 40, 40, 40,
565 41, 41, 41, 41, 63, 63, 63, 63, 39, 39, 43, 43, 124, 124, 35,
566 62, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
567 36, 36, 36, 36, 36, 36, 64, 64, 64, 64, 64, 64, 64, 64, 91,
568 91, 91, 91, 91, 91, 91, 91, 93, 93, 93, 93, 93, 93, 93, 93,
569 126, 126, 126, 126, 126, 126, 126, 126, 94, 94, 94, 94, 125, 125, 125,
570 125, 60, 60, 96, 96, 123, 123, -1, -1, 92, 92, 195, 195, 208, 208,
571 128, 130, 131, 162, 184, 194, 224, 226, -1, -1, 153, 153, 153, 153, 153,
572 153, 153, 153, 161, 161, 161, 161, 161, 161, 161, 161, 167, 167, 167, 167,
573 167, 167, 167, 167, 172, 172, 172, 172, 172, 172, 172, 172, 176, 176, 176,
574 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 179, 179,
575 179, 179, 179, 179, 179, 179, 209, 209, 209, 209, 209, 209, 209, 209, 216,
576 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217,
577 227, 227, 227, 227, 227, 227, 227, 227, 229, 229, 229, 229, 229, 229, 229,
578 229, 230, 230, 230, 230, 230, 230, 230, 230, 129, 129, 129, 129, 132, 132,
579 132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 136, 136, 136, 136, 146,
580 146, 146, 146, 154, 154, 154, 154, 156, 156, 156, 156, 160, 160, 160, 160,
581 163, 163, 163, 163, 164, 164, 164, 164, 169, 169, 169, 169, 170, 170, 170,
582 170, 173, 173, 173, 173, 178, 178, 178, 178, 181, 181, 181, 181, 185, 185,
583 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 189, 189, 189, 189, 190,
584 190, 190, 190, 196, 196, 196, 196, 198, 198, 198, 198, 228, 228, 228, 228,
585 232, 232, 232, 232, 233, 233, 233, 233, 1, 1, 135, 135, 137, 137, 138,
586 138, 139, 139, 140, 140, 141, 141, 143, 143, 147, 147, 149, 149, 150, 150,
587 151, 151, 152, 152, 155, 155, 157, 157, 158, 158, 165, 165, 166, 166, 168,
588 168, 174, 174, 175, 175, 180, 180, 182, 182, 183, 183, 188, 188, 191, 191,
589 197, 197, 231, 231, 239, 239, 9, 142, 144, 145, 148, 159, 171, 206, 215,
590 225, 236, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199, 199,
591 199, 199, 199, 199, 199, 199, 207, 207, 207, 207, 207, 207, 207, 207, 234,
592 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235,
593 192, 192, 192, 192, 193, 193, 193, 193, 200, 200, 200, 200, 201, 201, 201,
594 201, 202, 202, 202, 202, 205, 205, 205, 205, 210, 210, 210, 210, 213, 213,
595 213, 213, 218, 218, 218, 218, 219, 219, 219, 219, 238, 238, 238, 238, 240,
596 240, 240, 240, 242, 242, 242, 242, 243, 243, 243, 243, 255, 255, 255, 255,
597 203, 203, 204, 204, 211, 211, 212, 212, 214, 214, 221, 221, 222, 222, 223,
598 223, 241, 241, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 250, 250,
599 251, 251, 252, 252, 253, 253, 254, 254, 2, 3, 4, 5, 6, 7, 8,
600 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27,
601 28, 29, 30, 31, 127, 220, 249, -1, 10, 10, 10, 10, 13, 13, 13,
602 13, 22, 22, 22, 22, 256, 256, 256, 256,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700603};
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800604
ctiller33023c42014-12-12 16:28:33 -0800605static const gpr_uint8 inverse_base64[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700606 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
607 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
608 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255,
609 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
610 255, 64, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
611 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
612 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33,
613 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
614 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
615 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
616 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
617 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
618 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
619 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
620 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
621 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
622 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
623 255,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700624};
ctiller33023c42014-12-12 16:28:33 -0800625
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800626/* emission helpers */
Craig Tiller027a74c2015-11-10 08:37:46 +0000627static int on_hdr(grpc_chttp2_hpack_parser *p, grpc_mdelem *md,
Craig Tiller3c53bb22015-11-10 14:24:36 +0000628 int add_to_table) {
Craig Tillera82950e2015-09-22 12:33:20 -0700629 if (add_to_table) {
Craig Tiller027a74c2015-11-10 08:37:46 +0000630 if (!grpc_chttp2_hptbl_add(&p->table, md)) {
631 return 0;
632 }
Craig Tillera82950e2015-09-22 12:33:20 -0700633 }
634 p->on_header(p->on_header_user_data, md);
Craig Tiller027a74c2015-11-10 08:37:46 +0000635 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800636}
637
Craig Tillera82950e2015-09-22 12:33:20 -0700638static grpc_mdstr *take_string(grpc_chttp2_hpack_parser *p,
639 grpc_chttp2_hpack_parser_string *str) {
Craig Tillerb2b42612015-11-20 12:02:17 -0800640 grpc_mdstr *s = grpc_mdstr_from_buffer((gpr_uint8 *)str->str, str->length);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800641 str->length = 0;
642 return s;
643}
644
645/* jump to the next state */
Craig Tillera82950e2015-09-22 12:33:20 -0700646static int parse_next(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
647 const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800648 p->state = *p->next_state++;
Craig Tillera82950e2015-09-22 12:33:20 -0700649 return p->state(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800650}
651
652/* begin parsing a header: all functionality is encoded into lookup tables
653 above */
Craig Tillera82950e2015-09-22 12:33:20 -0700654static int parse_begin(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
655 const gpr_uint8 *end) {
656 if (cur == end) {
657 p->state = parse_begin;
658 return 1;
659 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800660
Craig Tillera82950e2015-09-22 12:33:20 -0700661 return first_byte_action[first_byte_lut[*cur]](p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800662}
663
664/* stream dependency and prioritization data: we just skip it */
Craig Tillera82950e2015-09-22 12:33:20 -0700665static int parse_stream_weight(grpc_chttp2_hpack_parser *p,
666 const gpr_uint8 *cur, const gpr_uint8 *end) {
667 if (cur == end) {
668 p->state = parse_stream_weight;
669 return 1;
670 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800671
Craig Tillera82950e2015-09-22 12:33:20 -0700672 return p->after_prioritization(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800673}
674
Craig Tillera82950e2015-09-22 12:33:20 -0700675static int parse_stream_dep3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
676 const gpr_uint8 *end) {
677 if (cur == end) {
678 p->state = parse_stream_dep3;
679 return 1;
680 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800681
Craig Tillera82950e2015-09-22 12:33:20 -0700682 return parse_stream_weight(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800683}
684
Craig Tillera82950e2015-09-22 12:33:20 -0700685static int parse_stream_dep2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
686 const gpr_uint8 *end) {
687 if (cur == end) {
688 p->state = parse_stream_dep2;
689 return 1;
690 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800691
Craig Tillera82950e2015-09-22 12:33:20 -0700692 return parse_stream_dep3(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800693}
694
Craig Tillera82950e2015-09-22 12:33:20 -0700695static int parse_stream_dep1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
696 const gpr_uint8 *end) {
697 if (cur == end) {
698 p->state = parse_stream_dep1;
699 return 1;
700 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800701
Craig Tillera82950e2015-09-22 12:33:20 -0700702 return parse_stream_dep2(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800703}
704
Craig Tillera82950e2015-09-22 12:33:20 -0700705static int parse_stream_dep0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
706 const gpr_uint8 *end) {
707 if (cur == end) {
708 p->state = parse_stream_dep0;
709 return 1;
710 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800711
Craig Tillera82950e2015-09-22 12:33:20 -0700712 return parse_stream_dep1(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800713}
714
715/* emit an indexed field; for now just logs it to console; jumps to
716 begin the next field on completion */
Craig Tillera82950e2015-09-22 12:33:20 -0700717static int finish_indexed_field(grpc_chttp2_hpack_parser *p,
718 const gpr_uint8 *cur, const gpr_uint8 *end) {
719 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller027a74c2015-11-10 08:37:46 +0000720 if (md == NULL) {
721 gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index);
722 return 0;
723 }
Craig Tillera82950e2015-09-22 12:33:20 -0700724 GRPC_MDELEM_REF(md);
Craig Tiller027a74c2015-11-10 08:37:46 +0000725 return on_hdr(p, md, 0) && parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800726}
727
728/* parse an indexed field with index < 127 */
Craig Tillera82950e2015-09-22 12:33:20 -0700729static int parse_indexed_field(grpc_chttp2_hpack_parser *p,
730 const gpr_uint8 *cur, const gpr_uint8 *end) {
Craig Tiller7b01b752015-12-02 16:52:54 -0800731 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800732 p->index = (*cur) & 0x7f;
Craig Tillera82950e2015-09-22 12:33:20 -0700733 return finish_indexed_field(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800734}
735
736/* parse an indexed field with index >= 127 */
Craig Tillera82950e2015-09-22 12:33:20 -0700737static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
738 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800739 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700740 finish_indexed_field};
Craig Tiller7b01b752015-12-02 16:52:54 -0800741 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800742 p->next_state = and_then;
743 p->index = 0x7f;
744 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700745 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800746}
747
748/* finish a literal header with incremental indexing: just log, and jump to '
749 begin */
Craig Tillera82950e2015-09-22 12:33:20 -0700750static int finish_lithdr_incidx(grpc_chttp2_hpack_parser *p,
751 const gpr_uint8 *cur, const gpr_uint8 *end) {
752 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -0800753 GPR_ASSERT(md != NULL); /* handled in string parsing */
Craig Tiller0927c702015-11-20 12:25:54 -0800754 return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000755 take_string(p, &p->value)),
756 1) &&
757 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800758}
759
760/* finish a literal header with incremental indexing with no index */
Craig Tillera82950e2015-09-22 12:33:20 -0700761static int finish_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
762 const gpr_uint8 *cur, const gpr_uint8 *end) {
Craig Tiller0927c702015-11-20 12:25:54 -0800763 return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000764 take_string(p, &p->value)),
765 1) &&
766 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800767}
768
769/* parse a literal header with incremental indexing; index < 63 */
Craig Tillera82950e2015-09-22 12:33:20 -0700770static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p,
771 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800772 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700773 parse_value_string_with_indexed_key, finish_lithdr_incidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800774 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800775 p->next_state = and_then;
776 p->index = (*cur) & 0x3f;
Craig Tillera82950e2015-09-22 12:33:20 -0700777 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800778}
779
780/* parse a literal header with incremental indexing; index >= 63 */
Craig Tillera82950e2015-09-22 12:33:20 -0700781static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
782 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800783 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700784 parse_string_prefix, parse_value_string_with_indexed_key,
785 finish_lithdr_incidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800786 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800787 p->next_state = and_then;
788 p->index = 0x3f;
789 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700790 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800791}
792
793/* parse a literal header with incremental indexing; index = 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700794static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
795 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800796 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700797 parse_key_string, parse_string_prefix,
798 parse_value_string_with_literal_key, finish_lithdr_incidx_v};
Craig Tiller7b01b752015-12-02 16:52:54 -0800799 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800800 p->next_state = and_then;
Craig Tillera82950e2015-09-22 12:33:20 -0700801 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800802}
803
804/* finish a literal header without incremental indexing */
Craig Tillera82950e2015-09-22 12:33:20 -0700805static int finish_lithdr_notidx(grpc_chttp2_hpack_parser *p,
806 const gpr_uint8 *cur, const gpr_uint8 *end) {
807 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -0800808 GPR_ASSERT(md != NULL); /* handled in string parsing */
Craig Tiller0927c702015-11-20 12:25:54 -0800809 return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000810 take_string(p, &p->value)),
811 0) &&
812 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800813}
814
815/* finish a literal header without incremental indexing with index = 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700816static int finish_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
817 const gpr_uint8 *cur, const gpr_uint8 *end) {
Craig Tiller0927c702015-11-20 12:25:54 -0800818 return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000819 take_string(p, &p->value)),
820 0) &&
821 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800822}
823
824/* parse a literal header without incremental indexing; index < 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700825static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p,
826 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800827 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700828 parse_value_string_with_indexed_key, finish_lithdr_notidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800829 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800830 p->next_state = and_then;
831 p->index = (*cur) & 0xf;
Craig Tillera82950e2015-09-22 12:33:20 -0700832 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800833}
834
835/* parse a literal header without incremental indexing; index >= 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700836static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
837 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800838 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700839 parse_string_prefix, parse_value_string_with_indexed_key,
840 finish_lithdr_notidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800841 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800842 p->next_state = and_then;
843 p->index = 0xf;
844 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700845 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800846}
847
848/* parse a literal header without incremental indexing; index == 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700849static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
850 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800851 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700852 parse_key_string, parse_string_prefix,
853 parse_value_string_with_literal_key, finish_lithdr_notidx_v};
Craig Tiller7b01b752015-12-02 16:52:54 -0800854 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800855 p->next_state = and_then;
Craig Tillera82950e2015-09-22 12:33:20 -0700856 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800857}
858
859/* finish a literal header that is never indexed */
Craig Tillera82950e2015-09-22 12:33:20 -0700860static int finish_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
861 const gpr_uint8 *cur, const gpr_uint8 *end) {
862 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -0800863 GPR_ASSERT(md != NULL); /* handled in string parsing */
Craig Tiller0927c702015-11-20 12:25:54 -0800864 return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000865 take_string(p, &p->value)),
866 0) &&
867 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800868}
869
870/* finish a literal header that is never indexed with an extra value */
Craig Tillera82950e2015-09-22 12:33:20 -0700871static int finish_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
872 const gpr_uint8 *cur, const gpr_uint8 *end) {
Craig Tiller0927c702015-11-20 12:25:54 -0800873 return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000874 take_string(p, &p->value)),
875 0) &&
876 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800877}
878
879/* parse a literal header that is never indexed; index < 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700880static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
881 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800882 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700883 parse_value_string_with_indexed_key, finish_lithdr_nvridx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800884 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800885 p->next_state = and_then;
886 p->index = (*cur) & 0xf;
Craig Tillera82950e2015-09-22 12:33:20 -0700887 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800888}
889
890/* parse a literal header that is never indexed; index >= 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700891static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
892 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800893 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700894 parse_string_prefix, parse_value_string_with_indexed_key,
895 finish_lithdr_nvridx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800896 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800897 p->next_state = and_then;
898 p->index = 0xf;
899 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700900 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800901}
902
903/* parse a literal header that is never indexed; index == 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700904static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
905 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800906 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700907 parse_key_string, parse_string_prefix,
908 parse_value_string_with_literal_key, finish_lithdr_nvridx_v};
Craig Tiller7b01b752015-12-02 16:52:54 -0800909 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800910 p->next_state = and_then;
Craig Tillera82950e2015-09-22 12:33:20 -0700911 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800912}
913
914/* finish parsing a max table size change */
Craig Tillera82950e2015-09-22 12:33:20 -0700915static int finish_max_tbl_size(grpc_chttp2_hpack_parser *p,
916 const gpr_uint8 *cur, const gpr_uint8 *end) {
917 gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
Craig Tiller3c53bb22015-11-10 14:24:36 +0000918 return grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index) &&
919 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800920}
921
922/* parse a max table size change, max size < 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700923static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
924 const gpr_uint8 *end) {
Craig Tiller7b01b752015-12-02 16:52:54 -0800925 if (p->dynamic_table_update_allowed == 0) {
926 return 0;
927 }
928 p->dynamic_table_update_allowed--;
Craig Tiller027a74c2015-11-10 08:37:46 +0000929 p->index = (*cur) & 0x1f;
Craig Tillera82950e2015-09-22 12:33:20 -0700930 return finish_max_tbl_size(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800931}
932
933/* parse a max table size change, max size >= 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700934static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
935 const gpr_uint8 *cur, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800936 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700937 finish_max_tbl_size};
Craig Tiller7b01b752015-12-02 16:52:54 -0800938 if (p->dynamic_table_update_allowed == 0) {
939 return 0;
940 }
941 p->dynamic_table_update_allowed--;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800942 p->next_state = and_then;
Craig Tiller027a74c2015-11-10 08:37:46 +0000943 p->index = 0x1f;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800944 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700945 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800946}
947
948/* a parse error: jam the parse state into parse_error, and return error */
Craig Tillera82950e2015-09-22 12:33:20 -0700949static int parse_error(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
950 const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800951 p->state = parse_error;
952 return 0;
953}
954
Craig Tiller3c53bb22015-11-10 14:24:36 +0000955static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
956 const gpr_uint8 *end) {
Craig Tiller027a74c2015-11-10 08:37:46 +0000957 GPR_ASSERT(cur != end);
958 gpr_log(GPR_DEBUG, "Illegal hpack op code %d", *cur);
959 return parse_error(p, cur, end);
960}
961
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800962/* parse the 1st byte of a varint into p->parsing.value
963 no overflow is possible */
Craig Tillera82950e2015-09-22 12:33:20 -0700964static int parse_value0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
965 const gpr_uint8 *end) {
966 if (cur == end) {
967 p->state = parse_value0;
968 return 1;
969 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800970
971 *p->parsing.value += (*cur) & 0x7f;
972
Craig Tillera82950e2015-09-22 12:33:20 -0700973 if ((*cur) & 0x80) {
974 return parse_value1(p, cur + 1, end);
975 } else {
976 return parse_next(p, cur + 1, end);
977 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800978}
979
980/* parse the 2nd byte of a varint into p->parsing.value
981 no overflow is possible */
Craig Tillera82950e2015-09-22 12:33:20 -0700982static int parse_value1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
983 const gpr_uint8 *end) {
984 if (cur == end) {
985 p->state = parse_value1;
986 return 1;
987 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800988
Craig Tillera82950e2015-09-22 12:33:20 -0700989 *p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 7;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800990
Craig Tillera82950e2015-09-22 12:33:20 -0700991 if ((*cur) & 0x80) {
992 return parse_value2(p, cur + 1, end);
993 } else {
994 return parse_next(p, cur + 1, end);
995 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800996}
997
998/* parse the 3rd byte of a varint into p->parsing.value
999 no overflow is possible */
Craig Tillera82950e2015-09-22 12:33:20 -07001000static int parse_value2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1001 const gpr_uint8 *end) {
1002 if (cur == end) {
1003 p->state = parse_value2;
1004 return 1;
1005 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001006
Craig Tillera82950e2015-09-22 12:33:20 -07001007 *p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 14;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001008
Craig Tillera82950e2015-09-22 12:33:20 -07001009 if ((*cur) & 0x80) {
1010 return parse_value3(p, cur + 1, end);
1011 } else {
1012 return parse_next(p, cur + 1, end);
1013 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001014}
1015
1016/* parse the 4th byte of a varint into p->parsing.value
1017 no overflow is possible */
Craig Tillera82950e2015-09-22 12:33:20 -07001018static int parse_value3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1019 const gpr_uint8 *end) {
1020 if (cur == end) {
1021 p->state = parse_value3;
1022 return 1;
1023 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001024
Craig Tillera82950e2015-09-22 12:33:20 -07001025 *p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 21;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001026
Craig Tillera82950e2015-09-22 12:33:20 -07001027 if ((*cur) & 0x80) {
1028 return parse_value4(p, cur + 1, end);
1029 } else {
1030 return parse_next(p, cur + 1, end);
1031 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001032}
1033
1034/* parse the 5th byte of a varint into p->parsing.value
1035 depending on the byte, we may overflow, and care must be taken */
Craig Tillera82950e2015-09-22 12:33:20 -07001036static int parse_value4(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1037 const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001038 gpr_uint8 c;
1039 gpr_uint32 cur_value;
1040 gpr_uint32 add_value;
1041
Craig Tillera82950e2015-09-22 12:33:20 -07001042 if (cur == end) {
1043 p->state = parse_value4;
1044 return 1;
1045 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001046
1047 c = (*cur) & 0x7f;
Craig Tillera82950e2015-09-22 12:33:20 -07001048 if (c > 0xf) {
1049 goto error;
1050 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001051
1052 cur_value = *p->parsing.value;
Craig Tillera82950e2015-09-22 12:33:20 -07001053 add_value = ((gpr_uint32)c) << 28;
1054 if (add_value > 0xffffffffu - cur_value) {
1055 goto error;
1056 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001057
1058 *p->parsing.value = cur_value + add_value;
1059
Craig Tillera82950e2015-09-22 12:33:20 -07001060 if ((*cur) & 0x80) {
1061 return parse_value5up(p, cur + 1, end);
1062 } else {
1063 return parse_next(p, cur + 1, end);
1064 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001065
1066error:
Craig Tillera82950e2015-09-22 12:33:20 -07001067 gpr_log(GPR_ERROR,
1068 "integer overflow in hpack integer decoding: have 0x%08x, "
1069 "got byte 0x%02x",
1070 *p->parsing.value, *cur);
1071 return parse_error(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001072}
1073
1074/* parse any trailing bytes in a varint: it's possible to append an arbitrary
1075 number of 0x80's and not affect the value - a zero will terminate - and
1076 anything else will overflow */
Craig Tillera82950e2015-09-22 12:33:20 -07001077static int parse_value5up(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1078 const gpr_uint8 *end) {
1079 while (cur != end && *cur == 0x80) {
1080 ++cur;
1081 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001082
Craig Tillera82950e2015-09-22 12:33:20 -07001083 if (cur == end) {
1084 p->state = parse_value5up;
1085 return 1;
1086 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001087
Craig Tillera82950e2015-09-22 12:33:20 -07001088 if (*cur == 0) {
1089 return parse_next(p, cur + 1, end);
1090 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001091
Craig Tillera82950e2015-09-22 12:33:20 -07001092 gpr_log(GPR_ERROR,
1093 "integer overflow in hpack integer decoding: have 0x%08x, "
1094 "got byte 0x%02x sometime after byte 4");
1095 return parse_error(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001096}
1097
1098/* parse a string prefix */
Craig Tillera82950e2015-09-22 12:33:20 -07001099static int parse_string_prefix(grpc_chttp2_hpack_parser *p,
1100 const gpr_uint8 *cur, const gpr_uint8 *end) {
1101 if (cur == end) {
1102 p->state = parse_string_prefix;
1103 return 1;
1104 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001105
1106 p->strlen = (*cur) & 0x7f;
1107 p->huff = (*cur) >> 7;
Craig Tillera82950e2015-09-22 12:33:20 -07001108 if (p->strlen == 0x7f) {
1109 p->parsing.value = &p->strlen;
1110 return parse_value0(p, cur + 1, end);
1111 } else {
1112 return parse_next(p, cur + 1, end);
1113 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001114}
1115
1116/* append some bytes to a string */
Craig Tillera82950e2015-09-22 12:33:20 -07001117static void append_bytes(grpc_chttp2_hpack_parser_string *str,
1118 const gpr_uint8 *data, size_t length) {
1119 if (length + str->length > str->capacity) {
1120 GPR_ASSERT(str->length + length <= GPR_UINT32_MAX);
1121 str->capacity = (gpr_uint32)(str->length + length);
1122 str->str = gpr_realloc(str->str, str->capacity);
1123 }
1124 memcpy(str->str + str->length, data, length);
1125 GPR_ASSERT(length <= GPR_UINT32_MAX - str->length);
1126 str->length += (gpr_uint32)length;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001127}
1128
Craig Tillera82950e2015-09-22 12:33:20 -07001129static int append_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1130 const gpr_uint8 *end) {
ctiller33023c42014-12-12 16:28:33 -08001131 grpc_chttp2_hpack_parser_string *str = p->parsing.str;
1132 gpr_uint32 bits;
1133 gpr_uint8 decoded[3];
Craig Tillera82950e2015-09-22 12:33:20 -07001134 switch ((binary_state)p->binary) {
ctiller33023c42014-12-12 16:28:33 -08001135 case NOT_BINARY:
Craig Tillera82950e2015-09-22 12:33:20 -07001136 append_bytes(str, cur, (size_t)(end - cur));
ctiller33023c42014-12-12 16:28:33 -08001137 return 1;
1138 b64_byte0:
1139 case B64_BYTE0:
Craig Tillera82950e2015-09-22 12:33:20 -07001140 if (cur == end) {
1141 p->binary = B64_BYTE0;
1142 return 1;
1143 }
ctiller33023c42014-12-12 16:28:33 -08001144 bits = inverse_base64[*cur];
1145 ++cur;
1146 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001147 return 0;
ctiller33023c42014-12-12 16:28:33 -08001148 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001149 goto b64_byte0;
ctiller33023c42014-12-12 16:28:33 -08001150 p->base64_buffer = bits << 18;
Craig Tillera82950e2015-09-22 12:33:20 -07001151 /* fallthrough */
ctiller33023c42014-12-12 16:28:33 -08001152 b64_byte1:
1153 case B64_BYTE1:
Craig Tillera82950e2015-09-22 12:33:20 -07001154 if (cur == end) {
1155 p->binary = B64_BYTE1;
1156 return 1;
1157 }
ctiller33023c42014-12-12 16:28:33 -08001158 bits = inverse_base64[*cur];
1159 ++cur;
1160 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001161 return 0;
ctiller33023c42014-12-12 16:28:33 -08001162 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001163 goto b64_byte1;
ctiller33023c42014-12-12 16:28:33 -08001164 p->base64_buffer |= bits << 12;
Craig Tillera82950e2015-09-22 12:33:20 -07001165 /* fallthrough */
ctiller33023c42014-12-12 16:28:33 -08001166 b64_byte2:
1167 case B64_BYTE2:
Craig Tillera82950e2015-09-22 12:33:20 -07001168 if (cur == end) {
1169 p->binary = B64_BYTE2;
1170 return 1;
1171 }
ctiller33023c42014-12-12 16:28:33 -08001172 bits = inverse_base64[*cur];
1173 ++cur;
1174 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001175 return 0;
ctiller33023c42014-12-12 16:28:33 -08001176 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001177 goto b64_byte2;
ctiller33023c42014-12-12 16:28:33 -08001178 p->base64_buffer |= bits << 6;
Craig Tillera82950e2015-09-22 12:33:20 -07001179 /* fallthrough */
ctiller33023c42014-12-12 16:28:33 -08001180 b64_byte3:
1181 case B64_BYTE3:
Craig Tillera82950e2015-09-22 12:33:20 -07001182 if (cur == end) {
1183 p->binary = B64_BYTE3;
1184 return 1;
1185 }
ctiller33023c42014-12-12 16:28:33 -08001186 bits = inverse_base64[*cur];
1187 ++cur;
1188 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001189 return 0;
ctiller33023c42014-12-12 16:28:33 -08001190 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001191 goto b64_byte3;
ctiller33023c42014-12-12 16:28:33 -08001192 p->base64_buffer |= bits;
1193 bits = p->base64_buffer;
Craig Tillera82950e2015-09-22 12:33:20 -07001194 decoded[0] = (gpr_uint8)(bits >> 16);
1195 decoded[1] = (gpr_uint8)(bits >> 8);
1196 decoded[2] = (gpr_uint8)(bits);
1197 append_bytes(str, decoded, 3);
ctiller33023c42014-12-12 16:28:33 -08001198 goto b64_byte0;
Craig Tillera82950e2015-09-22 12:33:20 -07001199 }
yang-gb063c872015-10-07 11:40:13 -07001200 GPR_UNREACHABLE_CODE(return 1);
ctiller33023c42014-12-12 16:28:33 -08001201}
1202
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001203/* append a null terminator to a string */
Craig Tillera82950e2015-09-22 12:33:20 -07001204static int finish_str(grpc_chttp2_hpack_parser *p) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001205 gpr_uint8 terminator = 0;
ctiller33023c42014-12-12 16:28:33 -08001206 gpr_uint8 decoded[2];
1207 gpr_uint32 bits;
1208 grpc_chttp2_hpack_parser_string *str = p->parsing.str;
Craig Tillera82950e2015-09-22 12:33:20 -07001209 switch ((binary_state)p->binary) {
ctiller33023c42014-12-12 16:28:33 -08001210 case NOT_BINARY:
1211 break;
1212 case B64_BYTE0:
1213 break;
1214 case B64_BYTE1:
Craig Tillera82950e2015-09-22 12:33:20 -07001215 gpr_log(GPR_ERROR, "illegal base64 encoding");
1216 return 0; /* illegal encoding */
ctiller33023c42014-12-12 16:28:33 -08001217 case B64_BYTE2:
1218 bits = p->base64_buffer;
Craig Tillera82950e2015-09-22 12:33:20 -07001219 if (bits & 0xffff) {
1220 gpr_log(GPR_ERROR, "trailing bits in base64 encoding: 0x%04x",
1221 bits & 0xffff);
1222 return 0;
1223 }
1224 decoded[0] = (gpr_uint8)(bits >> 16);
1225 append_bytes(str, decoded, 1);
ctiller33023c42014-12-12 16:28:33 -08001226 break;
1227 case B64_BYTE3:
1228 bits = p->base64_buffer;
Craig Tillera82950e2015-09-22 12:33:20 -07001229 if (bits & 0xff) {
1230 gpr_log(GPR_ERROR, "trailing bits in base64 encoding: 0x%02x",
1231 bits & 0xff);
1232 return 0;
1233 }
1234 decoded[0] = (gpr_uint8)(bits >> 16);
1235 decoded[1] = (gpr_uint8)(bits >> 8);
1236 append_bytes(str, decoded, 2);
ctiller33023c42014-12-12 16:28:33 -08001237 break;
Craig Tillera82950e2015-09-22 12:33:20 -07001238 }
1239 append_bytes(str, &terminator, 1);
1240 p->parsing.str->length--; /* don't actually count the null terminator */
ctiller33023c42014-12-12 16:28:33 -08001241 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001242}
1243
1244/* decode a nibble from a huffman encoded stream */
Craig Tillera82950e2015-09-22 12:33:20 -07001245static int huff_nibble(grpc_chttp2_hpack_parser *p, gpr_uint8 nibble) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001246 gpr_int16 emit = emit_sub_tbl[16 * emit_tbl[p->huff_state] + nibble];
1247 gpr_int16 next = next_sub_tbl[16 * next_tbl[p->huff_state] + nibble];
Craig Tillera82950e2015-09-22 12:33:20 -07001248 if (emit != -1) {
1249 if (emit >= 0 && emit < 256) {
1250 gpr_uint8 c = (gpr_uint8)emit;
1251 if (!append_string(p, &c, (&c) + 1)) return 0;
1252 } else {
1253 assert(emit == 256);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001254 }
Craig Tillera82950e2015-09-22 12:33:20 -07001255 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001256 p->huff_state = next;
ctiller33023c42014-12-12 16:28:33 -08001257 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001258}
1259
1260/* decode full bytes from a huffman encoded stream */
Craig Tillera82950e2015-09-22 12:33:20 -07001261static int add_huff_bytes(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1262 const gpr_uint8 *end) {
1263 for (; cur != end; ++cur) {
1264 if (!huff_nibble(p, *cur >> 4) || !huff_nibble(p, *cur & 0xf)) return 0;
1265 }
ctiller33023c42014-12-12 16:28:33 -08001266 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001267}
1268
1269/* decode some string bytes based on the current decoding mode
1270 (huffman or not) */
Craig Tillera82950e2015-09-22 12:33:20 -07001271static int add_str_bytes(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1272 const gpr_uint8 *end) {
1273 if (p->huff) {
1274 return add_huff_bytes(p, cur, end);
1275 } else {
1276 return append_string(p, cur, end);
1277 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001278}
1279
1280/* parse a string - tries to do large chunks at a time */
Craig Tillera82950e2015-09-22 12:33:20 -07001281static int parse_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1282 const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001283 size_t remaining = p->strlen - p->strgot;
Craig Tillera82950e2015-09-22 12:33:20 -07001284 size_t given = (size_t)(end - cur);
1285 if (remaining <= given) {
1286 return add_str_bytes(p, cur, cur + remaining) && finish_str(p) &&
1287 parse_next(p, cur + remaining, end);
1288 } else {
1289 if (!add_str_bytes(p, cur, cur + given)) return 0;
1290 GPR_ASSERT(given <= GPR_UINT32_MAX - p->strgot);
1291 p->strgot += (gpr_uint32)given;
1292 p->state = parse_string;
1293 return 1;
1294 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001295}
1296
1297/* begin parsing a string - performs setup, calls parse_string */
Craig Tillera82950e2015-09-22 12:33:20 -07001298static int begin_parse_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1299 const gpr_uint8 *end, gpr_uint8 binary,
1300 grpc_chttp2_hpack_parser_string *str) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001301 p->strgot = 0;
1302 str->length = 0;
1303 p->parsing.str = str;
1304 p->huff_state = 0;
ctiller33023c42014-12-12 16:28:33 -08001305 p->binary = binary;
Craig Tillera82950e2015-09-22 12:33:20 -07001306 return parse_string(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001307}
1308
1309/* parse the key string */
Craig Tillera82950e2015-09-22 12:33:20 -07001310static int parse_key_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1311 const gpr_uint8 *end) {
1312 return begin_parse_string(p, cur, end, NOT_BINARY, &p->key);
ctiller33023c42014-12-12 16:28:33 -08001313}
1314
1315/* check if a key represents a binary header or not */
Craig Tillera82950e2015-09-22 12:33:20 -07001316typedef enum { BINARY_HEADER, PLAINTEXT_HEADER, ERROR_HEADER } is_binary_header;
ctiller33023c42014-12-12 16:28:33 -08001317
Craig Tillera82950e2015-09-22 12:33:20 -07001318static is_binary_header is_binary_literal_header(grpc_chttp2_hpack_parser *p) {
1319 return grpc_is_binary_header(p->key.str, p->key.length) ? BINARY_HEADER
1320 : PLAINTEXT_HEADER;
ctiller33023c42014-12-12 16:28:33 -08001321}
1322
Craig Tillera82950e2015-09-22 12:33:20 -07001323static is_binary_header is_binary_indexed_header(grpc_chttp2_hpack_parser *p) {
1324 grpc_mdelem *elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -08001325 if (!elem) {
1326 gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index);
1327 return ERROR_HEADER;
1328 }
Craig Tillera82950e2015-09-22 12:33:20 -07001329 return grpc_is_binary_header(
1330 (const char *)GPR_SLICE_START_PTR(elem->key->slice),
1331 GPR_SLICE_LENGTH(elem->key->slice))
1332 ? BINARY_HEADER
1333 : PLAINTEXT_HEADER;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001334}
1335
1336/* parse the value string */
Craig Tillera82950e2015-09-22 12:33:20 -07001337static int parse_value_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
1338 const gpr_uint8 *end, is_binary_header type) {
1339 switch (type) {
ctiller33023c42014-12-12 16:28:33 -08001340 case BINARY_HEADER:
Craig Tillera82950e2015-09-22 12:33:20 -07001341 return begin_parse_string(p, cur, end, B64_BYTE0, &p->value);
ctiller33023c42014-12-12 16:28:33 -08001342 case PLAINTEXT_HEADER:
Craig Tillera82950e2015-09-22 12:33:20 -07001343 return begin_parse_string(p, cur, end, NOT_BINARY, &p->value);
ctiller33023c42014-12-12 16:28:33 -08001344 case ERROR_HEADER:
1345 return 0;
Craig Tillera82950e2015-09-22 12:33:20 -07001346 }
vpai61cba0b2014-12-15 14:40:45 -08001347 /* Add code to prevent return without value error */
yang-gb063c872015-10-07 11:40:13 -07001348 GPR_UNREACHABLE_CODE(return 0);
ctiller33023c42014-12-12 16:28:33 -08001349}
1350
Craig Tillera82950e2015-09-22 12:33:20 -07001351static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
1352 const gpr_uint8 *cur,
1353 const gpr_uint8 *end) {
1354 return parse_value_string(p, cur, end, is_binary_indexed_header(p));
ctiller33023c42014-12-12 16:28:33 -08001355}
1356
Craig Tillera82950e2015-09-22 12:33:20 -07001357static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p,
1358 const gpr_uint8 *cur,
1359 const gpr_uint8 *end) {
1360 return parse_value_string(p, cur, end, is_binary_literal_header(p));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001361}
1362
1363/* PUBLIC INTERFACE */
1364
Craig Tillera82950e2015-09-22 12:33:20 -07001365static void on_header_not_set(void *user_data, grpc_mdelem *md) {
Craig Tiller535701c2015-12-07 10:09:44 -08001366 GPR_UNREACHABLE_CODE(return );
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001367}
1368
Craig Tillerb2b42612015-11-20 12:02:17 -08001369void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001370 p->on_header = on_header_not_set;
1371 p->on_header_user_data = NULL;
1372 p->state = parse_begin;
1373 p->key.str = NULL;
1374 p->key.capacity = 0;
1375 p->key.length = 0;
1376 p->value.str = NULL;
1377 p->value.capacity = 0;
1378 p->value.length = 0;
Craig Tiller7b01b752015-12-02 16:52:54 -08001379 p->dynamic_table_update_allowed = 2;
Craig Tillerb2b42612015-11-20 12:02:17 -08001380 grpc_chttp2_hptbl_init(&p->table);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001381}
1382
Craig Tillera82950e2015-09-22 12:33:20 -07001383void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
Craig Tillerd1e5fe32015-05-21 14:12:23 -07001384 p->after_prioritization = p->state;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001385 p->state = parse_stream_dep0;
1386}
1387
Craig Tillera82950e2015-09-22 12:33:20 -07001388void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p) {
1389 grpc_chttp2_hptbl_destroy(&p->table);
1390 gpr_free(p->key.str);
1391 gpr_free(p->value.str);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001392}
1393
Craig Tillera82950e2015-09-22 12:33:20 -07001394int grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p,
1395 const gpr_uint8 *beg, const gpr_uint8 *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001396 /* TODO(ctiller): limit the distance of end from beg, and perform multiple
Craig Tiller45724b32015-09-22 10:42:19 -07001397 steps in the event of a large chunk of data to limit
1398 stack space usage when no tail call optimization is
1399 available */
Craig Tillera82950e2015-09-22 12:33:20 -07001400 return p->state(p, beg, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001401}
1402
Craig Tillera82950e2015-09-22 12:33:20 -07001403grpc_chttp2_parse_error grpc_chttp2_header_parser_parse(
1404 grpc_exec_ctx *exec_ctx, void *hpack_parser,
1405 grpc_chttp2_transport_parsing *transport_parsing,
1406 grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001407 grpc_chttp2_hpack_parser *parser = hpack_parser;
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001408 GPR_TIMER_BEGIN("grpc_chttp2_hpack_parser_parse", 0);
Craig Tillera82950e2015-09-22 12:33:20 -07001409 if (!grpc_chttp2_hpack_parser_parse(parser, GPR_SLICE_START_PTR(slice),
1410 GPR_SLICE_END_PTR(slice))) {
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001411 GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
Craig Tillera82950e2015-09-22 12:33:20 -07001412 return GRPC_CHTTP2_CONNECTION_ERROR;
1413 }
1414 if (is_last) {
1415 if (parser->is_boundary && parser->state != parse_begin) {
1416 gpr_log(GPR_ERROR,
1417 "end of header frame not aligned with a hpack record boundary");
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001418 GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001419 return GRPC_CHTTP2_CONNECTION_ERROR;
1420 }
Craig Tillerc3218142015-12-08 08:30:39 -08001421 /* need to check for null stream: this can occur if we receive an invalid
1422 stream id on a header */
1423 if (stream_parsing != NULL) {
1424 if (parser->is_boundary) {
1425 stream_parsing
1426 ->got_metadata_on_parse[stream_parsing->header_frames_received] = 1;
1427 stream_parsing->header_frames_received++;
1428 grpc_chttp2_list_add_parsing_seen_stream(transport_parsing,
1429 stream_parsing);
1430 }
1431 if (parser->is_eof) {
1432 stream_parsing->received_close = 1;
1433 }
Craig Tillera82950e2015-09-22 12:33:20 -07001434 }
1435 parser->on_header = on_header_not_set;
1436 parser->on_header_user_data = NULL;
1437 parser->is_boundary = 0xde;
1438 parser->is_eof = 0xde;
Craig Tiller7b01b752015-12-02 16:52:54 -08001439 parser->dynamic_table_update_allowed = 2;
Craig Tillera82950e2015-09-22 12:33:20 -07001440 }
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001441 GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001442 return GRPC_CHTTP2_PARSE_OK;
Craig Tiller190d3602015-02-18 09:23:38 -08001443}