Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1 | /* |
| 2 | * |
Craig Tiller | 0605995 | 2015-02-18 08:34:56 -0800 | [diff] [blame] | 3 | * Copyright 2015, Google Inc. |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 4 | * 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 Tiller | 3719f07 | 2015-06-12 17:19:51 -0700 | [diff] [blame] | 35 | #include "src/core/transport/chttp2/internal.h" |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 36 | |
| 37 | #include <stddef.h> |
| 38 | #include <string.h> |
| 39 | #include <assert.h> |
| 40 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 41 | #include <grpc/support/alloc.h> |
| 42 | #include <grpc/support/log.h> |
| 43 | #include <grpc/support/port_platform.h> |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 44 | #include <grpc/support/useful.h> |
| 45 | |
Craig Tiller | 9d35a1f | 2015-11-02 14:16:12 -0800 | [diff] [blame] | 46 | #include "src/core/profiling/timers.h" |
| 47 | #include "src/core/support/string.h" |
| 48 | #include "src/core/transport/chttp2/bin_encoder.h" |
| 49 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 50 | typedef enum { |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 51 | NOT_BINARY, |
| 52 | B64_BYTE0, |
| 53 | B64_BYTE1, |
| 54 | B64_BYTE2, |
| 55 | B64_BYTE3 |
| 56 | } binary_state; |
| 57 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 58 | /* 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 73 | static int parse_begin(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 74 | const gpr_uint8 *end); |
| 75 | static int parse_error(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 76 | const gpr_uint8 *end); |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 77 | static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 78 | const gpr_uint8 *end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 79 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 80 | static int parse_string_prefix(grpc_chttp2_hpack_parser *p, |
| 81 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 82 | static int parse_key_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 83 | const gpr_uint8 *end); |
| 84 | static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p, |
| 85 | const gpr_uint8 *cur, |
| 86 | const gpr_uint8 *end); |
| 87 | static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p, |
| 88 | const gpr_uint8 *cur, |
| 89 | const gpr_uint8 *end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 90 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 91 | static int parse_value0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 92 | const gpr_uint8 *end); |
| 93 | static int parse_value1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 94 | const gpr_uint8 *end); |
| 95 | static int parse_value2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 96 | const gpr_uint8 *end); |
| 97 | static int parse_value3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 98 | const gpr_uint8 *end); |
| 99 | static int parse_value4(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 100 | const gpr_uint8 *end); |
| 101 | static int parse_value5up(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 102 | const gpr_uint8 *end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 103 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 104 | static int parse_indexed_field(grpc_chttp2_hpack_parser *p, |
| 105 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 106 | static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p, |
| 107 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 108 | static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p, |
| 109 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 110 | static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p, |
| 111 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 112 | static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p, |
| 113 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 114 | static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p, |
| 115 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 116 | static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p, |
| 117 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 118 | static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p, |
| 119 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 120 | static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p, |
| 121 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 122 | static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p, |
| 123 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 124 | static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p, |
| 125 | const gpr_uint8 *cur, const gpr_uint8 *end); |
| 126 | static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 127 | const gpr_uint8 *end); |
| 128 | static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p, |
| 129 | const gpr_uint8 *cur, const gpr_uint8 *end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 130 | |
| 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 137 | typedef enum { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 138 | 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 */ |
| 156 | static const grpc_chttp2_hpack_parser_state first_byte_action[] = { |
Craig Tiller | 71a0f9d | 2015-09-28 17:22:01 -0700 | [diff] [blame] | 157 | 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 Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 161 | parse_max_tbl_size_x, parse_illegal_op}; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 162 | |
| 163 | /* indexes the first byte to a parse state function - generated by |
| 164 | gen_hpack_tables.c */ |
| 165 | static const gpr_uint8 first_byte_lut[256] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 166 | 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 Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 174 | MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 175 | 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 Tiller | 4aa71a1 | 2015-06-15 13:00:55 -0700 | [diff] [blame] | 230 | }; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 231 | |
| 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 */ |
| 237 | static const gpr_uint8 next_tbl[256] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 238 | 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 Tiller | 4aa71a1 | 2015-06-15 13:00:55 -0700 | [diff] [blame] | 251 | }; |
Craig Tiller | 45724b3 | 2015-09-22 10:42:19 -0700 | [diff] [blame] | 252 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 253 | /* next state, based upon current state and the current nibble: see above. |
| 254 | generated by gen_hpack_tables.c */ |
| 255 | static const gpr_int16 next_sub_tbl[48 * 16] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 256 | 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 Tiller | 4aa71a1 | 2015-06-15 13:00:55 -0700 | [diff] [blame] | 308 | }; |
Craig Tiller | 45724b3 | 2015-09-22 10:42:19 -0700 | [diff] [blame] | 309 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 310 | /* 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 */ |
| 314 | static const gpr_uint16 emit_tbl[256] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 315 | 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 Tiller | 4aa71a1 | 2015-06-15 13:00:55 -0700 | [diff] [blame] | 333 | }; |
Craig Tiller | 45724b3 | 2015-09-22 10:42:19 -0700 | [diff] [blame] | 334 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 335 | /* generated by gen_hpack_tables.c */ |
| 336 | static const gpr_int16 emit_sub_tbl[249 * 16] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 337 | -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 Tiller | 4aa71a1 | 2015-06-15 13:00:55 -0700 | [diff] [blame] | 603 | }; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 604 | |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 605 | static const gpr_uint8 inverse_base64[256] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 606 | 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 Tiller | 4aa71a1 | 2015-06-15 13:00:55 -0700 | [diff] [blame] | 624 | }; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 625 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 626 | /* emission helpers */ |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 627 | static int on_hdr(grpc_chttp2_hpack_parser *p, grpc_mdelem *md, |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 628 | int add_to_table) { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 629 | if (add_to_table) { |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 630 | if (!grpc_chttp2_hptbl_add(&p->table, md)) { |
| 631 | return 0; |
| 632 | } |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 633 | } |
| 634 | p->on_header(p->on_header_user_data, md); |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 635 | return 1; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 636 | } |
| 637 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 638 | static grpc_mdstr *take_string(grpc_chttp2_hpack_parser *p, |
| 639 | grpc_chttp2_hpack_parser_string *str) { |
Craig Tiller | b2b4261 | 2015-11-20 12:02:17 -0800 | [diff] [blame] | 640 | grpc_mdstr *s = grpc_mdstr_from_buffer((gpr_uint8 *)str->str, str->length); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 641 | str->length = 0; |
| 642 | return s; |
| 643 | } |
| 644 | |
| 645 | /* jump to the next state */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 646 | static int parse_next(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 647 | const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 648 | p->state = *p->next_state++; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 649 | return p->state(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 650 | } |
| 651 | |
| 652 | /* begin parsing a header: all functionality is encoded into lookup tables |
| 653 | above */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 654 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 660 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 661 | return first_byte_action[first_byte_lut[*cur]](p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 662 | } |
| 663 | |
| 664 | /* stream dependency and prioritization data: we just skip it */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 665 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 671 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 672 | return p->after_prioritization(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 673 | } |
| 674 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 675 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 681 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 682 | return parse_stream_weight(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 683 | } |
| 684 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 685 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 691 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 692 | return parse_stream_dep3(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 693 | } |
| 694 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 695 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 701 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 702 | return parse_stream_dep2(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 703 | } |
| 704 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 705 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 711 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 712 | return parse_stream_dep1(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 713 | } |
| 714 | |
| 715 | /* emit an indexed field; for now just logs it to console; jumps to |
| 716 | begin the next field on completion */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 717 | static 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 Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 720 | if (md == NULL) { |
| 721 | gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index); |
| 722 | return 0; |
| 723 | } |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 724 | GRPC_MDELEM_REF(md); |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 725 | return on_hdr(p, md, 0) && parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 726 | } |
| 727 | |
| 728 | /* parse an indexed field with index < 127 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 729 | static int parse_indexed_field(grpc_chttp2_hpack_parser *p, |
| 730 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 731 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 732 | p->index = (*cur) & 0x7f; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 733 | return finish_indexed_field(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 734 | } |
| 735 | |
| 736 | /* parse an indexed field with index >= 127 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 737 | static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p, |
| 738 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 739 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 740 | finish_indexed_field}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 741 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 742 | p->next_state = and_then; |
| 743 | p->index = 0x7f; |
| 744 | p->parsing.value = &p->index; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 745 | return parse_value0(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 746 | } |
| 747 | |
| 748 | /* finish a literal header with incremental indexing: just log, and jump to ' |
| 749 | begin */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 750 | static 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 Tiller | 535701c | 2015-12-07 10:09:44 -0800 | [diff] [blame] | 753 | GPR_ASSERT(md != NULL); /* handled in string parsing */ |
Craig Tiller | 0927c70 | 2015-11-20 12:25:54 -0800 | [diff] [blame] | 754 | return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key), |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 755 | take_string(p, &p->value)), |
| 756 | 1) && |
| 757 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 758 | } |
| 759 | |
| 760 | /* finish a literal header with incremental indexing with no index */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 761 | static int finish_lithdr_incidx_v(grpc_chttp2_hpack_parser *p, |
| 762 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Craig Tiller | 0927c70 | 2015-11-20 12:25:54 -0800 | [diff] [blame] | 763 | return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key), |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 764 | take_string(p, &p->value)), |
| 765 | 1) && |
| 766 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 767 | } |
| 768 | |
| 769 | /* parse a literal header with incremental indexing; index < 63 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 770 | static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p, |
| 771 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 772 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 773 | parse_value_string_with_indexed_key, finish_lithdr_incidx}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 774 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 775 | p->next_state = and_then; |
| 776 | p->index = (*cur) & 0x3f; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 777 | return parse_string_prefix(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 778 | } |
| 779 | |
| 780 | /* parse a literal header with incremental indexing; index >= 63 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 781 | static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p, |
| 782 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 783 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 784 | parse_string_prefix, parse_value_string_with_indexed_key, |
| 785 | finish_lithdr_incidx}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 786 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 787 | p->next_state = and_then; |
| 788 | p->index = 0x3f; |
| 789 | p->parsing.value = &p->index; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 790 | return parse_value0(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 791 | } |
| 792 | |
| 793 | /* parse a literal header with incremental indexing; index = 0 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 794 | static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p, |
| 795 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 796 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 797 | parse_key_string, parse_string_prefix, |
| 798 | parse_value_string_with_literal_key, finish_lithdr_incidx_v}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 799 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 800 | p->next_state = and_then; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 801 | return parse_string_prefix(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 802 | } |
| 803 | |
| 804 | /* finish a literal header without incremental indexing */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 805 | static 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 Tiller | 535701c | 2015-12-07 10:09:44 -0800 | [diff] [blame] | 808 | GPR_ASSERT(md != NULL); /* handled in string parsing */ |
Craig Tiller | 0927c70 | 2015-11-20 12:25:54 -0800 | [diff] [blame] | 809 | return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key), |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 810 | take_string(p, &p->value)), |
| 811 | 0) && |
| 812 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 813 | } |
| 814 | |
| 815 | /* finish a literal header without incremental indexing with index = 0 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 816 | static int finish_lithdr_notidx_v(grpc_chttp2_hpack_parser *p, |
| 817 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Craig Tiller | 0927c70 | 2015-11-20 12:25:54 -0800 | [diff] [blame] | 818 | return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key), |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 819 | take_string(p, &p->value)), |
| 820 | 0) && |
| 821 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 822 | } |
| 823 | |
| 824 | /* parse a literal header without incremental indexing; index < 15 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 825 | static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p, |
| 826 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 827 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 828 | parse_value_string_with_indexed_key, finish_lithdr_notidx}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 829 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 830 | p->next_state = and_then; |
| 831 | p->index = (*cur) & 0xf; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 832 | return parse_string_prefix(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 833 | } |
| 834 | |
| 835 | /* parse a literal header without incremental indexing; index >= 15 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 836 | static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p, |
| 837 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 838 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 839 | parse_string_prefix, parse_value_string_with_indexed_key, |
| 840 | finish_lithdr_notidx}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 841 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 842 | p->next_state = and_then; |
| 843 | p->index = 0xf; |
| 844 | p->parsing.value = &p->index; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 845 | return parse_value0(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 846 | } |
| 847 | |
| 848 | /* parse a literal header without incremental indexing; index == 0 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 849 | static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p, |
| 850 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 851 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 852 | parse_key_string, parse_string_prefix, |
| 853 | parse_value_string_with_literal_key, finish_lithdr_notidx_v}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 854 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 855 | p->next_state = and_then; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 856 | return parse_string_prefix(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 857 | } |
| 858 | |
| 859 | /* finish a literal header that is never indexed */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 860 | static 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 Tiller | 535701c | 2015-12-07 10:09:44 -0800 | [diff] [blame] | 863 | GPR_ASSERT(md != NULL); /* handled in string parsing */ |
Craig Tiller | 0927c70 | 2015-11-20 12:25:54 -0800 | [diff] [blame] | 864 | return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key), |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 865 | take_string(p, &p->value)), |
| 866 | 0) && |
| 867 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 868 | } |
| 869 | |
| 870 | /* finish a literal header that is never indexed with an extra value */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 871 | static int finish_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p, |
| 872 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Craig Tiller | 0927c70 | 2015-11-20 12:25:54 -0800 | [diff] [blame] | 873 | return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key), |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 874 | take_string(p, &p->value)), |
| 875 | 0) && |
| 876 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 877 | } |
| 878 | |
| 879 | /* parse a literal header that is never indexed; index < 15 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 880 | static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p, |
| 881 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 882 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 883 | parse_value_string_with_indexed_key, finish_lithdr_nvridx}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 884 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 885 | p->next_state = and_then; |
| 886 | p->index = (*cur) & 0xf; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 887 | return parse_string_prefix(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 888 | } |
| 889 | |
| 890 | /* parse a literal header that is never indexed; index >= 15 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 891 | static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p, |
| 892 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 893 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 894 | parse_string_prefix, parse_value_string_with_indexed_key, |
| 895 | finish_lithdr_nvridx}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 896 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 897 | p->next_state = and_then; |
| 898 | p->index = 0xf; |
| 899 | p->parsing.value = &p->index; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 900 | return parse_value0(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 901 | } |
| 902 | |
| 903 | /* parse a literal header that is never indexed; index == 0 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 904 | static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p, |
| 905 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 906 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 907 | parse_key_string, parse_string_prefix, |
| 908 | parse_value_string_with_literal_key, finish_lithdr_nvridx_v}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 909 | p->dynamic_table_update_allowed = 0; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 910 | p->next_state = and_then; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 911 | return parse_string_prefix(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 912 | } |
| 913 | |
| 914 | /* finish parsing a max table size change */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 915 | static 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 Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 918 | return grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index) && |
| 919 | parse_begin(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 920 | } |
| 921 | |
| 922 | /* parse a max table size change, max size < 15 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 923 | static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 924 | const gpr_uint8 *end) { |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 925 | if (p->dynamic_table_update_allowed == 0) { |
| 926 | return 0; |
| 927 | } |
| 928 | p->dynamic_table_update_allowed--; |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 929 | p->index = (*cur) & 0x1f; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 930 | return finish_max_tbl_size(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 931 | } |
| 932 | |
| 933 | /* parse a max table size change, max size >= 15 */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 934 | static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p, |
| 935 | const gpr_uint8 *cur, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 936 | static const grpc_chttp2_hpack_parser_state and_then[] = { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 937 | finish_max_tbl_size}; |
Craig Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 938 | if (p->dynamic_table_update_allowed == 0) { |
| 939 | return 0; |
| 940 | } |
| 941 | p->dynamic_table_update_allowed--; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 942 | p->next_state = and_then; |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 943 | p->index = 0x1f; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 944 | p->parsing.value = &p->index; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 945 | return parse_value0(p, cur + 1, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 946 | } |
| 947 | |
| 948 | /* a parse error: jam the parse state into parse_error, and return error */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 949 | static int parse_error(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 950 | const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 951 | p->state = parse_error; |
| 952 | return 0; |
| 953 | } |
| 954 | |
Craig Tiller | 3c53bb2 | 2015-11-10 14:24:36 +0000 | [diff] [blame] | 955 | static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 956 | const gpr_uint8 *end) { |
Craig Tiller | 027a74c | 2015-11-10 08:37:46 +0000 | [diff] [blame] | 957 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 962 | /* parse the 1st byte of a varint into p->parsing.value |
| 963 | no overflow is possible */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 964 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 970 | |
| 971 | *p->parsing.value += (*cur) & 0x7f; |
| 972 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 973 | if ((*cur) & 0x80) { |
| 974 | return parse_value1(p, cur + 1, end); |
| 975 | } else { |
| 976 | return parse_next(p, cur + 1, end); |
| 977 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 978 | } |
| 979 | |
| 980 | /* parse the 2nd byte of a varint into p->parsing.value |
| 981 | no overflow is possible */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 982 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 988 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 989 | *p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 7; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 990 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 991 | if ((*cur) & 0x80) { |
| 992 | return parse_value2(p, cur + 1, end); |
| 993 | } else { |
| 994 | return parse_next(p, cur + 1, end); |
| 995 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 996 | } |
| 997 | |
| 998 | /* parse the 3rd byte of a varint into p->parsing.value |
| 999 | no overflow is possible */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1000 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1006 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1007 | *p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 14; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1008 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1009 | if ((*cur) & 0x80) { |
| 1010 | return parse_value3(p, cur + 1, end); |
| 1011 | } else { |
| 1012 | return parse_next(p, cur + 1, end); |
| 1013 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1014 | } |
| 1015 | |
| 1016 | /* parse the 4th byte of a varint into p->parsing.value |
| 1017 | no overflow is possible */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1018 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1024 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1025 | *p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 21; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1026 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1027 | if ((*cur) & 0x80) { |
| 1028 | return parse_value4(p, cur + 1, end); |
| 1029 | } else { |
| 1030 | return parse_next(p, cur + 1, end); |
| 1031 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1032 | } |
| 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1036 | static int parse_value4(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 1037 | const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1038 | gpr_uint8 c; |
| 1039 | gpr_uint32 cur_value; |
| 1040 | gpr_uint32 add_value; |
| 1041 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1042 | if (cur == end) { |
| 1043 | p->state = parse_value4; |
| 1044 | return 1; |
| 1045 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1046 | |
| 1047 | c = (*cur) & 0x7f; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1048 | if (c > 0xf) { |
| 1049 | goto error; |
| 1050 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1051 | |
| 1052 | cur_value = *p->parsing.value; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1053 | add_value = ((gpr_uint32)c) << 28; |
| 1054 | if (add_value > 0xffffffffu - cur_value) { |
| 1055 | goto error; |
| 1056 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1057 | |
| 1058 | *p->parsing.value = cur_value + add_value; |
| 1059 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1060 | if ((*cur) & 0x80) { |
| 1061 | return parse_value5up(p, cur + 1, end); |
| 1062 | } else { |
| 1063 | return parse_next(p, cur + 1, end); |
| 1064 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1065 | |
| 1066 | error: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1067 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1072 | } |
| 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1077 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1082 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1083 | if (cur == end) { |
| 1084 | p->state = parse_value5up; |
| 1085 | return 1; |
| 1086 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1087 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1088 | if (*cur == 0) { |
| 1089 | return parse_next(p, cur + 1, end); |
| 1090 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1091 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1092 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1096 | } |
| 1097 | |
| 1098 | /* parse a string prefix */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1099 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1105 | |
| 1106 | p->strlen = (*cur) & 0x7f; |
| 1107 | p->huff = (*cur) >> 7; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1108 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1114 | } |
| 1115 | |
| 1116 | /* append some bytes to a string */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1117 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1127 | } |
| 1128 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1129 | static int append_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 1130 | const gpr_uint8 *end) { |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1131 | grpc_chttp2_hpack_parser_string *str = p->parsing.str; |
| 1132 | gpr_uint32 bits; |
| 1133 | gpr_uint8 decoded[3]; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1134 | switch ((binary_state)p->binary) { |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1135 | case NOT_BINARY: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1136 | append_bytes(str, cur, (size_t)(end - cur)); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1137 | return 1; |
| 1138 | b64_byte0: |
| 1139 | case B64_BYTE0: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1140 | if (cur == end) { |
| 1141 | p->binary = B64_BYTE0; |
| 1142 | return 1; |
| 1143 | } |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1144 | bits = inverse_base64[*cur]; |
| 1145 | ++cur; |
| 1146 | if (bits == 255) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1147 | return 0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1148 | else if (bits == 64) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1149 | goto b64_byte0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1150 | p->base64_buffer = bits << 18; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1151 | /* fallthrough */ |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1152 | b64_byte1: |
| 1153 | case B64_BYTE1: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1154 | if (cur == end) { |
| 1155 | p->binary = B64_BYTE1; |
| 1156 | return 1; |
| 1157 | } |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1158 | bits = inverse_base64[*cur]; |
| 1159 | ++cur; |
| 1160 | if (bits == 255) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1161 | return 0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1162 | else if (bits == 64) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1163 | goto b64_byte1; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1164 | p->base64_buffer |= bits << 12; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1165 | /* fallthrough */ |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1166 | b64_byte2: |
| 1167 | case B64_BYTE2: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1168 | if (cur == end) { |
| 1169 | p->binary = B64_BYTE2; |
| 1170 | return 1; |
| 1171 | } |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1172 | bits = inverse_base64[*cur]; |
| 1173 | ++cur; |
| 1174 | if (bits == 255) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1175 | return 0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1176 | else if (bits == 64) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1177 | goto b64_byte2; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1178 | p->base64_buffer |= bits << 6; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1179 | /* fallthrough */ |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1180 | b64_byte3: |
| 1181 | case B64_BYTE3: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1182 | if (cur == end) { |
| 1183 | p->binary = B64_BYTE3; |
| 1184 | return 1; |
| 1185 | } |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1186 | bits = inverse_base64[*cur]; |
| 1187 | ++cur; |
| 1188 | if (bits == 255) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1189 | return 0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1190 | else if (bits == 64) |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1191 | goto b64_byte3; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1192 | p->base64_buffer |= bits; |
| 1193 | bits = p->base64_buffer; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1194 | 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); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1198 | goto b64_byte0; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1199 | } |
yang-g | b063c87 | 2015-10-07 11:40:13 -0700 | [diff] [blame] | 1200 | GPR_UNREACHABLE_CODE(return 1); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1201 | } |
| 1202 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1203 | /* append a null terminator to a string */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1204 | static int finish_str(grpc_chttp2_hpack_parser *p) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1205 | gpr_uint8 terminator = 0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1206 | gpr_uint8 decoded[2]; |
| 1207 | gpr_uint32 bits; |
| 1208 | grpc_chttp2_hpack_parser_string *str = p->parsing.str; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1209 | switch ((binary_state)p->binary) { |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1210 | case NOT_BINARY: |
| 1211 | break; |
| 1212 | case B64_BYTE0: |
| 1213 | break; |
| 1214 | case B64_BYTE1: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1215 | gpr_log(GPR_ERROR, "illegal base64 encoding"); |
| 1216 | return 0; /* illegal encoding */ |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1217 | case B64_BYTE2: |
| 1218 | bits = p->base64_buffer; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1219 | 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); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1226 | break; |
| 1227 | case B64_BYTE3: |
| 1228 | bits = p->base64_buffer; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1229 | 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); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1237 | break; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1238 | } |
| 1239 | append_bytes(str, &terminator, 1); |
| 1240 | p->parsing.str->length--; /* don't actually count the null terminator */ |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1241 | return 1; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1242 | } |
| 1243 | |
| 1244 | /* decode a nibble from a huffman encoded stream */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1245 | static int huff_nibble(grpc_chttp2_hpack_parser *p, gpr_uint8 nibble) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1246 | 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1248 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1254 | } |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1255 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1256 | p->huff_state = next; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1257 | return 1; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1258 | } |
| 1259 | |
| 1260 | /* decode full bytes from a huffman encoded stream */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1261 | static 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 | } |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1266 | return 1; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1267 | } |
| 1268 | |
| 1269 | /* decode some string bytes based on the current decoding mode |
| 1270 | (huffman or not) */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1271 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1278 | } |
| 1279 | |
| 1280 | /* parse a string - tries to do large chunks at a time */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1281 | static int parse_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur, |
| 1282 | const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1283 | size_t remaining = p->strlen - p->strgot; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1284 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1295 | } |
| 1296 | |
| 1297 | /* begin parsing a string - performs setup, calls parse_string */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1298 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1301 | p->strgot = 0; |
| 1302 | str->length = 0; |
| 1303 | p->parsing.str = str; |
| 1304 | p->huff_state = 0; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1305 | p->binary = binary; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1306 | return parse_string(p, cur, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1307 | } |
| 1308 | |
| 1309 | /* parse the key string */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1310 | static 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); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1313 | } |
| 1314 | |
| 1315 | /* check if a key represents a binary header or not */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1316 | typedef enum { BINARY_HEADER, PLAINTEXT_HEADER, ERROR_HEADER } is_binary_header; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1317 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1318 | static 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; |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1321 | } |
| 1322 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1323 | static 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 Tiller | 535701c | 2015-12-07 10:09:44 -0800 | [diff] [blame] | 1325 | if (!elem) { |
| 1326 | gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index); |
| 1327 | return ERROR_HEADER; |
| 1328 | } |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1329 | 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1334 | } |
| 1335 | |
| 1336 | /* parse the value string */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1337 | static 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) { |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1340 | case BINARY_HEADER: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1341 | return begin_parse_string(p, cur, end, B64_BYTE0, &p->value); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1342 | case PLAINTEXT_HEADER: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1343 | return begin_parse_string(p, cur, end, NOT_BINARY, &p->value); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1344 | case ERROR_HEADER: |
| 1345 | return 0; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1346 | } |
vpai | 61cba0b | 2014-12-15 14:40:45 -0800 | [diff] [blame] | 1347 | /* Add code to prevent return without value error */ |
yang-g | b063c87 | 2015-10-07 11:40:13 -0700 | [diff] [blame] | 1348 | GPR_UNREACHABLE_CODE(return 0); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1349 | } |
| 1350 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1351 | static 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)); |
ctiller | 33023c4 | 2014-12-12 16:28:33 -0800 | [diff] [blame] | 1355 | } |
| 1356 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1357 | static 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1361 | } |
| 1362 | |
| 1363 | /* PUBLIC INTERFACE */ |
| 1364 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1365 | static void on_header_not_set(void *user_data, grpc_mdelem *md) { |
Craig Tiller | 535701c | 2015-12-07 10:09:44 -0800 | [diff] [blame] | 1366 | GPR_UNREACHABLE_CODE(return ); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1367 | } |
| 1368 | |
Craig Tiller | b2b4261 | 2015-11-20 12:02:17 -0800 | [diff] [blame] | 1369 | void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1370 | 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 Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 1379 | p->dynamic_table_update_allowed = 2; |
Craig Tiller | b2b4261 | 2015-11-20 12:02:17 -0800 | [diff] [blame] | 1380 | grpc_chttp2_hptbl_init(&p->table); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1381 | } |
| 1382 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1383 | void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) { |
Craig Tiller | d1e5fe3 | 2015-05-21 14:12:23 -0700 | [diff] [blame] | 1384 | p->after_prioritization = p->state; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1385 | p->state = parse_stream_dep0; |
| 1386 | } |
| 1387 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1388 | void 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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1392 | } |
| 1393 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1394 | int grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p, |
| 1395 | const gpr_uint8 *beg, const gpr_uint8 *end) { |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1396 | /* TODO(ctiller): limit the distance of end from beg, and perform multiple |
Craig Tiller | 45724b3 | 2015-09-22 10:42:19 -0700 | [diff] [blame] | 1397 | 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1400 | return p->state(p, beg, end); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1401 | } |
| 1402 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1403 | grpc_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 Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1407 | grpc_chttp2_hpack_parser *parser = hpack_parser; |
Craig Tiller | 9d35a1f | 2015-11-02 14:16:12 -0800 | [diff] [blame] | 1408 | GPR_TIMER_BEGIN("grpc_chttp2_hpack_parser_parse", 0); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1409 | if (!grpc_chttp2_hpack_parser_parse(parser, GPR_SLICE_START_PTR(slice), |
| 1410 | GPR_SLICE_END_PTR(slice))) { |
Craig Tiller | 9d35a1f | 2015-11-02 14:16:12 -0800 | [diff] [blame] | 1411 | GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1412 | 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 Tiller | 9d35a1f | 2015-11-02 14:16:12 -0800 | [diff] [blame] | 1418 | GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1419 | return GRPC_CHTTP2_CONNECTION_ERROR; |
| 1420 | } |
Craig Tiller | c321814 | 2015-12-08 08:30:39 -0800 | [diff] [blame] | 1421 | /* 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 Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1434 | } |
| 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 Tiller | 7b01b75 | 2015-12-02 16:52:54 -0800 | [diff] [blame] | 1439 | parser->dynamic_table_update_allowed = 2; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 1440 | } |
Craig Tiller | 9d35a1f | 2015-11-02 14:16:12 -0800 | [diff] [blame] | 1441 | GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1442 | return GRPC_CHTTP2_PARSE_OK; |
Craig Tiller | 190d360 | 2015-02-18 09:23:38 -0800 | [diff] [blame] | 1443 | } |