/src/nghttp2/lib/nghttp2_helper.c
Line | Count | Source (jump to first uncovered line) |
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 | 0 | void nghttp2_put_uint16be(uint8_t *buf, uint16_t n) { |
33 | 0 | uint16_t x = htons(n); |
34 | 0 | memcpy(buf, &x, sizeof(uint16_t)); |
35 | 0 | } |
36 | | |
37 | 0 | void nghttp2_put_uint32be(uint8_t *buf, uint32_t n) { |
38 | 0 | uint32_t x = htonl(n); |
39 | 0 | memcpy(buf, &x, sizeof(uint32_t)); |
40 | 0 | } |
41 | | |
42 | 0 | uint16_t nghttp2_get_uint16(const uint8_t *data) { |
43 | 0 | uint16_t n; |
44 | 0 | memcpy(&n, data, sizeof(uint16_t)); |
45 | 0 | return ntohs(n); |
46 | 0 | } |
47 | | |
48 | 0 | uint32_t nghttp2_get_uint32(const uint8_t *data) { |
49 | 0 | uint32_t n; |
50 | 0 | memcpy(&n, data, sizeof(uint32_t)); |
51 | 0 | return ntohl(n); |
52 | 0 | } |
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 | 0 | void nghttp2_downcase(uint8_t *s, size_t len) { |
123 | 0 | size_t i; |
124 | 0 | for (i = 0; i < len; ++i) { |
125 | 0 | s[i] = DOWNCASE_TBL[s[i]]; |
126 | 0 | } |
127 | 0 | } |
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 | 0 | int32_t *delta_ptr) { |
159 | 0 | if (*delta_ptr > 0) { |
160 | 0 | int32_t recv_reduction_delta; |
161 | 0 | int32_t delta; |
162 | 0 | int32_t new_recv_window_size = |
163 | 0 | nghttp2_max(0, *recv_window_size_ptr) - *delta_ptr; |
164 | |
|
165 | 0 | if (new_recv_window_size >= 0) { |
166 | 0 | *recv_window_size_ptr = new_recv_window_size; |
167 | 0 | return 0; |
168 | 0 | } |
169 | | |
170 | 0 | 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 | 0 | if (*local_window_size_ptr > NGHTTP2_MAX_WINDOW_SIZE - delta) { |
175 | 0 | return NGHTTP2_ERR_FLOW_CONTROL; |
176 | 0 | } |
177 | 0 | *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 | 0 | recv_reduction_delta = nghttp2_min(*recv_reduction_ptr, delta); |
181 | 0 | *recv_reduction_ptr -= recv_reduction_delta; |
182 | 0 | if (*recv_window_size_ptr < 0) { |
183 | 0 | *recv_window_size_ptr += recv_reduction_delta; |
184 | 0 | } 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 | 0 | *recv_window_size_ptr = recv_reduction_delta; |
191 | 0 | } |
192 | | /* recv_reduction_delta must be paid from *delta_ptr, since it was |
193 | | added in window size reduction (see below). */ |
194 | 0 | *delta_ptr -= recv_reduction_delta; |
195 | |
|
196 | 0 | return 0; |
197 | 0 | } |
198 | | |
199 | 0 | if (*local_window_size_ptr + *delta_ptr < 0 || |
200 | 0 | *recv_window_size_ptr < INT32_MIN - *delta_ptr || |
201 | 0 | *recv_reduction_ptr > INT32_MAX + *delta_ptr) { |
202 | 0 | return NGHTTP2_ERR_FLOW_CONTROL; |
203 | 0 | } |
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 | 0 | *local_window_size_ptr += *delta_ptr; |
209 | 0 | *recv_window_size_ptr += *delta_ptr; |
210 | 0 | *recv_reduction_ptr -= *delta_ptr; |
211 | 0 | *delta_ptr = 0; |
212 | |
|
213 | 0 | return 0; |
214 | 0 | } |
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 | 0 | int32_t *delta_ptr) { |
220 | 0 | int32_t recv_reduction_delta; |
221 | 0 | int32_t delta; |
222 | |
|
223 | 0 | delta = *delta_ptr; |
224 | |
|
225 | 0 | assert(delta >= 0); |
226 | | |
227 | | /* The delta size is strictly more than received bytes. Increase |
228 | | local_window_size by that difference |delta|. */ |
229 | 0 | if (*local_window_size_ptr > NGHTTP2_MAX_WINDOW_SIZE - delta) { |
230 | 0 | return NGHTTP2_ERR_FLOW_CONTROL; |
231 | 0 | } |
232 | | |
233 | 0 | *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 | 0 | recv_reduction_delta = nghttp2_min(*recv_reduction_ptr, delta); |
237 | 0 | *recv_reduction_ptr -= recv_reduction_delta; |
238 | |
|
239 | 0 | *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 | 0 | *delta_ptr -= recv_reduction_delta; |
244 | |
|
245 | 0 | return 0; |
246 | 0 | } |
247 | | |
248 | | int nghttp2_should_send_window_update(int32_t local_window_size, |
249 | 0 | int32_t recv_window_size) { |
250 | 0 | return recv_window_size > 0 && recv_window_size >= local_window_size / 2; |
251 | 0 | } |
252 | | |
253 | 0 | const char *nghttp2_strerror(int error_code) { |
254 | 0 | switch (error_code) { |
255 | 0 | case 0: |
256 | 0 | return "Success"; |
257 | 0 | case NGHTTP2_ERR_INVALID_ARGUMENT: |
258 | 0 | return "Invalid argument"; |
259 | 0 | case NGHTTP2_ERR_BUFFER_ERROR: |
260 | 0 | return "Out of buffer space"; |
261 | 0 | case NGHTTP2_ERR_UNSUPPORTED_VERSION: |
262 | 0 | return "Unsupported SPDY version"; |
263 | 0 | case NGHTTP2_ERR_WOULDBLOCK: |
264 | 0 | return "Operation would block"; |
265 | 0 | case NGHTTP2_ERR_PROTO: |
266 | 0 | return "Protocol error"; |
267 | 0 | case NGHTTP2_ERR_INVALID_FRAME: |
268 | 0 | return "Invalid frame octets"; |
269 | 0 | case NGHTTP2_ERR_EOF: |
270 | 0 | return "EOF"; |
271 | 0 | case NGHTTP2_ERR_DEFERRED: |
272 | 0 | return "Data transfer deferred"; |
273 | 0 | case NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE: |
274 | 0 | return "No more Stream ID available"; |
275 | 0 | case NGHTTP2_ERR_STREAM_CLOSED: |
276 | 0 | return "Stream was already closed or invalid"; |
277 | 0 | case NGHTTP2_ERR_STREAM_CLOSING: |
278 | 0 | return "Stream is closing"; |
279 | 0 | case NGHTTP2_ERR_STREAM_SHUT_WR: |
280 | 0 | return "The transmission is not allowed for this stream"; |
281 | 0 | case NGHTTP2_ERR_INVALID_STREAM_ID: |
282 | 0 | return "Stream ID is invalid"; |
283 | 0 | case NGHTTP2_ERR_INVALID_STREAM_STATE: |
284 | 0 | return "Invalid stream state"; |
285 | 0 | case NGHTTP2_ERR_DEFERRED_DATA_EXIST: |
286 | 0 | return "Another DATA frame has already been deferred"; |
287 | 0 | case NGHTTP2_ERR_START_STREAM_NOT_ALLOWED: |
288 | 0 | return "request HEADERS is not allowed"; |
289 | 0 | case NGHTTP2_ERR_GOAWAY_ALREADY_SENT: |
290 | 0 | return "GOAWAY has already been sent"; |
291 | 0 | case NGHTTP2_ERR_INVALID_HEADER_BLOCK: |
292 | 0 | return "Invalid header block"; |
293 | 0 | case NGHTTP2_ERR_INVALID_STATE: |
294 | 0 | return "Invalid state"; |
295 | 0 | case NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE: |
296 | 0 | return "The user callback function failed due to the temporal error"; |
297 | 0 | case NGHTTP2_ERR_FRAME_SIZE_ERROR: |
298 | 0 | return "The length of the frame is invalid"; |
299 | 0 | case NGHTTP2_ERR_HEADER_COMP: |
300 | 0 | return "Header compression/decompression error"; |
301 | 0 | case NGHTTP2_ERR_FLOW_CONTROL: |
302 | 0 | return "Flow control error"; |
303 | 0 | case NGHTTP2_ERR_INSUFF_BUFSIZE: |
304 | 0 | return "Insufficient buffer size given to function"; |
305 | 0 | case NGHTTP2_ERR_PAUSE: |
306 | 0 | return "Callback was paused by the application"; |
307 | 0 | case NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS: |
308 | 0 | return "Too many inflight SETTINGS"; |
309 | 0 | case NGHTTP2_ERR_PUSH_DISABLED: |
310 | 0 | return "Server push is disabled by peer"; |
311 | 0 | case NGHTTP2_ERR_DATA_EXIST: |
312 | 0 | return "DATA or HEADERS frame has already been submitted for the stream"; |
313 | 0 | case NGHTTP2_ERR_SESSION_CLOSING: |
314 | 0 | return "The current session is closing"; |
315 | 0 | case NGHTTP2_ERR_HTTP_HEADER: |
316 | 0 | return "Invalid HTTP header field was received"; |
317 | 0 | case NGHTTP2_ERR_HTTP_MESSAGING: |
318 | 0 | return "Violation in HTTP messaging rule"; |
319 | 0 | case NGHTTP2_ERR_REFUSED_STREAM: |
320 | 0 | return "Stream was refused"; |
321 | 0 | case NGHTTP2_ERR_INTERNAL: |
322 | 0 | return "Internal error"; |
323 | 0 | case NGHTTP2_ERR_CANCEL: |
324 | 0 | return "Cancel"; |
325 | 0 | case NGHTTP2_ERR_SETTINGS_EXPECTED: |
326 | 0 | return "When a local endpoint expects to receive SETTINGS frame, it " |
327 | 0 | "receives an other type of frame"; |
328 | 0 | case NGHTTP2_ERR_NOMEM: |
329 | 0 | return "Out of memory"; |
330 | 0 | case NGHTTP2_ERR_CALLBACK_FAILURE: |
331 | 0 | return "The user callback function failed"; |
332 | 0 | case NGHTTP2_ERR_BAD_CLIENT_MAGIC: |
333 | 0 | return "Received bad client magic byte string"; |
334 | 0 | case NGHTTP2_ERR_FLOODED: |
335 | 0 | return "Flooding was detected in this HTTP/2 session, and it must be " |
336 | 0 | "closed"; |
337 | 0 | case NGHTTP2_ERR_TOO_MANY_SETTINGS: |
338 | 0 | return "SETTINGS frame contained more than the maximum allowed entries"; |
339 | 0 | default: |
340 | 0 | return "Unknown error code"; |
341 | 0 | } |
342 | 0 | } |
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 | 0 | int nghttp2_check_header_name(const uint8_t *name, size_t len) { |
413 | 0 | const uint8_t *last; |
414 | 0 | if (len == 0) { |
415 | 0 | return 0; |
416 | 0 | } |
417 | 0 | if (*name == ':') { |
418 | 0 | if (len == 1) { |
419 | 0 | return 0; |
420 | 0 | } |
421 | 0 | ++name; |
422 | 0 | --len; |
423 | 0 | } |
424 | 0 | for (last = name + len; name != last; ++name) { |
425 | 0 | if (!VALID_HD_NAME_CHARS[*name]) { |
426 | 0 | return 0; |
427 | 0 | } |
428 | 0 | } |
429 | 0 | return 1; |
430 | 0 | } |
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 | 0 | int nghttp2_check_header_value(const uint8_t *value, size_t len) { |
501 | 0 | const uint8_t *last; |
502 | 0 | for (last = value + len; value != last; ++value) { |
503 | 0 | if (!VALID_HD_VALUE_CHARS[*value]) { |
504 | 0 | return 0; |
505 | 0 | } |
506 | 0 | } |
507 | 0 | return 1; |
508 | 0 | } |
509 | | |
510 | | /* Generated by genauthroitychartbl.py */ |
511 | | static char VALID_AUTHORITY_CHARS[] = { |
512 | | 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, |
513 | | 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, |
514 | | 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, |
515 | | 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, |
516 | | 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, |
517 | | 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, |
518 | | 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, |
519 | | 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, |
520 | | 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, |
521 | | 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, |
522 | | 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, |
523 | | 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, |
524 | | 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, |
525 | | 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, |
526 | | 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, |
527 | | 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, |
528 | | 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, |
529 | | 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, |
530 | | 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, |
531 | | 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, |
532 | | 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, |
533 | | 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, |
534 | | 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, |
535 | | 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, |
536 | | 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, |
537 | | 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, |
538 | | 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, |
539 | | 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, |
540 | | 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, |
541 | | 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, |
542 | | 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, |
543 | | 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, |
544 | | 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, |
545 | | 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, |
546 | | 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, |
547 | | 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, |
548 | | 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, |
549 | | 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, |
550 | | 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, |
551 | | 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, |
552 | | 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, |
553 | | 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, |
554 | | 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, |
555 | | 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, |
556 | | 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, |
557 | | 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, |
558 | | 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, |
559 | | 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, |
560 | | 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, |
561 | | 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, |
562 | | 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, |
563 | | 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, |
564 | | 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, |
565 | | 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, |
566 | | 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, |
567 | | 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, |
568 | | 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, |
569 | | 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, |
570 | | 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, |
571 | | 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, |
572 | | 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, |
573 | | 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, |
574 | | 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, |
575 | | 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ |
576 | | }; |
577 | | |
578 | 0 | int nghttp2_check_authority(const uint8_t *value, size_t len) { |
579 | 0 | const uint8_t *last; |
580 | 0 | for (last = value + len; value != last; ++value) { |
581 | 0 | if (!VALID_AUTHORITY_CHARS[*value]) { |
582 | 0 | return 0; |
583 | 0 | } |
584 | 0 | } |
585 | 0 | return 1; |
586 | 0 | } |
587 | | |
588 | 0 | uint8_t *nghttp2_cpymem(uint8_t *dest, const void *src, size_t len) { |
589 | 0 | if (len == 0) { |
590 | 0 | return dest; |
591 | 0 | } |
592 | | |
593 | 0 | memcpy(dest, src, len); |
594 | |
|
595 | 0 | return dest + len; |
596 | 0 | } |
597 | | |
598 | 0 | const char *nghttp2_http2_strerror(uint32_t error_code) { |
599 | 0 | switch (error_code) { |
600 | 0 | case NGHTTP2_NO_ERROR: |
601 | 0 | return "NO_ERROR"; |
602 | 0 | case NGHTTP2_PROTOCOL_ERROR: |
603 | 0 | return "PROTOCOL_ERROR"; |
604 | 0 | case NGHTTP2_INTERNAL_ERROR: |
605 | 0 | return "INTERNAL_ERROR"; |
606 | 0 | case NGHTTP2_FLOW_CONTROL_ERROR: |
607 | 0 | return "FLOW_CONTROL_ERROR"; |
608 | 0 | case NGHTTP2_SETTINGS_TIMEOUT: |
609 | 0 | return "SETTINGS_TIMEOUT"; |
610 | 0 | case NGHTTP2_STREAM_CLOSED: |
611 | 0 | return "STREAM_CLOSED"; |
612 | 0 | case NGHTTP2_FRAME_SIZE_ERROR: |
613 | 0 | return "FRAME_SIZE_ERROR"; |
614 | 0 | case NGHTTP2_REFUSED_STREAM: |
615 | 0 | return "REFUSED_STREAM"; |
616 | 0 | case NGHTTP2_CANCEL: |
617 | 0 | return "CANCEL"; |
618 | 0 | case NGHTTP2_COMPRESSION_ERROR: |
619 | 0 | return "COMPRESSION_ERROR"; |
620 | 0 | case NGHTTP2_CONNECT_ERROR: |
621 | 0 | return "CONNECT_ERROR"; |
622 | 0 | case NGHTTP2_ENHANCE_YOUR_CALM: |
623 | 0 | return "ENHANCE_YOUR_CALM"; |
624 | 0 | case NGHTTP2_INADEQUATE_SECURITY: |
625 | 0 | return "INADEQUATE_SECURITY"; |
626 | 0 | case NGHTTP2_HTTP_1_1_REQUIRED: |
627 | 0 | return "HTTP_1_1_REQUIRED"; |
628 | 0 | default: |
629 | 0 | return "unknown"; |
630 | 0 | } |
631 | 0 | } |