blob: d41ebab1473f69d758b66321f814d40027886c29 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
murgatroid99c3910ca2016-01-06 13:14:23 -08003 * Copyright 2015-2016, 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
Craig Tiller9533d042016-03-25 17:11:06 -070034#include "src/core/lib/transport/chttp2/hpack_parser.h"
35#include "src/core/lib/transport/chttp2/internal.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
Craig Tillerf40df232016-03-25 13:38:14 -070037#include <assert.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080038#include <stddef.h>
39#include <string.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040
murgatroid99c3910ca2016-01-06 13:14:23 -080041/* This is here for grpc_is_binary_header
42 * TODO(murgatroid99): Remove this
43 */
44#include <grpc/grpc.h>
45
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080046#include <grpc/support/alloc.h>
47#include <grpc/support/log.h>
48#include <grpc/support/port_platform.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080049#include <grpc/support/useful.h>
50
Craig Tiller9533d042016-03-25 17:11:06 -070051#include "src/core/lib/profiling/timers.h"
52#include "src/core/lib/support/string.h"
53#include "src/core/lib/transport/chttp2/bin_encoder.h"
Craig Tiller9d35a1f2015-11-02 14:16:12 -080054
Craig Tillera82950e2015-09-22 12:33:20 -070055typedef enum {
ctiller33023c42014-12-12 16:28:33 -080056 NOT_BINARY,
57 B64_BYTE0,
58 B64_BYTE1,
59 B64_BYTE2,
60 B64_BYTE3
61} binary_state;
62
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080063/* How parsing works:
64
65 The parser object keeps track of a function pointer which represents the
66 current parse state.
67
68 Each time new bytes are presented, we call into the current state, which
69 recursively parses until all bytes in the given chunk are exhausted.
70
71 The parse state that terminates then saves its function pointer to be the
72 current state so that it can resume when more bytes are available.
73
74 It's expected that most optimizing compilers will turn this code into
75 a set of indirect jumps, and so not waste stack space. */
76
77/* forward declarations for parsing states */
Craig Tiller7536af02015-12-22 13:49:30 -080078static int parse_begin(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
79 const uint8_t *end);
80static int parse_error(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
81 const uint8_t *end);
82static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
83 const uint8_t *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080084
Craig Tiller7536af02015-12-22 13:49:30 -080085static int parse_string_prefix(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
86 const uint8_t *end);
87static int parse_key_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
88 const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -070089static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -080090 const uint8_t *cur,
91 const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -070092static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -080093 const uint8_t *cur,
94 const uint8_t *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080095
Craig Tiller7536af02015-12-22 13:49:30 -080096static int parse_value0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
97 const uint8_t *end);
98static int parse_value1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
99 const uint8_t *end);
100static int parse_value2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
101 const uint8_t *end);
102static int parse_value3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
103 const uint8_t *end);
104static int parse_value4(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
105 const uint8_t *end);
106static int parse_value5up(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
107 const uint8_t *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800108
Craig Tiller7536af02015-12-22 13:49:30 -0800109static int parse_indexed_field(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
110 const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700111static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800112 const uint8_t *cur, const uint8_t *end);
113static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
114 const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700115static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800116 const uint8_t *cur, const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700117static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800118 const uint8_t *cur, const uint8_t *end);
119static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
120 const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700121static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800122 const uint8_t *cur, const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700123static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800124 const uint8_t *cur, const uint8_t *end);
125static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
126 const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700127static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800128 const uint8_t *cur, const uint8_t *end);
Craig Tillera82950e2015-09-22 12:33:20 -0700129static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800130 const uint8_t *cur, const uint8_t *end);
131static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
132 const uint8_t *end);
133static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
134 const uint8_t *end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800135
136/* we translate the first byte of a hpack field into one of these decoding
137 cases, then use a lookup table to jump directly to the appropriate parser.
138
139 _X => the integer index is all ones, meaning we need to do varint decoding
140 _V => the integer index is all zeros, meaning we need to decode an additional
141 string value */
Craig Tillera82950e2015-09-22 12:33:20 -0700142typedef enum {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800143 INDEXED_FIELD,
144 INDEXED_FIELD_X,
145 LITHDR_INCIDX,
146 LITHDR_INCIDX_X,
147 LITHDR_INCIDX_V,
148 LITHDR_NOTIDX,
149 LITHDR_NOTIDX_X,
150 LITHDR_NOTIDX_V,
151 LITHDR_NVRIDX,
152 LITHDR_NVRIDX_X,
153 LITHDR_NVRIDX_V,
154 MAX_TBL_SIZE,
155 MAX_TBL_SIZE_X,
156 ILLEGAL
157} first_byte_type;
158
159/* jump table of parse state functions -- order must match first_byte_type
160 above */
161static const grpc_chttp2_hpack_parser_state first_byte_action[] = {
Craig Tiller71a0f9d2015-09-28 17:22:01 -0700162 parse_indexed_field, parse_indexed_field_x, parse_lithdr_incidx,
163 parse_lithdr_incidx_x, parse_lithdr_incidx_v, parse_lithdr_notidx,
164 parse_lithdr_notidx_x, parse_lithdr_notidx_v, parse_lithdr_nvridx,
165 parse_lithdr_nvridx_x, parse_lithdr_nvridx_v, parse_max_tbl_size,
Craig Tiller027a74c2015-11-10 08:37:46 +0000166 parse_max_tbl_size_x, parse_illegal_op};
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800167
168/* indexes the first byte to a parse state function - generated by
169 gen_hpack_tables.c */
Craig Tiller7536af02015-12-22 13:49:30 -0800170static const uint8_t first_byte_lut[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700171 LITHDR_NOTIDX_V, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
172 LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
173 LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
174 LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX_X,
175 LITHDR_NVRIDX_V, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
176 LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
177 LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
178 LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX_X,
Craig Tiller027a74c2015-11-10 08:37:46 +0000179 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
Craig Tillera82950e2015-09-22 12:33:20 -0700180 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,
182 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
183 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
184 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
185 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
186 MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE_X,
187 LITHDR_INCIDX_V, 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,
198 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
199 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
200 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
201 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
202 LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX_X,
203 ILLEGAL, 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,
230 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
231 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
232 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
233 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
234 INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD_X,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700235};
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800236
237/* state table for huffman decoding: given a state, gives an index/16 into
238 next_sub_tbl. Taking that index and adding the value of the nibble being
239 considered returns the next state.
240
241 generated by gen_hpack_tables.c */
Craig Tiller7536af02015-12-22 13:49:30 -0800242static const uint8_t next_tbl[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700243 0, 1, 2, 3, 4, 1, 2, 5, 6, 1, 7, 8, 1, 3, 3, 9, 10, 11, 1, 1,
244 1, 12, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
245 14, 1, 15, 16, 1, 17, 1, 15, 2, 7, 3, 18, 19, 1, 1, 1, 1, 20, 1, 1,
246 1, 1, 1, 1, 1, 1, 1, 1, 15, 2, 2, 7, 21, 1, 22, 1, 1, 1, 1, 1,
247 1, 1, 1, 15, 2, 2, 2, 2, 2, 2, 23, 24, 25, 1, 1, 1, 1, 2, 2, 2,
248 26, 3, 3, 27, 10, 28, 1, 1, 1, 1, 1, 1, 2, 3, 29, 10, 30, 1, 1, 1,
249 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 2,
250 2, 2, 2, 2, 2, 2, 2, 32, 1, 1, 15, 33, 1, 34, 35, 9, 36, 1, 1, 1,
251 1, 1, 1, 1, 37, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 26, 9,
252 38, 1, 1, 1, 1, 1, 1, 1, 15, 2, 2, 2, 2, 26, 3, 3, 39, 1, 1, 1,
253 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 7, 3, 3, 3, 40, 2,
254 41, 1, 1, 1, 42, 43, 1, 1, 44, 1, 1, 1, 1, 15, 2, 2, 2, 2, 2, 2,
255 3, 3, 3, 45, 46, 1, 1, 2, 2, 2, 35, 3, 3, 18, 47, 2,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700256};
Craig Tiller45724b32015-09-22 10:42:19 -0700257
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800258/* next state, based upon current state and the current nibble: see above.
259 generated by gen_hpack_tables.c */
Craig Tiller7536af02015-12-22 13:49:30 -0800260static const int16_t next_sub_tbl[48 * 16] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700261 1, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
262 218, 2, 6, 10, 13, 14, 15, 16, 17, 2, 6, 10, 13, 14, 15,
263 16, 17, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7, 11, 24, 3,
264 7, 11, 24, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8,
265 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
266 199, 200, 201, 202, 203, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0,
267 0, 0, 0, 0, 0, 0, 9, 133, 134, 135, 136, 137, 138, 139, 140,
268 141, 142, 143, 144, 145, 146, 147, 3, 7, 11, 24, 3, 7, 11, 24,
269 4, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0,
270 0, 0, 0, 0, 0, 0, 0, 12, 132, 4, 8, 4, 8, 4, 8,
271 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
272 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
273 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 4, 8, 4,
274 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 22, 23, 91, 25, 26,
275 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 3,
276 7, 11, 24, 3, 7, 11, 24, 0, 0, 0, 0, 0, 41, 42, 43,
277 2, 6, 10, 13, 14, 15, 16, 17, 3, 7, 11, 24, 3, 7, 11,
278 24, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0,
279 44, 45, 2, 6, 10, 13, 14, 15, 16, 17, 46, 47, 48, 49, 50,
280 51, 52, 57, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
281 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
283 68, 69, 70, 71, 72, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0,
284 0, 0, 0, 0, 0, 0, 73, 75, 76, 77, 78, 79, 80, 81, 82,
285 83, 84, 85, 86, 87, 88, 89, 90, 3, 7, 11, 24, 3, 7, 11,
286 24, 3, 7, 11, 24, 0, 0, 0, 0, 3, 7, 11, 24, 3, 7,
287 11, 24, 4, 8, 4, 8, 0, 0, 0, 92, 0, 0, 0, 93, 94,
288 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 3, 7, 11, 24,
289 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4,
290 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
291 0, 0, 0, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 4,
292 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0,
293 0, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
294 131, 2, 6, 10, 13, 14, 15, 16, 17, 4, 8, 4, 8, 4, 8,
295 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 148,
296 149, 150, 151, 3, 7, 11, 24, 4, 8, 4, 8, 0, 0, 0, 0,
297 0, 0, 152, 153, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7, 11,
298 24, 154, 155, 156, 164, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7,
299 11, 24, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 171, 172,
301 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
302 188, 189, 190, 191, 192, 193, 194, 195, 196, 4, 8, 4, 8, 4, 8,
303 4, 8, 4, 8, 4, 8, 4, 8, 197, 198, 4, 8, 4, 8, 4,
304 8, 4, 8, 0, 0, 0, 0, 0, 0, 219, 220, 3, 7, 11, 24,
305 4, 8, 4, 8, 4, 8, 0, 0, 221, 222, 223, 224, 3, 7, 11,
306 24, 3, 7, 11, 24, 4, 8, 4, 8, 4, 8, 225, 228, 4, 8,
307 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 229,
308 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
309 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0,
310 0, 0, 0, 0, 0, 0, 0, 245, 246, 247, 248, 249, 250, 251, 252,
311 253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
312 0, 0, 255,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700313};
Craig Tiller45724b32015-09-22 10:42:19 -0700314
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800315/* emission table: indexed like next_tbl, ultimately gives the byte to be
316 emitted, or -1 for no byte, or 256 for end of stream
317
318 generated by gen_hpack_tables.c */
Craig Tiller7536af02015-12-22 13:49:30 -0800319static const uint16_t emit_tbl[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700320 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 13,
321 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 23, 24, 25, 26, 27,
322 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
323 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0, 55, 56,
324 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 0,
325 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
326 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
327 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
328 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
329 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
330 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 0,
331 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
332 0, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
333 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
334 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
335 219, 220, 221, 0, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
336 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
337 248,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700338};
Craig Tiller45724b32015-09-22 10:42:19 -0700339
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800340/* generated by gen_hpack_tables.c */
Craig Tiller7536af02015-12-22 13:49:30 -0800341static const int16_t emit_sub_tbl[249 * 16] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700342 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
343 -1, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49,
344 49, 49, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 97,
345 97, 97, 97, 48, 48, 49, 49, 50, 50, 97, 97, 99, 99, 101, 101,
346 105, 105, 111, 111, 48, 49, 50, 97, 99, 101, 105, 111, 115, 116, -1,
347 -1, -1, -1, -1, -1, 32, 32, 32, 32, 32, 32, 32, 32, 37, 37,
348 37, 37, 37, 37, 37, 37, 99, 99, 99, 99, 101, 101, 101, 101, 105,
349 105, 105, 105, 111, 111, 111, 111, 115, 115, 116, 116, 32, 37, 45, 46,
350 47, 51, 52, 53, 54, 55, 56, 57, 61, 61, 61, 61, 61, 61, 61,
351 61, 65, 65, 65, 65, 65, 65, 65, 65, 115, 115, 115, 115, 116, 116,
352 116, 116, 32, 32, 37, 37, 45, 45, 46, 46, 61, 65, 95, 98, 100,
353 102, 103, 104, 108, 109, 110, 112, 114, 117, -1, -1, 58, 58, 58, 58,
354 58, 58, 58, 58, 66, 66, 66, 66, 66, 66, 66, 66, 47, 47, 51,
355 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 61, 61,
356 65, 65, 95, 95, 98, 98, 100, 100, 102, 102, 103, 103, 104, 104, 108,
357 108, 109, 109, 110, 110, 112, 112, 114, 114, 117, 117, 58, 66, 67, 68,
358 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
359 84, 85, 86, 87, 89, 106, 107, 113, 118, 119, 120, 121, 122, -1, -1,
360 -1, -1, 38, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42,
361 42, 42, 42, 44, 44, 44, 44, 44, 44, 44, 44, 59, 59, 59, 59,
362 59, 59, 59, 59, 88, 88, 88, 88, 88, 88, 88, 88, 90, 90, 90,
363 90, 90, 90, 90, 90, 33, 33, 34, 34, 40, 40, 41, 41, 63, 63,
364 39, 43, 124, -1, -1, -1, 35, 35, 35, 35, 35, 35, 35, 35, 62,
365 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 36, 36, 36, 36,
366 64, 64, 64, 64, 91, 91, 91, 91, 69, 69, 69, 69, 69, 69, 69,
367 69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71,
368 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73,
369 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75,
370 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77,
371 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79,
372 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81,
373 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82,
374 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84,
375 84, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86,
376 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 89, 89, 89, 89, 89,
377 89, 89, 89, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107,
378 107, 107, 107, 107, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118,
379 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120,
380 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 122,
381 122, 122, 122, 122, 122, 122, 122, 38, 38, 38, 38, 42, 42, 42, 42,
382 44, 44, 44, 44, 59, 59, 59, 59, 88, 88, 88, 88, 90, 90, 90,
383 90, 33, 34, 40, 41, 63, -1, -1, -1, 39, 39, 39, 39, 39, 39,
384 39, 39, 43, 43, 43, 43, 43, 43, 43, 43, 124, 124, 124, 124, 124,
385 124, 124, 124, 35, 35, 35, 35, 62, 62, 62, 62, 0, 0, 36, 36,
386 64, 64, 91, 91, 93, 93, 126, 126, 94, 125, -1, -1, 60, 60, 60,
387 60, 60, 60, 60, 60, 96, 96, 96, 96, 96, 96, 96, 96, 123, 123,
388 123, 123, 123, 123, 123, 123, -1, -1, -1, -1, -1, -1, -1, -1, 92,
389 92, 92, 92, 92, 92, 92, 92, 195, 195, 195, 195, 195, 195, 195, 195,
390 208, 208, 208, 208, 208, 208, 208, 208, 128, 128, 128, 128, 130, 130, 130,
391 130, 131, 131, 131, 131, 162, 162, 162, 162, 184, 184, 184, 184, 194, 194,
392 194, 194, 224, 224, 224, 224, 226, 226, 226, 226, 153, 153, 161, 161, 167,
393 167, 172, 172, 176, 176, 177, 177, 179, 179, 209, 209, 216, 216, 217, 217,
394 227, 227, 229, 229, 230, 230, 129, 132, 133, 134, 136, 146, 154, 156, 160,
395 163, 164, 169, 170, 173, 178, 181, 185, 186, 187, 189, 190, 196, 198, 228,
396 232, 233, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 135,
397 135, 135, 135, 135, 135, 135, 135, 137, 137, 137, 137, 137, 137, 137, 137,
398 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139,
399 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141,
400 141, 141, 143, 143, 143, 143, 143, 143, 143, 143, 147, 147, 147, 147, 147,
401 147, 147, 147, 149, 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, 150,
402 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
403 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 157, 157,
404 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 165,
405 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
406 168, 168, 168, 168, 168, 168, 168, 168, 174, 174, 174, 174, 174, 174, 174,
407 174, 175, 175, 175, 175, 175, 175, 175, 175, 180, 180, 180, 180, 180, 180,
408 180, 180, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183,
409 183, 183, 183, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191,
410 191, 191, 191, 191, 197, 197, 197, 197, 197, 197, 197, 197, 231, 231, 231,
411 231, 231, 231, 231, 231, 239, 239, 239, 239, 239, 239, 239, 239, 9, 9,
412 9, 9, 142, 142, 142, 142, 144, 144, 144, 144, 145, 145, 145, 145, 148,
413 148, 148, 148, 159, 159, 159, 159, 171, 171, 171, 171, 206, 206, 206, 206,
414 215, 215, 215, 215, 225, 225, 225, 225, 236, 236, 236, 236, 237, 237, 237,
415 237, 199, 199, 207, 207, 234, 234, 235, 235, 192, 193, 200, 201, 202, 205,
416 210, 213, 218, 219, 238, 240, 242, 243, 255, -1, 203, 203, 203, 203, 203,
417 203, 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, 211, 211, 211, 211,
418 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 214, 214, 214,
419 214, 214, 214, 214, 214, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222,
420 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, 241,
421 241, 241, 241, 241, 241, 241, 241, 244, 244, 244, 244, 244, 244, 244, 244,
422 245, 245, 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246,
423 246, 247, 247, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, 248,
424 248, 248, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251,
425 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253,
426 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 2, 2, 2,
427 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
428 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 11, 11, 11, 11, 12,
429 12, 12, 12, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
430 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20,
431 20, 21, 21, 21, 21, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25,
432 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29,
433 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 127, 127, 127, 127,
434 220, 220, 220, 220, 249, 249, 249, 249, 10, 13, 22, 256, 93, 93, 93,
435 93, 126, 126, 126, 126, 94, 94, 125, 125, 60, 96, 123, -1, 92, 195,
436 208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 128,
437 128, 128, 128, 128, 128, 128, 128, 130, 130, 130, 130, 130, 130, 130, 130,
438 131, 131, 131, 131, 131, 131, 131, 131, 162, 162, 162, 162, 162, 162, 162,
439 162, 184, 184, 184, 184, 184, 184, 184, 184, 194, 194, 194, 194, 194, 194,
440 194, 194, 224, 224, 224, 224, 224, 224, 224, 224, 226, 226, 226, 226, 226,
441 226, 226, 226, 153, 153, 153, 153, 161, 161, 161, 161, 167, 167, 167, 167,
442 172, 172, 172, 172, 176, 176, 176, 176, 177, 177, 177, 177, 179, 179, 179,
443 179, 209, 209, 209, 209, 216, 216, 216, 216, 217, 217, 217, 217, 227, 227,
444 227, 227, 229, 229, 229, 229, 230, 230, 230, 230, 129, 129, 132, 132, 133,
445 133, 134, 134, 136, 136, 146, 146, 154, 154, 156, 156, 160, 160, 163, 163,
446 164, 164, 169, 169, 170, 170, 173, 173, 178, 178, 181, 181, 185, 185, 186,
447 186, 187, 187, 189, 189, 190, 190, 196, 196, 198, 198, 228, 228, 232, 232,
448 233, 233, 1, 135, 137, 138, 139, 140, 141, 143, 147, 149, 150, 151, 152,
449 155, 157, 158, 165, 166, 168, 174, 175, 180, 182, 183, 188, 191, 197, 231,
450 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, 9,
451 9, 9, 9, 9, 9, 142, 142, 142, 142, 142, 142, 142, 142, 144, 144,
452 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 148,
453 148, 148, 148, 148, 148, 148, 148, 159, 159, 159, 159, 159, 159, 159, 159,
454 171, 171, 171, 171, 171, 171, 171, 171, 206, 206, 206, 206, 206, 206, 206,
455 206, 215, 215, 215, 215, 215, 215, 215, 215, 225, 225, 225, 225, 225, 225,
456 225, 225, 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237,
457 237, 237, 237, 199, 199, 199, 199, 207, 207, 207, 207, 234, 234, 234, 234,
458 235, 235, 235, 235, 192, 192, 193, 193, 200, 200, 201, 201, 202, 202, 205,
459 205, 210, 210, 213, 213, 218, 218, 219, 219, 238, 238, 240, 240, 242, 242,
460 243, 243, 255, 255, 203, 204, 211, 212, 214, 221, 222, 223, 241, 244, 245,
461 246, 247, 248, 250, 251, 252, 253, 254, -1, -1, -1, -1, -1, -1, -1,
462 -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2,
463 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
464 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
465 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
466 8, 8, 8, 8, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12,
467 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15,
468 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
469 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18,
470 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20,
471 20, 21, 21, 21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23,
472 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25,
473 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27,
474 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29,
475 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31,
476 31, 31, 31, 31, 31, 31, 127, 127, 127, 127, 127, 127, 127, 127, 220,
477 220, 220, 220, 220, 220, 220, 220, 249, 249, 249, 249, 249, 249, 249, 249,
478 10, 10, 13, 13, 22, 22, 256, 256, 67, 67, 67, 67, 67, 67, 67,
479 67, 68, 68, 68, 68, 68, 68, 68, 68, 95, 95, 95, 95, 95, 95,
480 95, 95, 98, 98, 98, 98, 98, 98, 98, 98, 100, 100, 100, 100, 100,
481 100, 100, 100, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103,
482 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 108, 108, 108,
483 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110,
484 110, 110, 110, 110, 110, 110, 112, 112, 112, 112, 112, 112, 112, 112, 114,
485 114, 114, 114, 114, 114, 114, 114, 117, 117, 117, 117, 117, 117, 117, 117,
486 58, 58, 58, 58, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68,
487 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72,
488 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76,
489 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79,
490 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83,
491 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87,
492 87, 87, 89, 89, 89, 89, 106, 106, 106, 106, 107, 107, 107, 107, 113,
493 113, 113, 113, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120,
494 121, 121, 121, 121, 122, 122, 122, 122, 38, 38, 42, 42, 44, 44, 59,
495 59, 88, 88, 90, 90, -1, -1, -1, -1, 33, 33, 33, 33, 33, 33,
496 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 40, 40, 40, 40, 40,
497 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 63, 63, 63, 63,
498 63, 63, 63, 63, 39, 39, 39, 39, 43, 43, 43, 43, 124, 124, 124,
499 124, 35, 35, 62, 62, 0, 36, 64, 91, 93, 126, -1, -1, 94, 94,
500 94, 94, 94, 94, 94, 94, 125, 125, 125, 125, 125, 125, 125, 125, 60,
501 60, 60, 60, 96, 96, 96, 96, 123, 123, 123, 123, -1, -1, -1, -1,
502 92, 92, 92, 92, 195, 195, 195, 195, 208, 208, 208, 208, 128, 128, 130,
503 130, 131, 131, 162, 162, 184, 184, 194, 194, 224, 224, 226, 226, 153, 161,
504 167, 172, 176, 177, 179, 209, 216, 217, 227, 229, 230, -1, -1, -1, -1,
505 -1, -1, -1, 129, 129, 129, 129, 129, 129, 129, 129, 132, 132, 132, 132,
506 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
507 134, 134, 134, 134, 134, 136, 136, 136, 136, 136, 136, 136, 136, 146, 146,
508 146, 146, 146, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, 156,
509 156, 156, 156, 156, 156, 156, 156, 160, 160, 160, 160, 160, 160, 160, 160,
510 163, 163, 163, 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
511 164, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
512 170, 170, 173, 173, 173, 173, 173, 173, 173, 173, 178, 178, 178, 178, 178,
513 178, 178, 178, 181, 181, 181, 181, 181, 181, 181, 181, 185, 185, 185, 185,
514 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187,
515 187, 187, 187, 187, 187, 189, 189, 189, 189, 189, 189, 189, 189, 190, 190,
516 190, 190, 190, 190, 190, 190, 196, 196, 196, 196, 196, 196, 196, 196, 198,
517 198, 198, 198, 198, 198, 198, 198, 228, 228, 228, 228, 228, 228, 228, 228,
518 232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233,
519 233, 1, 1, 1, 1, 135, 135, 135, 135, 137, 137, 137, 137, 138, 138,
520 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 143,
521 143, 143, 143, 147, 147, 147, 147, 149, 149, 149, 149, 150, 150, 150, 150,
522 151, 151, 151, 151, 152, 152, 152, 152, 155, 155, 155, 155, 157, 157, 157,
523 157, 158, 158, 158, 158, 165, 165, 165, 165, 166, 166, 166, 166, 168, 168,
524 168, 168, 174, 174, 174, 174, 175, 175, 175, 175, 180, 180, 180, 180, 182,
525 182, 182, 182, 183, 183, 183, 183, 188, 188, 188, 188, 191, 191, 191, 191,
526 197, 197, 197, 197, 231, 231, 231, 231, 239, 239, 239, 239, 9, 9, 142,
527 142, 144, 144, 145, 145, 148, 148, 159, 159, 171, 171, 206, 206, 215, 215,
528 225, 225, 236, 236, 237, 237, 199, 207, 234, 235, 192, 192, 192, 192, 192,
529 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 200, 200, 200, 200,
530 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, 202, 202, 202,
531 202, 202, 202, 202, 202, 205, 205, 205, 205, 205, 205, 205, 205, 210, 210,
532 210, 210, 210, 210, 210, 210, 213, 213, 213, 213, 213, 213, 213, 213, 218,
533 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219,
534 238, 238, 238, 238, 238, 238, 238, 238, 240, 240, 240, 240, 240, 240, 240,
535 240, 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243,
536 243, 243, 255, 255, 255, 255, 255, 255, 255, 255, 203, 203, 203, 203, 204,
537 204, 204, 204, 211, 211, 211, 211, 212, 212, 212, 212, 214, 214, 214, 214,
538 221, 221, 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, 241, 241, 241,
539 241, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246, 247, 247,
540 247, 247, 248, 248, 248, 248, 250, 250, 250, 250, 251, 251, 251, 251, 252,
541 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 2, 2, 3, 3,
542 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 11, 11, 12, 12, 14,
543 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21,
544 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
545 30, 31, 31, 127, 127, 220, 220, 249, 249, -1, -1, 10, 10, 10, 10,
546 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 22, 22, 22,
547 22, 22, 22, 22, 22, 256, 256, 256, 256, 256, 256, 256, 256, 45, 45,
548 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 47,
549 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51,
550 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53,
551 53, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55,
552 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57,
553 57, 57, 57, 50, 50, 50, 50, 50, 50, 50, 50, 97, 97, 97, 97,
554 97, 97, 97, 97, 99, 99, 99, 99, 99, 99, 99, 99, 101, 101, 101,
555 101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 105, 105, 105, 111, 111,
556 111, 111, 111, 111, 111, 111, 115, 115, 115, 115, 115, 115, 115, 115, 116,
557 116, 116, 116, 116, 116, 116, 116, 32, 32, 32, 32, 37, 37, 37, 37,
558 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 51, 51, 51,
559 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55,
560 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 61, 61, 61, 61, 65,
561 65, 65, 65, 95, 95, 95, 95, 98, 98, 98, 98, 100, 100, 100, 100,
562 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 108, 108, 108,
563 108, 109, 109, 109, 109, 110, 110, 110, 110, 112, 112, 112, 112, 114, 114,
564 114, 114, 117, 117, 117, 117, 58, 58, 66, 66, 67, 67, 68, 68, 69,
565 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76,
566 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84,
567 84, 85, 85, 86, 86, 87, 87, 89, 89, 106, 106, 107, 107, 113, 113,
568 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 38, 42, 44, 59, 88,
569 90, -1, -1, 33, 33, 33, 33, 34, 34, 34, 34, 40, 40, 40, 40,
570 41, 41, 41, 41, 63, 63, 63, 63, 39, 39, 43, 43, 124, 124, 35,
571 62, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
572 36, 36, 36, 36, 36, 36, 64, 64, 64, 64, 64, 64, 64, 64, 91,
573 91, 91, 91, 91, 91, 91, 91, 93, 93, 93, 93, 93, 93, 93, 93,
574 126, 126, 126, 126, 126, 126, 126, 126, 94, 94, 94, 94, 125, 125, 125,
575 125, 60, 60, 96, 96, 123, 123, -1, -1, 92, 92, 195, 195, 208, 208,
576 128, 130, 131, 162, 184, 194, 224, 226, -1, -1, 153, 153, 153, 153, 153,
577 153, 153, 153, 161, 161, 161, 161, 161, 161, 161, 161, 167, 167, 167, 167,
578 167, 167, 167, 167, 172, 172, 172, 172, 172, 172, 172, 172, 176, 176, 176,
579 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 179, 179,
580 179, 179, 179, 179, 179, 179, 209, 209, 209, 209, 209, 209, 209, 209, 216,
581 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217,
582 227, 227, 227, 227, 227, 227, 227, 227, 229, 229, 229, 229, 229, 229, 229,
583 229, 230, 230, 230, 230, 230, 230, 230, 230, 129, 129, 129, 129, 132, 132,
584 132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 136, 136, 136, 136, 146,
585 146, 146, 146, 154, 154, 154, 154, 156, 156, 156, 156, 160, 160, 160, 160,
586 163, 163, 163, 163, 164, 164, 164, 164, 169, 169, 169, 169, 170, 170, 170,
587 170, 173, 173, 173, 173, 178, 178, 178, 178, 181, 181, 181, 181, 185, 185,
588 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 189, 189, 189, 189, 190,
589 190, 190, 190, 196, 196, 196, 196, 198, 198, 198, 198, 228, 228, 228, 228,
590 232, 232, 232, 232, 233, 233, 233, 233, 1, 1, 135, 135, 137, 137, 138,
591 138, 139, 139, 140, 140, 141, 141, 143, 143, 147, 147, 149, 149, 150, 150,
592 151, 151, 152, 152, 155, 155, 157, 157, 158, 158, 165, 165, 166, 166, 168,
593 168, 174, 174, 175, 175, 180, 180, 182, 182, 183, 183, 188, 188, 191, 191,
594 197, 197, 231, 231, 239, 239, 9, 142, 144, 145, 148, 159, 171, 206, 215,
595 225, 236, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199, 199,
596 199, 199, 199, 199, 199, 199, 207, 207, 207, 207, 207, 207, 207, 207, 234,
597 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235,
598 192, 192, 192, 192, 193, 193, 193, 193, 200, 200, 200, 200, 201, 201, 201,
599 201, 202, 202, 202, 202, 205, 205, 205, 205, 210, 210, 210, 210, 213, 213,
600 213, 213, 218, 218, 218, 218, 219, 219, 219, 219, 238, 238, 238, 238, 240,
601 240, 240, 240, 242, 242, 242, 242, 243, 243, 243, 243, 255, 255, 255, 255,
602 203, 203, 204, 204, 211, 211, 212, 212, 214, 214, 221, 221, 222, 222, 223,
603 223, 241, 241, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 250, 250,
604 251, 251, 252, 252, 253, 253, 254, 254, 2, 3, 4, 5, 6, 7, 8,
605 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27,
606 28, 29, 30, 31, 127, 220, 249, -1, 10, 10, 10, 10, 13, 13, 13,
607 13, 22, 22, 22, 22, 256, 256, 256, 256,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700608};
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800609
Craig Tiller7536af02015-12-22 13:49:30 -0800610static const uint8_t inverse_base64[256] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700611 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
612 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
613 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255,
614 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
615 255, 64, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
616 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
617 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33,
618 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
619 49, 50, 51, 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, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
624 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
625 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
626 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
627 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
628 255,
Craig Tiller4aa71a12015-06-15 13:00:55 -0700629};
ctiller33023c42014-12-12 16:28:33 -0800630
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800631/* emission helpers */
Craig Tiller027a74c2015-11-10 08:37:46 +0000632static int on_hdr(grpc_chttp2_hpack_parser *p, grpc_mdelem *md,
Craig Tiller3c53bb22015-11-10 14:24:36 +0000633 int add_to_table) {
Craig Tillera82950e2015-09-22 12:33:20 -0700634 if (add_to_table) {
Craig Tiller027a74c2015-11-10 08:37:46 +0000635 if (!grpc_chttp2_hptbl_add(&p->table, md)) {
636 return 0;
637 }
Craig Tillera82950e2015-09-22 12:33:20 -0700638 }
639 p->on_header(p->on_header_user_data, md);
Craig Tiller027a74c2015-11-10 08:37:46 +0000640 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800641}
642
Craig Tillera82950e2015-09-22 12:33:20 -0700643static grpc_mdstr *take_string(grpc_chttp2_hpack_parser *p,
644 grpc_chttp2_hpack_parser_string *str) {
Craig Tiller7536af02015-12-22 13:49:30 -0800645 grpc_mdstr *s = grpc_mdstr_from_buffer((uint8_t *)str->str, str->length);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800646 str->length = 0;
647 return s;
648}
649
650/* jump to the next state */
Craig Tiller7536af02015-12-22 13:49:30 -0800651static int parse_next(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
652 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800653 p->state = *p->next_state++;
Craig Tillera82950e2015-09-22 12:33:20 -0700654 return p->state(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800655}
656
657/* begin parsing a header: all functionality is encoded into lookup tables
658 above */
Craig Tiller7536af02015-12-22 13:49:30 -0800659static int parse_begin(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
660 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700661 if (cur == end) {
662 p->state = parse_begin;
663 return 1;
664 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800665
Craig Tillera82950e2015-09-22 12:33:20 -0700666 return first_byte_action[first_byte_lut[*cur]](p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800667}
668
669/* stream dependency and prioritization data: we just skip it */
Craig Tiller7536af02015-12-22 13:49:30 -0800670static int parse_stream_weight(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
671 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700672 if (cur == end) {
673 p->state = parse_stream_weight;
674 return 1;
675 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800676
Craig Tillera82950e2015-09-22 12:33:20 -0700677 return p->after_prioritization(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800678}
679
Craig Tiller7536af02015-12-22 13:49:30 -0800680static int parse_stream_dep3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
681 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700682 if (cur == end) {
683 p->state = parse_stream_dep3;
684 return 1;
685 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800686
Craig Tillera82950e2015-09-22 12:33:20 -0700687 return parse_stream_weight(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800688}
689
Craig Tiller7536af02015-12-22 13:49:30 -0800690static int parse_stream_dep2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
691 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700692 if (cur == end) {
693 p->state = parse_stream_dep2;
694 return 1;
695 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800696
Craig Tillera82950e2015-09-22 12:33:20 -0700697 return parse_stream_dep3(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800698}
699
Craig Tiller7536af02015-12-22 13:49:30 -0800700static int parse_stream_dep1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
701 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700702 if (cur == end) {
703 p->state = parse_stream_dep1;
704 return 1;
705 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800706
Craig Tillera82950e2015-09-22 12:33:20 -0700707 return parse_stream_dep2(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800708}
709
Craig Tiller7536af02015-12-22 13:49:30 -0800710static int parse_stream_dep0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
711 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700712 if (cur == end) {
713 p->state = parse_stream_dep0;
714 return 1;
715 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800716
Craig Tillera82950e2015-09-22 12:33:20 -0700717 return parse_stream_dep1(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800718}
719
720/* emit an indexed field; for now just logs it to console; jumps to
721 begin the next field on completion */
Craig Tiller7536af02015-12-22 13:49:30 -0800722static int finish_indexed_field(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
723 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700724 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller027a74c2015-11-10 08:37:46 +0000725 if (md == NULL) {
726 gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index);
727 return 0;
728 }
Craig Tillera82950e2015-09-22 12:33:20 -0700729 GRPC_MDELEM_REF(md);
Craig Tiller027a74c2015-11-10 08:37:46 +0000730 return on_hdr(p, md, 0) && parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800731}
732
733/* parse an indexed field with index < 127 */
Craig Tiller7536af02015-12-22 13:49:30 -0800734static int parse_indexed_field(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
735 const uint8_t *end) {
Craig Tiller7b01b752015-12-02 16:52:54 -0800736 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800737 p->index = (*cur) & 0x7f;
Craig Tillera82950e2015-09-22 12:33:20 -0700738 return finish_indexed_field(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800739}
740
741/* parse an indexed field with index >= 127 */
Craig Tillera82950e2015-09-22 12:33:20 -0700742static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800743 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800744 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700745 finish_indexed_field};
Craig Tiller7b01b752015-12-02 16:52:54 -0800746 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800747 p->next_state = and_then;
748 p->index = 0x7f;
749 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700750 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800751}
752
753/* finish a literal header with incremental indexing: just log, and jump to '
754 begin */
Craig Tiller7536af02015-12-22 13:49:30 -0800755static int finish_lithdr_incidx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
756 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700757 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -0800758 GPR_ASSERT(md != NULL); /* handled in string parsing */
Craig Tiller0927c702015-11-20 12:25:54 -0800759 return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000760 take_string(p, &p->value)),
761 1) &&
762 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800763}
764
765/* finish a literal header with incremental indexing with no index */
Craig Tillera82950e2015-09-22 12:33:20 -0700766static int finish_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800767 const uint8_t *cur, const uint8_t *end) {
Craig Tiller0927c702015-11-20 12:25:54 -0800768 return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000769 take_string(p, &p->value)),
770 1) &&
771 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800772}
773
774/* parse a literal header with incremental indexing; index < 63 */
Craig Tiller7536af02015-12-22 13:49:30 -0800775static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
776 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800777 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700778 parse_value_string_with_indexed_key, finish_lithdr_incidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800779 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800780 p->next_state = and_then;
781 p->index = (*cur) & 0x3f;
Craig Tillera82950e2015-09-22 12:33:20 -0700782 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800783}
784
785/* parse a literal header with incremental indexing; index >= 63 */
Craig Tillera82950e2015-09-22 12:33:20 -0700786static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800787 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800788 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700789 parse_string_prefix, parse_value_string_with_indexed_key,
790 finish_lithdr_incidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800791 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800792 p->next_state = and_then;
793 p->index = 0x3f;
794 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700795 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800796}
797
798/* parse a literal header with incremental indexing; index = 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700799static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800800 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800801 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700802 parse_key_string, parse_string_prefix,
803 parse_value_string_with_literal_key, finish_lithdr_incidx_v};
Craig Tiller7b01b752015-12-02 16:52:54 -0800804 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800805 p->next_state = and_then;
Craig Tillera82950e2015-09-22 12:33:20 -0700806 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800807}
808
809/* finish a literal header without incremental indexing */
Craig Tiller7536af02015-12-22 13:49:30 -0800810static int finish_lithdr_notidx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
811 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700812 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -0800813 GPR_ASSERT(md != NULL); /* handled in string parsing */
Craig Tiller0927c702015-11-20 12:25:54 -0800814 return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000815 take_string(p, &p->value)),
816 0) &&
817 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800818}
819
820/* finish a literal header without incremental indexing with index = 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700821static int finish_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800822 const uint8_t *cur, const uint8_t *end) {
Craig Tiller0927c702015-11-20 12:25:54 -0800823 return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000824 take_string(p, &p->value)),
825 0) &&
826 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800827}
828
829/* parse a literal header without incremental indexing; index < 15 */
Craig Tiller7536af02015-12-22 13:49:30 -0800830static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
831 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800832 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700833 parse_value_string_with_indexed_key, finish_lithdr_notidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800834 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800835 p->next_state = and_then;
836 p->index = (*cur) & 0xf;
Craig Tillera82950e2015-09-22 12:33:20 -0700837 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800838}
839
840/* parse a literal header without incremental indexing; index >= 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700841static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800842 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800843 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700844 parse_string_prefix, parse_value_string_with_indexed_key,
845 finish_lithdr_notidx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800846 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800847 p->next_state = and_then;
848 p->index = 0xf;
849 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700850 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800851}
852
853/* parse a literal header without incremental indexing; index == 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700854static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800855 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800856 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700857 parse_key_string, parse_string_prefix,
858 parse_value_string_with_literal_key, finish_lithdr_notidx_v};
Craig Tiller7b01b752015-12-02 16:52:54 -0800859 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800860 p->next_state = and_then;
Craig Tillera82950e2015-09-22 12:33:20 -0700861 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800862}
863
864/* finish a literal header that is never indexed */
Craig Tiller7536af02015-12-22 13:49:30 -0800865static int finish_lithdr_nvridx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
866 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700867 grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -0800868 GPR_ASSERT(md != NULL); /* handled in string parsing */
Craig Tiller0927c702015-11-20 12:25:54 -0800869 return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000870 take_string(p, &p->value)),
871 0) &&
872 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800873}
874
875/* finish a literal header that is never indexed with an extra value */
Craig Tillera82950e2015-09-22 12:33:20 -0700876static int finish_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800877 const uint8_t *cur, const uint8_t *end) {
Craig Tiller0927c702015-11-20 12:25:54 -0800878 return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
Craig Tiller3c53bb22015-11-10 14:24:36 +0000879 take_string(p, &p->value)),
880 0) &&
881 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800882}
883
884/* parse a literal header that is never indexed; index < 15 */
Craig Tiller7536af02015-12-22 13:49:30 -0800885static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
886 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800887 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700888 parse_value_string_with_indexed_key, finish_lithdr_nvridx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800889 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800890 p->next_state = and_then;
891 p->index = (*cur) & 0xf;
Craig Tillera82950e2015-09-22 12:33:20 -0700892 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800893}
894
895/* parse a literal header that is never indexed; index >= 15 */
Craig Tillera82950e2015-09-22 12:33:20 -0700896static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800897 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800898 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700899 parse_string_prefix, parse_value_string_with_indexed_key,
900 finish_lithdr_nvridx};
Craig Tiller7b01b752015-12-02 16:52:54 -0800901 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800902 p->next_state = and_then;
903 p->index = 0xf;
904 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700905 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800906}
907
908/* parse a literal header that is never indexed; index == 0 */
Craig Tillera82950e2015-09-22 12:33:20 -0700909static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -0800910 const uint8_t *cur, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800911 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700912 parse_key_string, parse_string_prefix,
913 parse_value_string_with_literal_key, finish_lithdr_nvridx_v};
Craig Tiller7b01b752015-12-02 16:52:54 -0800914 p->dynamic_table_update_allowed = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800915 p->next_state = and_then;
Craig Tillera82950e2015-09-22 12:33:20 -0700916 return parse_string_prefix(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800917}
918
919/* finish parsing a max table size change */
Craig Tiller7536af02015-12-22 13:49:30 -0800920static int finish_max_tbl_size(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
921 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700922 gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
Craig Tiller3c53bb22015-11-10 14:24:36 +0000923 return grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index) &&
924 parse_begin(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800925}
926
927/* parse a max table size change, max size < 15 */
Craig Tiller7536af02015-12-22 13:49:30 -0800928static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
929 const uint8_t *end) {
Craig Tiller7b01b752015-12-02 16:52:54 -0800930 if (p->dynamic_table_update_allowed == 0) {
931 return 0;
932 }
933 p->dynamic_table_update_allowed--;
Craig Tiller027a74c2015-11-10 08:37:46 +0000934 p->index = (*cur) & 0x1f;
Craig Tillera82950e2015-09-22 12:33:20 -0700935 return finish_max_tbl_size(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800936}
937
938/* parse a max table size change, max size >= 15 */
Craig Tiller7536af02015-12-22 13:49:30 -0800939static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
940 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800941 static const grpc_chttp2_hpack_parser_state and_then[] = {
Craig Tillera82950e2015-09-22 12:33:20 -0700942 finish_max_tbl_size};
Craig Tiller7b01b752015-12-02 16:52:54 -0800943 if (p->dynamic_table_update_allowed == 0) {
944 return 0;
945 }
946 p->dynamic_table_update_allowed--;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800947 p->next_state = and_then;
Craig Tiller027a74c2015-11-10 08:37:46 +0000948 p->index = 0x1f;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800949 p->parsing.value = &p->index;
Craig Tillera82950e2015-09-22 12:33:20 -0700950 return parse_value0(p, cur + 1, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800951}
952
953/* a parse error: jam the parse state into parse_error, and return error */
Craig Tiller7536af02015-12-22 13:49:30 -0800954static int parse_error(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
955 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800956 p->state = parse_error;
957 return 0;
958}
959
Craig Tiller7536af02015-12-22 13:49:30 -0800960static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
961 const uint8_t *end) {
Craig Tiller027a74c2015-11-10 08:37:46 +0000962 GPR_ASSERT(cur != end);
963 gpr_log(GPR_DEBUG, "Illegal hpack op code %d", *cur);
964 return parse_error(p, cur, end);
965}
966
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800967/* parse the 1st byte of a varint into p->parsing.value
968 no overflow is possible */
Craig Tiller7536af02015-12-22 13:49:30 -0800969static int parse_value0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
970 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700971 if (cur == end) {
972 p->state = parse_value0;
973 return 1;
974 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800975
976 *p->parsing.value += (*cur) & 0x7f;
977
Craig Tillera82950e2015-09-22 12:33:20 -0700978 if ((*cur) & 0x80) {
979 return parse_value1(p, cur + 1, end);
980 } else {
981 return parse_next(p, cur + 1, end);
982 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800983}
984
985/* parse the 2nd byte of a varint into p->parsing.value
986 no overflow is possible */
Craig Tiller7536af02015-12-22 13:49:30 -0800987static int parse_value1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
988 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -0700989 if (cur == end) {
990 p->state = parse_value1;
991 return 1;
992 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800993
Craig Tiller7536af02015-12-22 13:49:30 -0800994 *p->parsing.value += (((uint32_t)*cur) & 0x7f) << 7;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800995
Craig Tillera82950e2015-09-22 12:33:20 -0700996 if ((*cur) & 0x80) {
997 return parse_value2(p, cur + 1, end);
998 } else {
999 return parse_next(p, cur + 1, end);
1000 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001001}
1002
1003/* parse the 3rd byte of a varint into p->parsing.value
1004 no overflow is possible */
Craig Tiller7536af02015-12-22 13:49:30 -08001005static int parse_value2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1006 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001007 if (cur == end) {
1008 p->state = parse_value2;
1009 return 1;
1010 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001011
Craig Tiller7536af02015-12-22 13:49:30 -08001012 *p->parsing.value += (((uint32_t)*cur) & 0x7f) << 14;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001013
Craig Tillera82950e2015-09-22 12:33:20 -07001014 if ((*cur) & 0x80) {
1015 return parse_value3(p, cur + 1, end);
1016 } else {
1017 return parse_next(p, cur + 1, end);
1018 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001019}
1020
1021/* parse the 4th byte of a varint into p->parsing.value
1022 no overflow is possible */
Craig Tiller7536af02015-12-22 13:49:30 -08001023static int parse_value3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1024 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001025 if (cur == end) {
1026 p->state = parse_value3;
1027 return 1;
1028 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001029
Craig Tiller7536af02015-12-22 13:49:30 -08001030 *p->parsing.value += (((uint32_t)*cur) & 0x7f) << 21;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001031
Craig Tillera82950e2015-09-22 12:33:20 -07001032 if ((*cur) & 0x80) {
1033 return parse_value4(p, cur + 1, end);
1034 } else {
1035 return parse_next(p, cur + 1, end);
1036 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001037}
1038
1039/* parse the 5th byte of a varint into p->parsing.value
1040 depending on the byte, we may overflow, and care must be taken */
Craig Tiller7536af02015-12-22 13:49:30 -08001041static int parse_value4(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1042 const uint8_t *end) {
1043 uint8_t c;
1044 uint32_t cur_value;
1045 uint32_t add_value;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001046
Craig Tillera82950e2015-09-22 12:33:20 -07001047 if (cur == end) {
1048 p->state = parse_value4;
1049 return 1;
1050 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001051
1052 c = (*cur) & 0x7f;
Craig Tillera82950e2015-09-22 12:33:20 -07001053 if (c > 0xf) {
1054 goto error;
1055 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001056
1057 cur_value = *p->parsing.value;
Craig Tiller7536af02015-12-22 13:49:30 -08001058 add_value = ((uint32_t)c) << 28;
Craig Tillera82950e2015-09-22 12:33:20 -07001059 if (add_value > 0xffffffffu - cur_value) {
1060 goto error;
1061 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001062
1063 *p->parsing.value = cur_value + add_value;
1064
Craig Tillera82950e2015-09-22 12:33:20 -07001065 if ((*cur) & 0x80) {
1066 return parse_value5up(p, cur + 1, end);
1067 } else {
1068 return parse_next(p, cur + 1, end);
1069 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001070
1071error:
Craig Tillera82950e2015-09-22 12:33:20 -07001072 gpr_log(GPR_ERROR,
1073 "integer overflow in hpack integer decoding: have 0x%08x, "
Craig Tillerd391b562015-12-08 08:53:09 -08001074 "got byte 0x%02x on byte 5",
Craig Tillera82950e2015-09-22 12:33:20 -07001075 *p->parsing.value, *cur);
1076 return parse_error(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001077}
1078
1079/* parse any trailing bytes in a varint: it's possible to append an arbitrary
1080 number of 0x80's and not affect the value - a zero will terminate - and
1081 anything else will overflow */
Craig Tiller7536af02015-12-22 13:49:30 -08001082static int parse_value5up(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1083 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001084 while (cur != end && *cur == 0x80) {
1085 ++cur;
1086 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001087
Craig Tillera82950e2015-09-22 12:33:20 -07001088 if (cur == end) {
1089 p->state = parse_value5up;
1090 return 1;
1091 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001092
Craig Tillera82950e2015-09-22 12:33:20 -07001093 if (*cur == 0) {
1094 return parse_next(p, cur + 1, end);
1095 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001096
Craig Tillera82950e2015-09-22 12:33:20 -07001097 gpr_log(GPR_ERROR,
1098 "integer overflow in hpack integer decoding: have 0x%08x, "
Craig Tillerd391b562015-12-08 08:53:09 -08001099 "got byte 0x%02x sometime after byte 5",
1100 *p->parsing.value, *cur);
Craig Tillera82950e2015-09-22 12:33:20 -07001101 return parse_error(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001102}
1103
1104/* parse a string prefix */
Craig Tiller7536af02015-12-22 13:49:30 -08001105static int parse_string_prefix(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1106 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001107 if (cur == end) {
1108 p->state = parse_string_prefix;
1109 return 1;
1110 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001111
1112 p->strlen = (*cur) & 0x7f;
1113 p->huff = (*cur) >> 7;
Craig Tillera82950e2015-09-22 12:33:20 -07001114 if (p->strlen == 0x7f) {
1115 p->parsing.value = &p->strlen;
1116 return parse_value0(p, cur + 1, end);
1117 } else {
1118 return parse_next(p, cur + 1, end);
1119 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001120}
1121
1122/* append some bytes to a string */
Craig Tillera82950e2015-09-22 12:33:20 -07001123static void append_bytes(grpc_chttp2_hpack_parser_string *str,
Craig Tiller7536af02015-12-22 13:49:30 -08001124 const uint8_t *data, size_t length) {
Craig Tillera82950e2015-09-22 12:33:20 -07001125 if (length + str->length > str->capacity) {
Craig Tiller7536af02015-12-22 13:49:30 -08001126 GPR_ASSERT(str->length + length <= UINT32_MAX);
1127 str->capacity = (uint32_t)(str->length + length);
Craig Tillera82950e2015-09-22 12:33:20 -07001128 str->str = gpr_realloc(str->str, str->capacity);
1129 }
1130 memcpy(str->str + str->length, data, length);
Craig Tiller7536af02015-12-22 13:49:30 -08001131 GPR_ASSERT(length <= UINT32_MAX - str->length);
1132 str->length += (uint32_t)length;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001133}
1134
Craig Tiller7536af02015-12-22 13:49:30 -08001135static int append_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1136 const uint8_t *end) {
ctiller33023c42014-12-12 16:28:33 -08001137 grpc_chttp2_hpack_parser_string *str = p->parsing.str;
Craig Tiller7536af02015-12-22 13:49:30 -08001138 uint32_t bits;
1139 uint8_t decoded[3];
Craig Tillera82950e2015-09-22 12:33:20 -07001140 switch ((binary_state)p->binary) {
ctiller33023c42014-12-12 16:28:33 -08001141 case NOT_BINARY:
Craig Tillera82950e2015-09-22 12:33:20 -07001142 append_bytes(str, cur, (size_t)(end - cur));
ctiller33023c42014-12-12 16:28:33 -08001143 return 1;
1144 b64_byte0:
1145 case B64_BYTE0:
Craig Tillera82950e2015-09-22 12:33:20 -07001146 if (cur == end) {
1147 p->binary = B64_BYTE0;
1148 return 1;
1149 }
ctiller33023c42014-12-12 16:28:33 -08001150 bits = inverse_base64[*cur];
1151 ++cur;
1152 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001153 return 0;
ctiller33023c42014-12-12 16:28:33 -08001154 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001155 goto b64_byte0;
ctiller33023c42014-12-12 16:28:33 -08001156 p->base64_buffer = bits << 18;
Craig Tillera82950e2015-09-22 12:33:20 -07001157 /* fallthrough */
ctiller33023c42014-12-12 16:28:33 -08001158 b64_byte1:
1159 case B64_BYTE1:
Craig Tillera82950e2015-09-22 12:33:20 -07001160 if (cur == end) {
1161 p->binary = B64_BYTE1;
1162 return 1;
1163 }
ctiller33023c42014-12-12 16:28:33 -08001164 bits = inverse_base64[*cur];
1165 ++cur;
1166 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001167 return 0;
ctiller33023c42014-12-12 16:28:33 -08001168 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001169 goto b64_byte1;
ctiller33023c42014-12-12 16:28:33 -08001170 p->base64_buffer |= bits << 12;
Craig Tillera82950e2015-09-22 12:33:20 -07001171 /* fallthrough */
ctiller33023c42014-12-12 16:28:33 -08001172 b64_byte2:
1173 case B64_BYTE2:
Craig Tillera82950e2015-09-22 12:33:20 -07001174 if (cur == end) {
1175 p->binary = B64_BYTE2;
1176 return 1;
1177 }
ctiller33023c42014-12-12 16:28:33 -08001178 bits = inverse_base64[*cur];
1179 ++cur;
1180 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001181 return 0;
ctiller33023c42014-12-12 16:28:33 -08001182 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001183 goto b64_byte2;
ctiller33023c42014-12-12 16:28:33 -08001184 p->base64_buffer |= bits << 6;
Craig Tillera82950e2015-09-22 12:33:20 -07001185 /* fallthrough */
ctiller33023c42014-12-12 16:28:33 -08001186 b64_byte3:
1187 case B64_BYTE3:
Craig Tillera82950e2015-09-22 12:33:20 -07001188 if (cur == end) {
1189 p->binary = B64_BYTE3;
1190 return 1;
1191 }
ctiller33023c42014-12-12 16:28:33 -08001192 bits = inverse_base64[*cur];
1193 ++cur;
1194 if (bits == 255)
Craig Tillera82950e2015-09-22 12:33:20 -07001195 return 0;
ctiller33023c42014-12-12 16:28:33 -08001196 else if (bits == 64)
Craig Tillera82950e2015-09-22 12:33:20 -07001197 goto b64_byte3;
ctiller33023c42014-12-12 16:28:33 -08001198 p->base64_buffer |= bits;
1199 bits = p->base64_buffer;
Craig Tiller7536af02015-12-22 13:49:30 -08001200 decoded[0] = (uint8_t)(bits >> 16);
1201 decoded[1] = (uint8_t)(bits >> 8);
1202 decoded[2] = (uint8_t)(bits);
Craig Tillera82950e2015-09-22 12:33:20 -07001203 append_bytes(str, decoded, 3);
ctiller33023c42014-12-12 16:28:33 -08001204 goto b64_byte0;
Craig Tillera82950e2015-09-22 12:33:20 -07001205 }
yang-gb063c872015-10-07 11:40:13 -07001206 GPR_UNREACHABLE_CODE(return 1);
ctiller33023c42014-12-12 16:28:33 -08001207}
1208
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001209/* append a null terminator to a string */
Craig Tillera82950e2015-09-22 12:33:20 -07001210static int finish_str(grpc_chttp2_hpack_parser *p) {
Craig Tiller7536af02015-12-22 13:49:30 -08001211 uint8_t terminator = 0;
1212 uint8_t decoded[2];
1213 uint32_t bits;
ctiller33023c42014-12-12 16:28:33 -08001214 grpc_chttp2_hpack_parser_string *str = p->parsing.str;
Craig Tillera82950e2015-09-22 12:33:20 -07001215 switch ((binary_state)p->binary) {
ctiller33023c42014-12-12 16:28:33 -08001216 case NOT_BINARY:
1217 break;
1218 case B64_BYTE0:
1219 break;
1220 case B64_BYTE1:
Craig Tillera82950e2015-09-22 12:33:20 -07001221 gpr_log(GPR_ERROR, "illegal base64 encoding");
1222 return 0; /* illegal encoding */
ctiller33023c42014-12-12 16:28:33 -08001223 case B64_BYTE2:
1224 bits = p->base64_buffer;
Craig Tillera82950e2015-09-22 12:33:20 -07001225 if (bits & 0xffff) {
1226 gpr_log(GPR_ERROR, "trailing bits in base64 encoding: 0x%04x",
1227 bits & 0xffff);
1228 return 0;
1229 }
Craig Tiller7536af02015-12-22 13:49:30 -08001230 decoded[0] = (uint8_t)(bits >> 16);
Craig Tillera82950e2015-09-22 12:33:20 -07001231 append_bytes(str, decoded, 1);
ctiller33023c42014-12-12 16:28:33 -08001232 break;
1233 case B64_BYTE3:
1234 bits = p->base64_buffer;
Craig Tillera82950e2015-09-22 12:33:20 -07001235 if (bits & 0xff) {
1236 gpr_log(GPR_ERROR, "trailing bits in base64 encoding: 0x%02x",
1237 bits & 0xff);
1238 return 0;
1239 }
Craig Tiller7536af02015-12-22 13:49:30 -08001240 decoded[0] = (uint8_t)(bits >> 16);
1241 decoded[1] = (uint8_t)(bits >> 8);
Craig Tillera82950e2015-09-22 12:33:20 -07001242 append_bytes(str, decoded, 2);
ctiller33023c42014-12-12 16:28:33 -08001243 break;
Craig Tillera82950e2015-09-22 12:33:20 -07001244 }
1245 append_bytes(str, &terminator, 1);
1246 p->parsing.str->length--; /* don't actually count the null terminator */
ctiller33023c42014-12-12 16:28:33 -08001247 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001248}
1249
1250/* decode a nibble from a huffman encoded stream */
Craig Tiller7536af02015-12-22 13:49:30 -08001251static int huff_nibble(grpc_chttp2_hpack_parser *p, uint8_t nibble) {
1252 int16_t emit = emit_sub_tbl[16 * emit_tbl[p->huff_state] + nibble];
1253 int16_t next = next_sub_tbl[16 * next_tbl[p->huff_state] + nibble];
Craig Tillera82950e2015-09-22 12:33:20 -07001254 if (emit != -1) {
1255 if (emit >= 0 && emit < 256) {
Craig Tiller7536af02015-12-22 13:49:30 -08001256 uint8_t c = (uint8_t)emit;
Craig Tillera82950e2015-09-22 12:33:20 -07001257 if (!append_string(p, &c, (&c) + 1)) return 0;
1258 } else {
1259 assert(emit == 256);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001260 }
Craig Tillera82950e2015-09-22 12:33:20 -07001261 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001262 p->huff_state = next;
ctiller33023c42014-12-12 16:28:33 -08001263 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001264}
1265
1266/* decode full bytes from a huffman encoded stream */
Craig Tiller7536af02015-12-22 13:49:30 -08001267static int add_huff_bytes(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1268 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001269 for (; cur != end; ++cur) {
1270 if (!huff_nibble(p, *cur >> 4) || !huff_nibble(p, *cur & 0xf)) return 0;
1271 }
ctiller33023c42014-12-12 16:28:33 -08001272 return 1;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001273}
1274
1275/* decode some string bytes based on the current decoding mode
1276 (huffman or not) */
Craig Tiller7536af02015-12-22 13:49:30 -08001277static int add_str_bytes(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1278 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001279 if (p->huff) {
1280 return add_huff_bytes(p, cur, end);
1281 } else {
1282 return append_string(p, cur, end);
1283 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001284}
1285
1286/* parse a string - tries to do large chunks at a time */
Craig Tiller7536af02015-12-22 13:49:30 -08001287static int parse_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1288 const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001289 size_t remaining = p->strlen - p->strgot;
Craig Tillera82950e2015-09-22 12:33:20 -07001290 size_t given = (size_t)(end - cur);
1291 if (remaining <= given) {
1292 return add_str_bytes(p, cur, cur + remaining) && finish_str(p) &&
1293 parse_next(p, cur + remaining, end);
1294 } else {
1295 if (!add_str_bytes(p, cur, cur + given)) return 0;
Craig Tiller7536af02015-12-22 13:49:30 -08001296 GPR_ASSERT(given <= UINT32_MAX - p->strgot);
1297 p->strgot += (uint32_t)given;
Craig Tillera82950e2015-09-22 12:33:20 -07001298 p->state = parse_string;
1299 return 1;
1300 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001301}
1302
1303/* begin parsing a string - performs setup, calls parse_string */
Craig Tiller7536af02015-12-22 13:49:30 -08001304static int begin_parse_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1305 const uint8_t *end, uint8_t binary,
Craig Tillera82950e2015-09-22 12:33:20 -07001306 grpc_chttp2_hpack_parser_string *str) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001307 p->strgot = 0;
1308 str->length = 0;
1309 p->parsing.str = str;
1310 p->huff_state = 0;
ctiller33023c42014-12-12 16:28:33 -08001311 p->binary = binary;
Craig Tillera82950e2015-09-22 12:33:20 -07001312 return parse_string(p, cur, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001313}
1314
1315/* parse the key string */
Craig Tiller7536af02015-12-22 13:49:30 -08001316static int parse_key_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1317 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001318 return begin_parse_string(p, cur, end, NOT_BINARY, &p->key);
ctiller33023c42014-12-12 16:28:33 -08001319}
1320
1321/* check if a key represents a binary header or not */
Craig Tillera82950e2015-09-22 12:33:20 -07001322typedef enum { BINARY_HEADER, PLAINTEXT_HEADER, ERROR_HEADER } is_binary_header;
ctiller33023c42014-12-12 16:28:33 -08001323
Craig Tillera82950e2015-09-22 12:33:20 -07001324static is_binary_header is_binary_literal_header(grpc_chttp2_hpack_parser *p) {
1325 return grpc_is_binary_header(p->key.str, p->key.length) ? BINARY_HEADER
1326 : PLAINTEXT_HEADER;
ctiller33023c42014-12-12 16:28:33 -08001327}
1328
Craig Tillera82950e2015-09-22 12:33:20 -07001329static is_binary_header is_binary_indexed_header(grpc_chttp2_hpack_parser *p) {
1330 grpc_mdelem *elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
Craig Tiller535701c2015-12-07 10:09:44 -08001331 if (!elem) {
1332 gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index);
1333 return ERROR_HEADER;
1334 }
Craig Tillera82950e2015-09-22 12:33:20 -07001335 return grpc_is_binary_header(
1336 (const char *)GPR_SLICE_START_PTR(elem->key->slice),
1337 GPR_SLICE_LENGTH(elem->key->slice))
1338 ? BINARY_HEADER
1339 : PLAINTEXT_HEADER;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001340}
1341
1342/* parse the value string */
Craig Tiller7536af02015-12-22 13:49:30 -08001343static int parse_value_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1344 const uint8_t *end, is_binary_header type) {
Craig Tillera82950e2015-09-22 12:33:20 -07001345 switch (type) {
ctiller33023c42014-12-12 16:28:33 -08001346 case BINARY_HEADER:
Craig Tillera82950e2015-09-22 12:33:20 -07001347 return begin_parse_string(p, cur, end, B64_BYTE0, &p->value);
ctiller33023c42014-12-12 16:28:33 -08001348 case PLAINTEXT_HEADER:
Craig Tillera82950e2015-09-22 12:33:20 -07001349 return begin_parse_string(p, cur, end, NOT_BINARY, &p->value);
ctiller33023c42014-12-12 16:28:33 -08001350 case ERROR_HEADER:
1351 return 0;
Craig Tillera82950e2015-09-22 12:33:20 -07001352 }
vpai61cba0b2014-12-15 14:40:45 -08001353 /* Add code to prevent return without value error */
yang-gb063c872015-10-07 11:40:13 -07001354 GPR_UNREACHABLE_CODE(return 0);
ctiller33023c42014-12-12 16:28:33 -08001355}
1356
Craig Tillera82950e2015-09-22 12:33:20 -07001357static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -08001358 const uint8_t *cur,
1359 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001360 return parse_value_string(p, cur, end, is_binary_indexed_header(p));
ctiller33023c42014-12-12 16:28:33 -08001361}
1362
Craig Tillera82950e2015-09-22 12:33:20 -07001363static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -08001364 const uint8_t *cur,
1365 const uint8_t *end) {
Craig Tillera82950e2015-09-22 12:33:20 -07001366 return parse_value_string(p, cur, end, is_binary_literal_header(p));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001367}
1368
1369/* PUBLIC INTERFACE */
1370
Craig Tillera82950e2015-09-22 12:33:20 -07001371static void on_header_not_set(void *user_data, grpc_mdelem *md) {
Craig Tiller535701c2015-12-07 10:09:44 -08001372 GPR_UNREACHABLE_CODE(return );
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001373}
1374
Craig Tillerb2b42612015-11-20 12:02:17 -08001375void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001376 p->on_header = on_header_not_set;
1377 p->on_header_user_data = NULL;
1378 p->state = parse_begin;
1379 p->key.str = NULL;
1380 p->key.capacity = 0;
1381 p->key.length = 0;
1382 p->value.str = NULL;
1383 p->value.capacity = 0;
1384 p->value.length = 0;
Craig Tiller7b01b752015-12-02 16:52:54 -08001385 p->dynamic_table_update_allowed = 2;
Craig Tillerb2b42612015-11-20 12:02:17 -08001386 grpc_chttp2_hptbl_init(&p->table);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001387}
1388
Craig Tillera82950e2015-09-22 12:33:20 -07001389void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
Craig Tillerd1e5fe32015-05-21 14:12:23 -07001390 p->after_prioritization = p->state;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001391 p->state = parse_stream_dep0;
1392}
1393
Craig Tillera82950e2015-09-22 12:33:20 -07001394void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p) {
1395 grpc_chttp2_hptbl_destroy(&p->table);
1396 gpr_free(p->key.str);
1397 gpr_free(p->value.str);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001398}
1399
Craig Tillera82950e2015-09-22 12:33:20 -07001400int grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p,
Craig Tiller7536af02015-12-22 13:49:30 -08001401 const uint8_t *beg, const uint8_t *end) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001402 /* TODO(ctiller): limit the distance of end from beg, and perform multiple
Craig Tiller45724b32015-09-22 10:42:19 -07001403 steps in the event of a large chunk of data to limit
1404 stack space usage when no tail call optimization is
1405 available */
Craig Tillera82950e2015-09-22 12:33:20 -07001406 return p->state(p, beg, end);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001407}
1408
Craig Tillera82950e2015-09-22 12:33:20 -07001409grpc_chttp2_parse_error grpc_chttp2_header_parser_parse(
1410 grpc_exec_ctx *exec_ctx, void *hpack_parser,
1411 grpc_chttp2_transport_parsing *transport_parsing,
1412 grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001413 grpc_chttp2_hpack_parser *parser = hpack_parser;
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001414 GPR_TIMER_BEGIN("grpc_chttp2_hpack_parser_parse", 0);
Craig Tillera82950e2015-09-22 12:33:20 -07001415 if (!grpc_chttp2_hpack_parser_parse(parser, GPR_SLICE_START_PTR(slice),
1416 GPR_SLICE_END_PTR(slice))) {
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001417 GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
Craig Tillera82950e2015-09-22 12:33:20 -07001418 return GRPC_CHTTP2_CONNECTION_ERROR;
1419 }
1420 if (is_last) {
1421 if (parser->is_boundary && parser->state != parse_begin) {
1422 gpr_log(GPR_ERROR,
1423 "end of header frame not aligned with a hpack record boundary");
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001424 GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001425 return GRPC_CHTTP2_CONNECTION_ERROR;
1426 }
Craig Tillerc3218142015-12-08 08:30:39 -08001427 /* need to check for null stream: this can occur if we receive an invalid
1428 stream id on a header */
1429 if (stream_parsing != NULL) {
1430 if (parser->is_boundary) {
1431 stream_parsing
1432 ->got_metadata_on_parse[stream_parsing->header_frames_received] = 1;
1433 stream_parsing->header_frames_received++;
1434 grpc_chttp2_list_add_parsing_seen_stream(transport_parsing,
1435 stream_parsing);
1436 }
1437 if (parser->is_eof) {
1438 stream_parsing->received_close = 1;
1439 }
Craig Tillera82950e2015-09-22 12:33:20 -07001440 }
1441 parser->on_header = on_header_not_set;
1442 parser->on_header_user_data = NULL;
1443 parser->is_boundary = 0xde;
1444 parser->is_eof = 0xde;
Craig Tiller7b01b752015-12-02 16:52:54 -08001445 parser->dynamic_table_update_allowed = 2;
Craig Tillera82950e2015-09-22 12:33:20 -07001446 }
Craig Tiller9d35a1f2015-11-02 14:16:12 -08001447 GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001448 return GRPC_CHTTP2_PARSE_OK;
Craig Tiller190d3602015-02-18 09:23:38 -08001449}