nghttp2_helper.c 35 KB

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