Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmnghttp2/lib/nghttp2_helper.c
3153 views
1
/*
2
* nghttp2 - HTTP/2 C Library
3
*
4
* Copyright (c) 2012 Tatsuhiro Tsujikawa
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining
7
* a copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sublicense, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
13
*
14
* The above copyright notice and this permission notice shall be
15
* included in all copies or substantial portions of the Software.
16
*
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
*/
25
#include "nghttp2_helper.h"
26
27
#include <assert.h>
28
#include <string.h>
29
30
#include "nghttp2_net.h"
31
32
void nghttp2_put_uint16be(uint8_t *buf, uint16_t n) {
33
uint16_t x = htons(n);
34
memcpy(buf, &x, sizeof(uint16_t));
35
}
36
37
void nghttp2_put_uint32be(uint8_t *buf, uint32_t n) {
38
uint32_t x = htonl(n);
39
memcpy(buf, &x, sizeof(uint32_t));
40
}
41
42
uint16_t nghttp2_get_uint16(const uint8_t *data) {
43
uint16_t n;
44
memcpy(&n, data, sizeof(uint16_t));
45
return ntohs(n);
46
}
47
48
uint32_t nghttp2_get_uint32(const uint8_t *data) {
49
uint32_t n;
50
memcpy(&n, data, sizeof(uint32_t));
51
return ntohl(n);
52
}
53
54
/* Generated by gendowncasetbl.py */
55
static const uint8_t DOWNCASE_TBL[] = {
56
0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */,
57
4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */,
58
8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */,
59
12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */,
60
16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */,
61
20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */,
62
24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */,
63
28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */,
64
32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */,
65
36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */,
66
40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */,
67
44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */,
68
48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */,
69
52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */,
70
56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */,
71
60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */,
72
64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */,
73
100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */,
74
104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */,
75
108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */,
76
112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */,
77
116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */,
78
120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */,
79
92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */,
80
96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */,
81
100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */,
82
104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */,
83
108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */,
84
112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */,
85
116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */,
86
120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */,
87
124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */,
88
128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */,
89
132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */,
90
136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */,
91
140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */,
92
144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */,
93
148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */,
94
152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */,
95
156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */,
96
160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */,
97
164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */,
98
168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */,
99
172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */,
100
176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */,
101
180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */,
102
184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */,
103
188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */,
104
192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */,
105
196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */,
106
200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */,
107
204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */,
108
208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */,
109
212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */,
110
216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */,
111
220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */,
112
224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */,
113
228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */,
114
232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */,
115
236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */,
116
240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */,
117
244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */,
118
248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */,
119
252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */,
120
};
121
122
void nghttp2_downcase(uint8_t *s, size_t len) {
123
size_t i;
124
for (i = 0; i < len; ++i) {
125
s[i] = DOWNCASE_TBL[s[i]];
126
}
127
}
128
129
/*
130
* local_window_size
131
* ^ *
132
* | * recv_window_size
133
* | * * ^
134
* | * * |
135
* 0+++++++++
136
* | * * \
137
* | * * | This rage is hidden in flow control. But it must be
138
* v * * / kept in order to restore it when window size is enlarged.
139
* recv_reduction
140
* (+ for negative direction)
141
*
142
* recv_window_size could be negative if we decrease
143
* local_window_size more than recv_window_size:
144
*
145
* local_window_size
146
* ^ *
147
* | *
148
* | *
149
* 0++++++++
150
* | * ^ recv_window_size (negative)
151
* | * |
152
* v * *
153
* recv_reduction
154
*/
155
int nghttp2_adjust_local_window_size(int32_t *local_window_size_ptr,
156
int32_t *recv_window_size_ptr,
157
int32_t *recv_reduction_ptr,
158
int32_t *delta_ptr) {
159
if (*delta_ptr > 0) {
160
int32_t recv_reduction_delta;
161
int32_t delta;
162
int32_t new_recv_window_size =
163
nghttp2_max(0, *recv_window_size_ptr) - *delta_ptr;
164
165
if (new_recv_window_size >= 0) {
166
*recv_window_size_ptr = new_recv_window_size;
167
return 0;
168
}
169
170
delta = -new_recv_window_size;
171
172
/* The delta size is strictly more than received bytes. Increase
173
local_window_size by that difference |delta|. */
174
if (*local_window_size_ptr > NGHTTP2_MAX_WINDOW_SIZE - delta) {
175
return NGHTTP2_ERR_FLOW_CONTROL;
176
}
177
*local_window_size_ptr += delta;
178
/* If there is recv_reduction due to earlier window_size
179
reduction, we have to adjust it too. */
180
recv_reduction_delta = nghttp2_min(*recv_reduction_ptr, delta);
181
*recv_reduction_ptr -= recv_reduction_delta;
182
if (*recv_window_size_ptr < 0) {
183
*recv_window_size_ptr += recv_reduction_delta;
184
} else {
185
/* If *recv_window_size_ptr > 0, then those bytes are going to
186
be returned to the remote peer (by WINDOW_UPDATE with the
187
adjusted *delta_ptr), so it is effectively 0 now. We set to
188
*recv_reduction_delta, because caller does not take into
189
account it in *delta_ptr. */
190
*recv_window_size_ptr = recv_reduction_delta;
191
}
192
/* recv_reduction_delta must be paid from *delta_ptr, since it was
193
added in window size reduction (see below). */
194
*delta_ptr -= recv_reduction_delta;
195
196
return 0;
197
}
198
199
if (*local_window_size_ptr + *delta_ptr < 0 ||
200
*recv_window_size_ptr < INT32_MIN - *delta_ptr ||
201
*recv_reduction_ptr > INT32_MAX + *delta_ptr) {
202
return NGHTTP2_ERR_FLOW_CONTROL;
203
}
204
/* Decreasing local window size. Note that we achieve this without
205
noticing to the remote peer. To do this, we cut
206
recv_window_size by -delta. This means that we don't send
207
WINDOW_UPDATE for -delta bytes. */
208
*local_window_size_ptr += *delta_ptr;
209
*recv_window_size_ptr += *delta_ptr;
210
*recv_reduction_ptr -= *delta_ptr;
211
*delta_ptr = 0;
212
213
return 0;
214
}
215
216
int nghttp2_increase_local_window_size(int32_t *local_window_size_ptr,
217
int32_t *recv_window_size_ptr,
218
int32_t *recv_reduction_ptr,
219
int32_t *delta_ptr) {
220
int32_t recv_reduction_delta;
221
int32_t delta;
222
223
delta = *delta_ptr;
224
225
assert(delta >= 0);
226
227
/* The delta size is strictly more than received bytes. Increase
228
local_window_size by that difference |delta|. */
229
if (*local_window_size_ptr > NGHTTP2_MAX_WINDOW_SIZE - delta) {
230
return NGHTTP2_ERR_FLOW_CONTROL;
231
}
232
233
*local_window_size_ptr += delta;
234
/* If there is recv_reduction due to earlier window_size
235
reduction, we have to adjust it too. */
236
recv_reduction_delta = nghttp2_min(*recv_reduction_ptr, delta);
237
*recv_reduction_ptr -= recv_reduction_delta;
238
239
*recv_window_size_ptr += recv_reduction_delta;
240
241
/* recv_reduction_delta must be paid from *delta_ptr, since it was
242
added in window size reduction (see below). */
243
*delta_ptr -= recv_reduction_delta;
244
245
return 0;
246
}
247
248
int nghttp2_should_send_window_update(int32_t local_window_size,
249
int32_t recv_window_size) {
250
return recv_window_size > 0 && recv_window_size >= local_window_size / 2;
251
}
252
253
const char *nghttp2_strerror(int error_code) {
254
switch (error_code) {
255
case 0:
256
return "Success";
257
case NGHTTP2_ERR_INVALID_ARGUMENT:
258
return "Invalid argument";
259
case NGHTTP2_ERR_BUFFER_ERROR:
260
return "Out of buffer space";
261
case NGHTTP2_ERR_UNSUPPORTED_VERSION:
262
return "Unsupported SPDY version";
263
case NGHTTP2_ERR_WOULDBLOCK:
264
return "Operation would block";
265
case NGHTTP2_ERR_PROTO:
266
return "Protocol error";
267
case NGHTTP2_ERR_INVALID_FRAME:
268
return "Invalid frame octets";
269
case NGHTTP2_ERR_EOF:
270
return "EOF";
271
case NGHTTP2_ERR_DEFERRED:
272
return "Data transfer deferred";
273
case NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE:
274
return "No more Stream ID available";
275
case NGHTTP2_ERR_STREAM_CLOSED:
276
return "Stream was already closed or invalid";
277
case NGHTTP2_ERR_STREAM_CLOSING:
278
return "Stream is closing";
279
case NGHTTP2_ERR_STREAM_SHUT_WR:
280
return "The transmission is not allowed for this stream";
281
case NGHTTP2_ERR_INVALID_STREAM_ID:
282
return "Stream ID is invalid";
283
case NGHTTP2_ERR_INVALID_STREAM_STATE:
284
return "Invalid stream state";
285
case NGHTTP2_ERR_DEFERRED_DATA_EXIST:
286
return "Another DATA frame has already been deferred";
287
case NGHTTP2_ERR_START_STREAM_NOT_ALLOWED:
288
return "request HEADERS is not allowed";
289
case NGHTTP2_ERR_GOAWAY_ALREADY_SENT:
290
return "GOAWAY has already been sent";
291
case NGHTTP2_ERR_INVALID_HEADER_BLOCK:
292
return "Invalid header block";
293
case NGHTTP2_ERR_INVALID_STATE:
294
return "Invalid state";
295
case NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE:
296
return "The user callback function failed due to the temporal error";
297
case NGHTTP2_ERR_FRAME_SIZE_ERROR:
298
return "The length of the frame is invalid";
299
case NGHTTP2_ERR_HEADER_COMP:
300
return "Header compression/decompression error";
301
case NGHTTP2_ERR_FLOW_CONTROL:
302
return "Flow control error";
303
case NGHTTP2_ERR_INSUFF_BUFSIZE:
304
return "Insufficient buffer size given to function";
305
case NGHTTP2_ERR_PAUSE:
306
return "Callback was paused by the application";
307
case NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS:
308
return "Too many inflight SETTINGS";
309
case NGHTTP2_ERR_PUSH_DISABLED:
310
return "Server push is disabled by peer";
311
case NGHTTP2_ERR_DATA_EXIST:
312
return "DATA or HEADERS frame has already been submitted for the stream";
313
case NGHTTP2_ERR_SESSION_CLOSING:
314
return "The current session is closing";
315
case NGHTTP2_ERR_HTTP_HEADER:
316
return "Invalid HTTP header field was received";
317
case NGHTTP2_ERR_HTTP_MESSAGING:
318
return "Violation in HTTP messaging rule";
319
case NGHTTP2_ERR_REFUSED_STREAM:
320
return "Stream was refused";
321
case NGHTTP2_ERR_INTERNAL:
322
return "Internal error";
323
case NGHTTP2_ERR_CANCEL:
324
return "Cancel";
325
case NGHTTP2_ERR_SETTINGS_EXPECTED:
326
return "When a local endpoint expects to receive SETTINGS frame, it "
327
"receives an other type of frame";
328
case NGHTTP2_ERR_NOMEM:
329
return "Out of memory";
330
case NGHTTP2_ERR_CALLBACK_FAILURE:
331
return "The user callback function failed";
332
case NGHTTP2_ERR_BAD_CLIENT_MAGIC:
333
return "Received bad client magic byte string";
334
case NGHTTP2_ERR_FLOODED:
335
return "Flooding was detected in this HTTP/2 session, and it must be "
336
"closed";
337
case NGHTTP2_ERR_TOO_MANY_SETTINGS:
338
return "SETTINGS frame contained more than the maximum allowed entries";
339
default:
340
return "Unknown error code";
341
}
342
}
343
344
/* Generated by gennmchartbl.py */
345
static const int VALID_HD_NAME_CHARS[] = {
346
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
347
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
348
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
349
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
350
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
351
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
352
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
353
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
354
0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
355
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
356
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
357
0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
358
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
359
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
360
1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
361
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
362
0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */,
363
0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */,
364
0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */,
365
0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */,
366
0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */,
367
0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */,
368
0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */,
369
0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
370
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
371
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
372
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
373
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
374
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
375
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
376
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
377
1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
378
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
379
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
380
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
381
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
382
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
383
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
384
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
385
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
386
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
387
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
388
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
389
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
390
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
391
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
392
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
393
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
394
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
395
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
396
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
397
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
398
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
399
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
400
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
401
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
402
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
403
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
404
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
405
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
406
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
407
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
408
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
409
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
410
};
411
412
int nghttp2_check_header_name(const uint8_t *name, size_t len) {
413
const uint8_t *last;
414
if (len == 0) {
415
return 0;
416
}
417
if (*name == ':') {
418
if (len == 1) {
419
return 0;
420
}
421
++name;
422
--len;
423
}
424
for (last = name + len; name != last; ++name) {
425
if (!VALID_HD_NAME_CHARS[*name]) {
426
return 0;
427
}
428
}
429
return 1;
430
}
431
432
/* Generated by genvchartbl.py */
433
static const int VALID_HD_VALUE_CHARS[] = {
434
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
435
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
436
0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */,
437
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
438
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
439
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
440
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
441
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
442
1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
443
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
444
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
445
1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
446
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
447
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
448
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
449
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
450
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
451
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
452
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
453
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
454
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
455
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
456
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
457
1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
458
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
459
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
460
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
461
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
462
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
463
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
464
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
465
1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
466
1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
467
1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
468
1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
469
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
470
1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
471
1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
472
1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
473
1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
474
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
475
1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
476
1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
477
1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
478
1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
479
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
480
1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
481
1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
482
1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
483
1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
484
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
485
1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
486
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
487
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
488
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
489
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
490
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
491
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
492
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
493
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
494
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
495
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
496
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
497
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
498
};
499
500
int nghttp2_check_header_value(const uint8_t *value, size_t len) {
501
const uint8_t *last;
502
for (last = value + len; value != last; ++value) {
503
if (!VALID_HD_VALUE_CHARS[*value]) {
504
return 0;
505
}
506
}
507
return 1;
508
}
509
510
int nghttp2_check_header_value_rfc9113(const uint8_t *value, size_t len) {
511
if (len == 0) {
512
return 1;
513
}
514
515
if (*value == ' ' || *value == '\t' || *(value + len - 1) == ' ' ||
516
*(value + len - 1) == '\t') {
517
return 0;
518
}
519
520
return nghttp2_check_header_value(value, len);
521
}
522
523
/* Generated by genmethodchartbl.py */
524
static char VALID_METHOD_CHARS[] = {
525
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
526
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
527
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
528
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
529
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
530
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
531
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
532
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
533
0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
534
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
535
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
536
0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
537
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
538
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
539
1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
540
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
541
0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
542
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
543
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
544
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
545
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
546
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
547
1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */,
548
0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
549
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
550
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
551
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
552
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
553
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
554
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
555
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
556
1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
557
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
558
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
559
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
560
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
561
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
562
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
563
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
564
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
565
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
566
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
567
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
568
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
569
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
570
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
571
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
572
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
573
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
574
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
575
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
576
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
577
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
578
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
579
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
580
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
581
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
582
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
583
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
584
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
585
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
586
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
587
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
588
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
589
};
590
591
int nghttp2_check_method(const uint8_t *value, size_t len) {
592
const uint8_t *last;
593
if (len == 0) {
594
return 0;
595
}
596
for (last = value + len; value != last; ++value) {
597
if (!VALID_METHOD_CHARS[*value]) {
598
return 0;
599
}
600
}
601
return 1;
602
}
603
604
/* Generated by genpathchartbl.py */
605
static char VALID_PATH_CHARS[] = {
606
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
607
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
608
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
609
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
610
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
611
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
612
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
613
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
614
0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
615
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
616
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
617
1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
618
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
619
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
620
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
621
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
622
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
623
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
624
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
625
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
626
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
627
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
628
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
629
1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
630
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
631
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
632
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
633
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
634
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
635
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
636
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
637
1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
638
1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
639
1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
640
1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
641
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
642
1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
643
1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
644
1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
645
1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
646
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
647
1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
648
1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
649
1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
650
1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
651
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
652
1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
653
1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
654
1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
655
1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
656
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
657
1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
658
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
659
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
660
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
661
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
662
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
663
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
664
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
665
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
666
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
667
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
668
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
669
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
670
};
671
672
int nghttp2_check_path(const uint8_t *value, size_t len) {
673
const uint8_t *last;
674
for (last = value + len; value != last; ++value) {
675
if (!VALID_PATH_CHARS[*value]) {
676
return 0;
677
}
678
}
679
return 1;
680
}
681
682
/* Generated by genauthoritychartbl.py */
683
static char VALID_AUTHORITY_CHARS[] = {
684
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
685
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
686
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
687
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
688
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
689
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
690
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
691
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
692
0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */,
693
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
694
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
695
1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
696
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
697
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
698
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
699
0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */,
700
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
701
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
702
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
703
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
704
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
705
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
706
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
707
0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */,
708
0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
709
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
710
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
711
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
712
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
713
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
714
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
715
0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
716
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
717
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
718
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
719
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
720
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
721
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
722
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
723
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
724
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
725
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
726
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
727
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
728
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
729
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
730
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
731
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
732
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
733
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
734
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
735
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
736
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
737
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
738
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
739
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
740
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
741
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
742
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
743
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
744
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
745
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
746
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
747
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
748
};
749
750
int nghttp2_check_authority(const uint8_t *value, size_t len) {
751
const uint8_t *last;
752
for (last = value + len; value != last; ++value) {
753
if (!VALID_AUTHORITY_CHARS[*value]) {
754
return 0;
755
}
756
}
757
return 1;
758
}
759
760
uint8_t *nghttp2_cpymem(uint8_t *dest, const void *src, size_t len) {
761
if (len == 0) {
762
return dest;
763
}
764
765
memcpy(dest, src, len);
766
767
return dest + len;
768
}
769
770
const char *nghttp2_http2_strerror(uint32_t error_code) {
771
switch (error_code) {
772
case NGHTTP2_NO_ERROR:
773
return "NO_ERROR";
774
case NGHTTP2_PROTOCOL_ERROR:
775
return "PROTOCOL_ERROR";
776
case NGHTTP2_INTERNAL_ERROR:
777
return "INTERNAL_ERROR";
778
case NGHTTP2_FLOW_CONTROL_ERROR:
779
return "FLOW_CONTROL_ERROR";
780
case NGHTTP2_SETTINGS_TIMEOUT:
781
return "SETTINGS_TIMEOUT";
782
case NGHTTP2_STREAM_CLOSED:
783
return "STREAM_CLOSED";
784
case NGHTTP2_FRAME_SIZE_ERROR:
785
return "FRAME_SIZE_ERROR";
786
case NGHTTP2_REFUSED_STREAM:
787
return "REFUSED_STREAM";
788
case NGHTTP2_CANCEL:
789
return "CANCEL";
790
case NGHTTP2_COMPRESSION_ERROR:
791
return "COMPRESSION_ERROR";
792
case NGHTTP2_CONNECT_ERROR:
793
return "CONNECT_ERROR";
794
case NGHTTP2_ENHANCE_YOUR_CALM:
795
return "ENHANCE_YOUR_CALM";
796
case NGHTTP2_INADEQUATE_SECURITY:
797
return "INADEQUATE_SECURITY";
798
case NGHTTP2_HTTP_1_1_REQUIRED:
799
return "HTTP_1_1_REQUIRED";
800
default:
801
return "unknown";
802
}
803
}
804
805