/ext/puma_http11/http11_parser.c

https://github.com/rkh/puma · C · 1225 lines · 1182 code · 31 blank · 12 comment · 475 complexity · b730c06283764e61843ba6461bd7558f MD5 · raw file

  1. #line 1 "ext/http11/http11_parser.rl"
  2. /**
  3. * Copyright (c) 2005 Zed A. Shaw
  4. * You can redistribute it and/or modify it under the same terms as Ruby.
  5. */
  6. #include "http11_parser.h"
  7. #include <stdio.h>
  8. #include <assert.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>
  11. #include <string.h>
  12. /*
  13. * capitalizes all lower-case ASCII characters,
  14. * converts dashes to underscores.
  15. */
  16. static void snake_upcase_char(char *c)
  17. {
  18. if (*c >= 'a' && *c <= 'z')
  19. *c &= ~0x20;
  20. else if (*c == '-')
  21. *c = '_';
  22. }
  23. #define LEN(AT, FPC) (FPC - buffer - parser->AT)
  24. #define MARK(M,FPC) (parser->M = (FPC) - buffer)
  25. #define PTR_TO(F) (buffer + parser->F)
  26. /** Machine **/
  27. #line 78 "ext/http11/http11_parser.rl"
  28. /** Data **/
  29. #line 39 "ext/http11/http11_parser.c"
  30. static const int http_parser_start = 1;
  31. static const int http_parser_first_final = 57;
  32. static const int http_parser_error = 0;
  33. static const int http_parser_en_main = 1;
  34. #line 82 "ext/http11/http11_parser.rl"
  35. int http_parser_init(http_parser *parser) {
  36. int cs = 0;
  37. #line 52 "ext/http11/http11_parser.c"
  38. {
  39. cs = http_parser_start;
  40. }
  41. #line 86 "ext/http11/http11_parser.rl"
  42. parser->cs = cs;
  43. parser->body_start = 0;
  44. parser->content_len = 0;
  45. parser->mark = 0;
  46. parser->nread = 0;
  47. parser->field_len = 0;
  48. parser->field_start = 0;
  49. parser->request = Qnil;
  50. parser->body = Qnil;
  51. return 1;
  52. }
  53. /** exec **/
  54. size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) {
  55. const char *p, *pe;
  56. int cs = parser->cs;
  57. assert(off <= len && "offset past end of buffer");
  58. p = buffer+off;
  59. pe = buffer+len;
  60. /* assert(*pe == '\0' && "pointer does not end on NUL"); */
  61. assert(pe - p == len - off && "pointers aren't same distance");
  62. #line 86 "ext/http11/http11_parser.c"
  63. {
  64. if ( p == pe )
  65. goto _test_eof;
  66. switch ( cs )
  67. {
  68. case 1:
  69. switch( (*p) ) {
  70. case 36: goto tr0;
  71. case 95: goto tr0;
  72. }
  73. if ( (*p) < 48 ) {
  74. if ( 45 <= (*p) && (*p) <= 46 )
  75. goto tr0;
  76. } else if ( (*p) > 57 ) {
  77. if ( 65 <= (*p) && (*p) <= 90 )
  78. goto tr0;
  79. } else
  80. goto tr0;
  81. goto st0;
  82. st0:
  83. cs = 0;
  84. goto _out;
  85. tr0:
  86. #line 34 "ext/http11/http11_parser.rl"
  87. { MARK(mark, p); }
  88. goto st2;
  89. st2:
  90. if ( ++p == pe )
  91. goto _test_eof2;
  92. case 2:
  93. #line 117 "ext/http11/http11_parser.c"
  94. switch( (*p) ) {
  95. case 32: goto tr2;
  96. case 36: goto st38;
  97. case 95: goto st38;
  98. }
  99. if ( (*p) < 48 ) {
  100. if ( 45 <= (*p) && (*p) <= 46 )
  101. goto st38;
  102. } else if ( (*p) > 57 ) {
  103. if ( 65 <= (*p) && (*p) <= 90 )
  104. goto st38;
  105. } else
  106. goto st38;
  107. goto st0;
  108. tr2:
  109. #line 47 "ext/http11/http11_parser.rl"
  110. {
  111. parser->request_method(parser, PTR_TO(mark), LEN(mark, p));
  112. }
  113. goto st3;
  114. st3:
  115. if ( ++p == pe )
  116. goto _test_eof3;
  117. case 3:
  118. #line 142 "ext/http11/http11_parser.c"
  119. switch( (*p) ) {
  120. case 42: goto tr4;
  121. case 43: goto tr5;
  122. case 47: goto tr6;
  123. case 58: goto tr7;
  124. }
  125. if ( (*p) < 65 ) {
  126. if ( 45 <= (*p) && (*p) <= 57 )
  127. goto tr5;
  128. } else if ( (*p) > 90 ) {
  129. if ( 97 <= (*p) && (*p) <= 122 )
  130. goto tr5;
  131. } else
  132. goto tr5;
  133. goto st0;
  134. tr4:
  135. #line 34 "ext/http11/http11_parser.rl"
  136. { MARK(mark, p); }
  137. goto st4;
  138. st4:
  139. if ( ++p == pe )
  140. goto _test_eof4;
  141. case 4:
  142. #line 166 "ext/http11/http11_parser.c"
  143. switch( (*p) ) {
  144. case 32: goto tr8;
  145. case 35: goto tr9;
  146. }
  147. goto st0;
  148. tr8:
  149. #line 50 "ext/http11/http11_parser.rl"
  150. {
  151. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  152. }
  153. goto st5;
  154. tr31:
  155. #line 34 "ext/http11/http11_parser.rl"
  156. { MARK(mark, p); }
  157. #line 53 "ext/http11/http11_parser.rl"
  158. {
  159. parser->fragment(parser, PTR_TO(mark), LEN(mark, p));
  160. }
  161. goto st5;
  162. tr34:
  163. #line 53 "ext/http11/http11_parser.rl"
  164. {
  165. parser->fragment(parser, PTR_TO(mark), LEN(mark, p));
  166. }
  167. goto st5;
  168. tr42:
  169. #line 66 "ext/http11/http11_parser.rl"
  170. {
  171. parser->request_path(parser, PTR_TO(mark), LEN(mark,p));
  172. }
  173. #line 50 "ext/http11/http11_parser.rl"
  174. {
  175. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  176. }
  177. goto st5;
  178. tr53:
  179. #line 57 "ext/http11/http11_parser.rl"
  180. { MARK(query_start, p); }
  181. #line 58 "ext/http11/http11_parser.rl"
  182. {
  183. parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p));
  184. }
  185. #line 50 "ext/http11/http11_parser.rl"
  186. {
  187. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  188. }
  189. goto st5;
  190. tr57:
  191. #line 58 "ext/http11/http11_parser.rl"
  192. {
  193. parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p));
  194. }
  195. #line 50 "ext/http11/http11_parser.rl"
  196. {
  197. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  198. }
  199. goto st5;
  200. st5:
  201. if ( ++p == pe )
  202. goto _test_eof5;
  203. case 5:
  204. #line 228 "ext/http11/http11_parser.c"
  205. if ( (*p) == 72 )
  206. goto tr10;
  207. goto st0;
  208. tr10:
  209. #line 34 "ext/http11/http11_parser.rl"
  210. { MARK(mark, p); }
  211. goto st6;
  212. st6:
  213. if ( ++p == pe )
  214. goto _test_eof6;
  215. case 6:
  216. #line 240 "ext/http11/http11_parser.c"
  217. if ( (*p) == 84 )
  218. goto st7;
  219. goto st0;
  220. st7:
  221. if ( ++p == pe )
  222. goto _test_eof7;
  223. case 7:
  224. if ( (*p) == 84 )
  225. goto st8;
  226. goto st0;
  227. st8:
  228. if ( ++p == pe )
  229. goto _test_eof8;
  230. case 8:
  231. if ( (*p) == 80 )
  232. goto st9;
  233. goto st0;
  234. st9:
  235. if ( ++p == pe )
  236. goto _test_eof9;
  237. case 9:
  238. if ( (*p) == 47 )
  239. goto st10;
  240. goto st0;
  241. st10:
  242. if ( ++p == pe )
  243. goto _test_eof10;
  244. case 10:
  245. if ( 48 <= (*p) && (*p) <= 57 )
  246. goto st11;
  247. goto st0;
  248. st11:
  249. if ( ++p == pe )
  250. goto _test_eof11;
  251. case 11:
  252. if ( (*p) == 46 )
  253. goto st12;
  254. if ( 48 <= (*p) && (*p) <= 57 )
  255. goto st11;
  256. goto st0;
  257. st12:
  258. if ( ++p == pe )
  259. goto _test_eof12;
  260. case 12:
  261. if ( 48 <= (*p) && (*p) <= 57 )
  262. goto st13;
  263. goto st0;
  264. st13:
  265. if ( ++p == pe )
  266. goto _test_eof13;
  267. case 13:
  268. if ( (*p) == 13 )
  269. goto tr18;
  270. if ( 48 <= (*p) && (*p) <= 57 )
  271. goto st13;
  272. goto st0;
  273. tr18:
  274. #line 62 "ext/http11/http11_parser.rl"
  275. {
  276. parser->http_version(parser, PTR_TO(mark), LEN(mark, p));
  277. }
  278. goto st14;
  279. tr26:
  280. #line 43 "ext/http11/http11_parser.rl"
  281. { MARK(mark, p); }
  282. #line 44 "ext/http11/http11_parser.rl"
  283. {
  284. parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
  285. }
  286. goto st14;
  287. tr29:
  288. #line 44 "ext/http11/http11_parser.rl"
  289. {
  290. parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
  291. }
  292. goto st14;
  293. st14:
  294. if ( ++p == pe )
  295. goto _test_eof14;
  296. case 14:
  297. #line 321 "ext/http11/http11_parser.c"
  298. if ( (*p) == 10 )
  299. goto st15;
  300. goto st0;
  301. st15:
  302. if ( ++p == pe )
  303. goto _test_eof15;
  304. case 15:
  305. switch( (*p) ) {
  306. case 13: goto st16;
  307. case 33: goto tr21;
  308. case 124: goto tr21;
  309. case 126: goto tr21;
  310. }
  311. if ( (*p) < 45 ) {
  312. if ( (*p) > 39 ) {
  313. if ( 42 <= (*p) && (*p) <= 43 )
  314. goto tr21;
  315. } else if ( (*p) >= 35 )
  316. goto tr21;
  317. } else if ( (*p) > 46 ) {
  318. if ( (*p) < 65 ) {
  319. if ( 48 <= (*p) && (*p) <= 57 )
  320. goto tr21;
  321. } else if ( (*p) > 90 ) {
  322. if ( 94 <= (*p) && (*p) <= 122 )
  323. goto tr21;
  324. } else
  325. goto tr21;
  326. } else
  327. goto tr21;
  328. goto st0;
  329. st16:
  330. if ( ++p == pe )
  331. goto _test_eof16;
  332. case 16:
  333. if ( (*p) == 10 )
  334. goto tr22;
  335. goto st0;
  336. tr22:
  337. #line 70 "ext/http11/http11_parser.rl"
  338. {
  339. parser->body_start = p - buffer + 1;
  340. parser->header_done(parser, p + 1, pe - p - 1);
  341. {p++; cs = 57; goto _out;}
  342. }
  343. goto st57;
  344. st57:
  345. if ( ++p == pe )
  346. goto _test_eof57;
  347. case 57:
  348. #line 372 "ext/http11/http11_parser.c"
  349. goto st0;
  350. tr21:
  351. #line 37 "ext/http11/http11_parser.rl"
  352. { MARK(field_start, p); }
  353. #line 38 "ext/http11/http11_parser.rl"
  354. { snake_upcase_char((char *)p); }
  355. goto st17;
  356. tr23:
  357. #line 38 "ext/http11/http11_parser.rl"
  358. { snake_upcase_char((char *)p); }
  359. goto st17;
  360. st17:
  361. if ( ++p == pe )
  362. goto _test_eof17;
  363. case 17:
  364. #line 388 "ext/http11/http11_parser.c"
  365. switch( (*p) ) {
  366. case 33: goto tr23;
  367. case 58: goto tr24;
  368. case 124: goto tr23;
  369. case 126: goto tr23;
  370. }
  371. if ( (*p) < 45 ) {
  372. if ( (*p) > 39 ) {
  373. if ( 42 <= (*p) && (*p) <= 43 )
  374. goto tr23;
  375. } else if ( (*p) >= 35 )
  376. goto tr23;
  377. } else if ( (*p) > 46 ) {
  378. if ( (*p) < 65 ) {
  379. if ( 48 <= (*p) && (*p) <= 57 )
  380. goto tr23;
  381. } else if ( (*p) > 90 ) {
  382. if ( 94 <= (*p) && (*p) <= 122 )
  383. goto tr23;
  384. } else
  385. goto tr23;
  386. } else
  387. goto tr23;
  388. goto st0;
  389. tr24:
  390. #line 39 "ext/http11/http11_parser.rl"
  391. {
  392. parser->field_len = LEN(field_start, p);
  393. }
  394. goto st18;
  395. tr27:
  396. #line 43 "ext/http11/http11_parser.rl"
  397. { MARK(mark, p); }
  398. goto st18;
  399. st18:
  400. if ( ++p == pe )
  401. goto _test_eof18;
  402. case 18:
  403. #line 427 "ext/http11/http11_parser.c"
  404. switch( (*p) ) {
  405. case 13: goto tr26;
  406. case 32: goto tr27;
  407. }
  408. goto tr25;
  409. tr25:
  410. #line 43 "ext/http11/http11_parser.rl"
  411. { MARK(mark, p); }
  412. goto st19;
  413. st19:
  414. if ( ++p == pe )
  415. goto _test_eof19;
  416. case 19:
  417. #line 441 "ext/http11/http11_parser.c"
  418. if ( (*p) == 13 )
  419. goto tr29;
  420. goto st19;
  421. tr9:
  422. #line 50 "ext/http11/http11_parser.rl"
  423. {
  424. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  425. }
  426. goto st20;
  427. tr43:
  428. #line 66 "ext/http11/http11_parser.rl"
  429. {
  430. parser->request_path(parser, PTR_TO(mark), LEN(mark,p));
  431. }
  432. #line 50 "ext/http11/http11_parser.rl"
  433. {
  434. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  435. }
  436. goto st20;
  437. tr54:
  438. #line 57 "ext/http11/http11_parser.rl"
  439. { MARK(query_start, p); }
  440. #line 58 "ext/http11/http11_parser.rl"
  441. {
  442. parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p));
  443. }
  444. #line 50 "ext/http11/http11_parser.rl"
  445. {
  446. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  447. }
  448. goto st20;
  449. tr58:
  450. #line 58 "ext/http11/http11_parser.rl"
  451. {
  452. parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p));
  453. }
  454. #line 50 "ext/http11/http11_parser.rl"
  455. {
  456. parser->request_uri(parser, PTR_TO(mark), LEN(mark, p));
  457. }
  458. goto st20;
  459. st20:
  460. if ( ++p == pe )
  461. goto _test_eof20;
  462. case 20:
  463. #line 487 "ext/http11/http11_parser.c"
  464. switch( (*p) ) {
  465. case 32: goto tr31;
  466. case 37: goto tr32;
  467. case 60: goto st0;
  468. case 62: goto st0;
  469. case 127: goto st0;
  470. }
  471. if ( (*p) > 31 ) {
  472. if ( 34 <= (*p) && (*p) <= 35 )
  473. goto st0;
  474. } else if ( (*p) >= 0 )
  475. goto st0;
  476. goto tr30;
  477. tr30:
  478. #line 34 "ext/http11/http11_parser.rl"
  479. { MARK(mark, p); }
  480. goto st21;
  481. st21:
  482. if ( ++p == pe )
  483. goto _test_eof21;
  484. case 21:
  485. #line 509 "ext/http11/http11_parser.c"
  486. switch( (*p) ) {
  487. case 32: goto tr34;
  488. case 37: goto st22;
  489. case 60: goto st0;
  490. case 62: goto st0;
  491. case 127: goto st0;
  492. }
  493. if ( (*p) > 31 ) {
  494. if ( 34 <= (*p) && (*p) <= 35 )
  495. goto st0;
  496. } else if ( (*p) >= 0 )
  497. goto st0;
  498. goto st21;
  499. tr32:
  500. #line 34 "ext/http11/http11_parser.rl"
  501. { MARK(mark, p); }
  502. goto st22;
  503. st22:
  504. if ( ++p == pe )
  505. goto _test_eof22;
  506. case 22:
  507. #line 531 "ext/http11/http11_parser.c"
  508. if ( (*p) < 65 ) {
  509. if ( 48 <= (*p) && (*p) <= 57 )
  510. goto st23;
  511. } else if ( (*p) > 70 ) {
  512. if ( 97 <= (*p) && (*p) <= 102 )
  513. goto st23;
  514. } else
  515. goto st23;
  516. goto st0;
  517. st23:
  518. if ( ++p == pe )
  519. goto _test_eof23;
  520. case 23:
  521. if ( (*p) < 65 ) {
  522. if ( 48 <= (*p) && (*p) <= 57 )
  523. goto st21;
  524. } else if ( (*p) > 70 ) {
  525. if ( 97 <= (*p) && (*p) <= 102 )
  526. goto st21;
  527. } else
  528. goto st21;
  529. goto st0;
  530. tr5:
  531. #line 34 "ext/http11/http11_parser.rl"
  532. { MARK(mark, p); }
  533. goto st24;
  534. st24:
  535. if ( ++p == pe )
  536. goto _test_eof24;
  537. case 24:
  538. #line 562 "ext/http11/http11_parser.c"
  539. switch( (*p) ) {
  540. case 43: goto st24;
  541. case 58: goto st25;
  542. }
  543. if ( (*p) < 48 ) {
  544. if ( 45 <= (*p) && (*p) <= 46 )
  545. goto st24;
  546. } else if ( (*p) > 57 ) {
  547. if ( (*p) > 90 ) {
  548. if ( 97 <= (*p) && (*p) <= 122 )
  549. goto st24;
  550. } else if ( (*p) >= 65 )
  551. goto st24;
  552. } else
  553. goto st24;
  554. goto st0;
  555. tr7:
  556. #line 34 "ext/http11/http11_parser.rl"
  557. { MARK(mark, p); }
  558. goto st25;
  559. st25:
  560. if ( ++p == pe )
  561. goto _test_eof25;
  562. case 25:
  563. #line 587 "ext/http11/http11_parser.c"
  564. switch( (*p) ) {
  565. case 32: goto tr8;
  566. case 34: goto st0;
  567. case 35: goto tr9;
  568. case 37: goto st26;
  569. case 60: goto st0;
  570. case 62: goto st0;
  571. case 127: goto st0;
  572. }
  573. if ( 0 <= (*p) && (*p) <= 31 )
  574. goto st0;
  575. goto st25;
  576. st26:
  577. if ( ++p == pe )
  578. goto _test_eof26;
  579. case 26:
  580. if ( (*p) < 65 ) {
  581. if ( 48 <= (*p) && (*p) <= 57 )
  582. goto st27;
  583. } else if ( (*p) > 70 ) {
  584. if ( 97 <= (*p) && (*p) <= 102 )
  585. goto st27;
  586. } else
  587. goto st27;
  588. goto st0;
  589. st27:
  590. if ( ++p == pe )
  591. goto _test_eof27;
  592. case 27:
  593. if ( (*p) < 65 ) {
  594. if ( 48 <= (*p) && (*p) <= 57 )
  595. goto st25;
  596. } else if ( (*p) > 70 ) {
  597. if ( 97 <= (*p) && (*p) <= 102 )
  598. goto st25;
  599. } else
  600. goto st25;
  601. goto st0;
  602. tr6:
  603. #line 34 "ext/http11/http11_parser.rl"
  604. { MARK(mark, p); }
  605. goto st28;
  606. st28:
  607. if ( ++p == pe )
  608. goto _test_eof28;
  609. case 28:
  610. #line 634 "ext/http11/http11_parser.c"
  611. switch( (*p) ) {
  612. case 32: goto tr42;
  613. case 34: goto st0;
  614. case 35: goto tr43;
  615. case 37: goto st29;
  616. case 59: goto tr45;
  617. case 60: goto st0;
  618. case 62: goto st0;
  619. case 63: goto tr46;
  620. case 127: goto st0;
  621. }
  622. if ( 0 <= (*p) && (*p) <= 31 )
  623. goto st0;
  624. goto st28;
  625. st29:
  626. if ( ++p == pe )
  627. goto _test_eof29;
  628. case 29:
  629. if ( (*p) < 65 ) {
  630. if ( 48 <= (*p) && (*p) <= 57 )
  631. goto st30;
  632. } else if ( (*p) > 70 ) {
  633. if ( 97 <= (*p) && (*p) <= 102 )
  634. goto st30;
  635. } else
  636. goto st30;
  637. goto st0;
  638. st30:
  639. if ( ++p == pe )
  640. goto _test_eof30;
  641. case 30:
  642. if ( (*p) < 65 ) {
  643. if ( 48 <= (*p) && (*p) <= 57 )
  644. goto st28;
  645. } else if ( (*p) > 70 ) {
  646. if ( 97 <= (*p) && (*p) <= 102 )
  647. goto st28;
  648. } else
  649. goto st28;
  650. goto st0;
  651. tr45:
  652. #line 66 "ext/http11/http11_parser.rl"
  653. {
  654. parser->request_path(parser, PTR_TO(mark), LEN(mark,p));
  655. }
  656. goto st31;
  657. st31:
  658. if ( ++p == pe )
  659. goto _test_eof31;
  660. case 31:
  661. #line 685 "ext/http11/http11_parser.c"
  662. switch( (*p) ) {
  663. case 32: goto tr8;
  664. case 34: goto st0;
  665. case 35: goto tr9;
  666. case 37: goto st32;
  667. case 60: goto st0;
  668. case 62: goto st0;
  669. case 63: goto st34;
  670. case 127: goto st0;
  671. }
  672. if ( 0 <= (*p) && (*p) <= 31 )
  673. goto st0;
  674. goto st31;
  675. st32:
  676. if ( ++p == pe )
  677. goto _test_eof32;
  678. case 32:
  679. if ( (*p) < 65 ) {
  680. if ( 48 <= (*p) && (*p) <= 57 )
  681. goto st33;
  682. } else if ( (*p) > 70 ) {
  683. if ( 97 <= (*p) && (*p) <= 102 )
  684. goto st33;
  685. } else
  686. goto st33;
  687. goto st0;
  688. st33:
  689. if ( ++p == pe )
  690. goto _test_eof33;
  691. case 33:
  692. if ( (*p) < 65 ) {
  693. if ( 48 <= (*p) && (*p) <= 57 )
  694. goto st31;
  695. } else if ( (*p) > 70 ) {
  696. if ( 97 <= (*p) && (*p) <= 102 )
  697. goto st31;
  698. } else
  699. goto st31;
  700. goto st0;
  701. tr46:
  702. #line 66 "ext/http11/http11_parser.rl"
  703. {
  704. parser->request_path(parser, PTR_TO(mark), LEN(mark,p));
  705. }
  706. goto st34;
  707. st34:
  708. if ( ++p == pe )
  709. goto _test_eof34;
  710. case 34:
  711. #line 735 "ext/http11/http11_parser.c"
  712. switch( (*p) ) {
  713. case 32: goto tr53;
  714. case 34: goto st0;
  715. case 35: goto tr54;
  716. case 37: goto tr55;
  717. case 60: goto st0;
  718. case 62: goto st0;
  719. case 127: goto st0;
  720. }
  721. if ( 0 <= (*p) && (*p) <= 31 )
  722. goto st0;
  723. goto tr52;
  724. tr52:
  725. #line 57 "ext/http11/http11_parser.rl"
  726. { MARK(query_start, p); }
  727. goto st35;
  728. st35:
  729. if ( ++p == pe )
  730. goto _test_eof35;
  731. case 35:
  732. #line 756 "ext/http11/http11_parser.c"
  733. switch( (*p) ) {
  734. case 32: goto tr57;
  735. case 34: goto st0;
  736. case 35: goto tr58;
  737. case 37: goto st36;
  738. case 60: goto st0;
  739. case 62: goto st0;
  740. case 127: goto st0;
  741. }
  742. if ( 0 <= (*p) && (*p) <= 31 )
  743. goto st0;
  744. goto st35;
  745. tr55:
  746. #line 57 "ext/http11/http11_parser.rl"
  747. { MARK(query_start, p); }
  748. goto st36;
  749. st36:
  750. if ( ++p == pe )
  751. goto _test_eof36;
  752. case 36:
  753. #line 777 "ext/http11/http11_parser.c"
  754. if ( (*p) < 65 ) {
  755. if ( 48 <= (*p) && (*p) <= 57 )
  756. goto st37;
  757. } else if ( (*p) > 70 ) {
  758. if ( 97 <= (*p) && (*p) <= 102 )
  759. goto st37;
  760. } else
  761. goto st37;
  762. goto st0;
  763. st37:
  764. if ( ++p == pe )
  765. goto _test_eof37;
  766. case 37:
  767. if ( (*p) < 65 ) {
  768. if ( 48 <= (*p) && (*p) <= 57 )
  769. goto st35;
  770. } else if ( (*p) > 70 ) {
  771. if ( 97 <= (*p) && (*p) <= 102 )
  772. goto st35;
  773. } else
  774. goto st35;
  775. goto st0;
  776. st38:
  777. if ( ++p == pe )
  778. goto _test_eof38;
  779. case 38:
  780. switch( (*p) ) {
  781. case 32: goto tr2;
  782. case 36: goto st39;
  783. case 95: goto st39;
  784. }
  785. if ( (*p) < 48 ) {
  786. if ( 45 <= (*p) && (*p) <= 46 )
  787. goto st39;
  788. } else if ( (*p) > 57 ) {
  789. if ( 65 <= (*p) && (*p) <= 90 )
  790. goto st39;
  791. } else
  792. goto st39;
  793. goto st0;
  794. st39:
  795. if ( ++p == pe )
  796. goto _test_eof39;
  797. case 39:
  798. switch( (*p) ) {
  799. case 32: goto tr2;
  800. case 36: goto st40;
  801. case 95: goto st40;
  802. }
  803. if ( (*p) < 48 ) {
  804. if ( 45 <= (*p) && (*p) <= 46 )
  805. goto st40;
  806. } else if ( (*p) > 57 ) {
  807. if ( 65 <= (*p) && (*p) <= 90 )
  808. goto st40;
  809. } else
  810. goto st40;
  811. goto st0;
  812. st40:
  813. if ( ++p == pe )
  814. goto _test_eof40;
  815. case 40:
  816. switch( (*p) ) {
  817. case 32: goto tr2;
  818. case 36: goto st41;
  819. case 95: goto st41;
  820. }
  821. if ( (*p) < 48 ) {
  822. if ( 45 <= (*p) && (*p) <= 46 )
  823. goto st41;
  824. } else if ( (*p) > 57 ) {
  825. if ( 65 <= (*p) && (*p) <= 90 )
  826. goto st41;
  827. } else
  828. goto st41;
  829. goto st0;
  830. st41:
  831. if ( ++p == pe )
  832. goto _test_eof41;
  833. case 41:
  834. switch( (*p) ) {
  835. case 32: goto tr2;
  836. case 36: goto st42;
  837. case 95: goto st42;
  838. }
  839. if ( (*p) < 48 ) {
  840. if ( 45 <= (*p) && (*p) <= 46 )
  841. goto st42;
  842. } else if ( (*p) > 57 ) {
  843. if ( 65 <= (*p) && (*p) <= 90 )
  844. goto st42;
  845. } else
  846. goto st42;
  847. goto st0;
  848. st42:
  849. if ( ++p == pe )
  850. goto _test_eof42;
  851. case 42:
  852. switch( (*p) ) {
  853. case 32: goto tr2;
  854. case 36: goto st43;
  855. case 95: goto st43;
  856. }
  857. if ( (*p) < 48 ) {
  858. if ( 45 <= (*p) && (*p) <= 46 )
  859. goto st43;
  860. } else if ( (*p) > 57 ) {
  861. if ( 65 <= (*p) && (*p) <= 90 )
  862. goto st43;
  863. } else
  864. goto st43;
  865. goto st0;
  866. st43:
  867. if ( ++p == pe )
  868. goto _test_eof43;
  869. case 43:
  870. switch( (*p) ) {
  871. case 32: goto tr2;
  872. case 36: goto st44;
  873. case 95: goto st44;
  874. }
  875. if ( (*p) < 48 ) {
  876. if ( 45 <= (*p) && (*p) <= 46 )
  877. goto st44;
  878. } else if ( (*p) > 57 ) {
  879. if ( 65 <= (*p) && (*p) <= 90 )
  880. goto st44;
  881. } else
  882. goto st44;
  883. goto st0;
  884. st44:
  885. if ( ++p == pe )
  886. goto _test_eof44;
  887. case 44:
  888. switch( (*p) ) {
  889. case 32: goto tr2;
  890. case 36: goto st45;
  891. case 95: goto st45;
  892. }
  893. if ( (*p) < 48 ) {
  894. if ( 45 <= (*p) && (*p) <= 46 )
  895. goto st45;
  896. } else if ( (*p) > 57 ) {
  897. if ( 65 <= (*p) && (*p) <= 90 )
  898. goto st45;
  899. } else
  900. goto st45;
  901. goto st0;
  902. st45:
  903. if ( ++p == pe )
  904. goto _test_eof45;
  905. case 45:
  906. switch( (*p) ) {
  907. case 32: goto tr2;
  908. case 36: goto st46;
  909. case 95: goto st46;
  910. }
  911. if ( (*p) < 48 ) {
  912. if ( 45 <= (*p) && (*p) <= 46 )
  913. goto st46;
  914. } else if ( (*p) > 57 ) {
  915. if ( 65 <= (*p) && (*p) <= 90 )
  916. goto st46;
  917. } else
  918. goto st46;
  919. goto st0;
  920. st46:
  921. if ( ++p == pe )
  922. goto _test_eof46;
  923. case 46:
  924. switch( (*p) ) {
  925. case 32: goto tr2;
  926. case 36: goto st47;
  927. case 95: goto st47;
  928. }
  929. if ( (*p) < 48 ) {
  930. if ( 45 <= (*p) && (*p) <= 46 )
  931. goto st47;
  932. } else if ( (*p) > 57 ) {
  933. if ( 65 <= (*p) && (*p) <= 90 )
  934. goto st47;
  935. } else
  936. goto st47;
  937. goto st0;
  938. st47:
  939. if ( ++p == pe )
  940. goto _test_eof47;
  941. case 47:
  942. switch( (*p) ) {
  943. case 32: goto tr2;
  944. case 36: goto st48;
  945. case 95: goto st48;
  946. }
  947. if ( (*p) < 48 ) {
  948. if ( 45 <= (*p) && (*p) <= 46 )
  949. goto st48;
  950. } else if ( (*p) > 57 ) {
  951. if ( 65 <= (*p) && (*p) <= 90 )
  952. goto st48;
  953. } else
  954. goto st48;
  955. goto st0;
  956. st48:
  957. if ( ++p == pe )
  958. goto _test_eof48;
  959. case 48:
  960. switch( (*p) ) {
  961. case 32: goto tr2;
  962. case 36: goto st49;
  963. case 95: goto st49;
  964. }
  965. if ( (*p) < 48 ) {
  966. if ( 45 <= (*p) && (*p) <= 46 )
  967. goto st49;
  968. } else if ( (*p) > 57 ) {
  969. if ( 65 <= (*p) && (*p) <= 90 )
  970. goto st49;
  971. } else
  972. goto st49;
  973. goto st0;
  974. st49:
  975. if ( ++p == pe )
  976. goto _test_eof49;
  977. case 49:
  978. switch( (*p) ) {
  979. case 32: goto tr2;
  980. case 36: goto st50;
  981. case 95: goto st50;
  982. }
  983. if ( (*p) < 48 ) {
  984. if ( 45 <= (*p) && (*p) <= 46 )
  985. goto st50;
  986. } else if ( (*p) > 57 ) {
  987. if ( 65 <= (*p) && (*p) <= 90 )
  988. goto st50;
  989. } else
  990. goto st50;
  991. goto st0;
  992. st50:
  993. if ( ++p == pe )
  994. goto _test_eof50;
  995. case 50:
  996. switch( (*p) ) {
  997. case 32: goto tr2;
  998. case 36: goto st51;
  999. case 95: goto st51;
  1000. }
  1001. if ( (*p) < 48 ) {
  1002. if ( 45 <= (*p) && (*p) <= 46 )
  1003. goto st51;
  1004. } else if ( (*p) > 57 ) {
  1005. if ( 65 <= (*p) && (*p) <= 90 )
  1006. goto st51;
  1007. } else
  1008. goto st51;
  1009. goto st0;
  1010. st51:
  1011. if ( ++p == pe )
  1012. goto _test_eof51;
  1013. case 51:
  1014. switch( (*p) ) {
  1015. case 32: goto tr2;
  1016. case 36: goto st52;
  1017. case 95: goto st52;
  1018. }
  1019. if ( (*p) < 48 ) {
  1020. if ( 45 <= (*p) && (*p) <= 46 )
  1021. goto st52;
  1022. } else if ( (*p) > 57 ) {
  1023. if ( 65 <= (*p) && (*p) <= 90 )
  1024. goto st52;
  1025. } else
  1026. goto st52;
  1027. goto st0;
  1028. st52:
  1029. if ( ++p == pe )
  1030. goto _test_eof52;
  1031. case 52:
  1032. switch( (*p) ) {
  1033. case 32: goto tr2;
  1034. case 36: goto st53;
  1035. case 95: goto st53;
  1036. }
  1037. if ( (*p) < 48 ) {
  1038. if ( 45 <= (*p) && (*p) <= 46 )
  1039. goto st53;
  1040. } else if ( (*p) > 57 ) {
  1041. if ( 65 <= (*p) && (*p) <= 90 )
  1042. goto st53;
  1043. } else
  1044. goto st53;
  1045. goto st0;
  1046. st53:
  1047. if ( ++p == pe )
  1048. goto _test_eof53;
  1049. case 53:
  1050. switch( (*p) ) {
  1051. case 32: goto tr2;
  1052. case 36: goto st54;
  1053. case 95: goto st54;
  1054. }
  1055. if ( (*p) < 48 ) {
  1056. if ( 45 <= (*p) && (*p) <= 46 )
  1057. goto st54;
  1058. } else if ( (*p) > 57 ) {
  1059. if ( 65 <= (*p) && (*p) <= 90 )
  1060. goto st54;
  1061. } else
  1062. goto st54;
  1063. goto st0;
  1064. st54:
  1065. if ( ++p == pe )
  1066. goto _test_eof54;
  1067. case 54:
  1068. switch( (*p) ) {
  1069. case 32: goto tr2;
  1070. case 36: goto st55;
  1071. case 95: goto st55;
  1072. }
  1073. if ( (*p) < 48 ) {
  1074. if ( 45 <= (*p) && (*p) <= 46 )
  1075. goto st55;
  1076. } else if ( (*p) > 57 ) {
  1077. if ( 65 <= (*p) && (*p) <= 90 )
  1078. goto st55;
  1079. } else
  1080. goto st55;
  1081. goto st0;
  1082. st55:
  1083. if ( ++p == pe )
  1084. goto _test_eof55;
  1085. case 55:
  1086. switch( (*p) ) {
  1087. case 32: goto tr2;
  1088. case 36: goto st56;
  1089. case 95: goto st56;
  1090. }
  1091. if ( (*p) < 48 ) {
  1092. if ( 45 <= (*p) && (*p) <= 46 )
  1093. goto st56;
  1094. } else if ( (*p) > 57 ) {
  1095. if ( 65 <= (*p) && (*p) <= 90 )
  1096. goto st56;
  1097. } else
  1098. goto st56;
  1099. goto st0;
  1100. st56:
  1101. if ( ++p == pe )
  1102. goto _test_eof56;
  1103. case 56:
  1104. if ( (*p) == 32 )
  1105. goto tr2;
  1106. goto st0;
  1107. }
  1108. _test_eof2: cs = 2; goto _test_eof;
  1109. _test_eof3: cs = 3; goto _test_eof;
  1110. _test_eof4: cs = 4; goto _test_eof;
  1111. _test_eof5: cs = 5; goto _test_eof;
  1112. _test_eof6: cs = 6; goto _test_eof;
  1113. _test_eof7: cs = 7; goto _test_eof;
  1114. _test_eof8: cs = 8; goto _test_eof;
  1115. _test_eof9: cs = 9; goto _test_eof;
  1116. _test_eof10: cs = 10; goto _test_eof;
  1117. _test_eof11: cs = 11; goto _test_eof;
  1118. _test_eof12: cs = 12; goto _test_eof;
  1119. _test_eof13: cs = 13; goto _test_eof;
  1120. _test_eof14: cs = 14; goto _test_eof;
  1121. _test_eof15: cs = 15; goto _test_eof;
  1122. _test_eof16: cs = 16; goto _test_eof;
  1123. _test_eof57: cs = 57; goto _test_eof;
  1124. _test_eof17: cs = 17; goto _test_eof;
  1125. _test_eof18: cs = 18; goto _test_eof;
  1126. _test_eof19: cs = 19; goto _test_eof;
  1127. _test_eof20: cs = 20; goto _test_eof;
  1128. _test_eof21: cs = 21; goto _test_eof;
  1129. _test_eof22: cs = 22; goto _test_eof;
  1130. _test_eof23: cs = 23; goto _test_eof;
  1131. _test_eof24: cs = 24; goto _test_eof;
  1132. _test_eof25: cs = 25; goto _test_eof;
  1133. _test_eof26: cs = 26; goto _test_eof;
  1134. _test_eof27: cs = 27; goto _test_eof;
  1135. _test_eof28: cs = 28; goto _test_eof;
  1136. _test_eof29: cs = 29; goto _test_eof;
  1137. _test_eof30: cs = 30; goto _test_eof;
  1138. _test_eof31: cs = 31; goto _test_eof;
  1139. _test_eof32: cs = 32; goto _test_eof;
  1140. _test_eof33: cs = 33; goto _test_eof;
  1141. _test_eof34: cs = 34; goto _test_eof;
  1142. _test_eof35: cs = 35; goto _test_eof;
  1143. _test_eof36: cs = 36; goto _test_eof;
  1144. _test_eof37: cs = 37; goto _test_eof;
  1145. _test_eof38: cs = 38; goto _test_eof;
  1146. _test_eof39: cs = 39; goto _test_eof;
  1147. _test_eof40: cs = 40; goto _test_eof;
  1148. _test_eof41: cs = 41; goto _test_eof;
  1149. _test_eof42: cs = 42; goto _test_eof;
  1150. _test_eof43: cs = 43; goto _test_eof;
  1151. _test_eof44: cs = 44; goto _test_eof;
  1152. _test_eof45: cs = 45; goto _test_eof;
  1153. _test_eof46: cs = 46; goto _test_eof;
  1154. _test_eof47: cs = 47; goto _test_eof;
  1155. _test_eof48: cs = 48; goto _test_eof;
  1156. _test_eof49: cs = 49; goto _test_eof;
  1157. _test_eof50: cs = 50; goto _test_eof;
  1158. _test_eof51: cs = 51; goto _test_eof;
  1159. _test_eof52: cs = 52; goto _test_eof;
  1160. _test_eof53: cs = 53; goto _test_eof;
  1161. _test_eof54: cs = 54; goto _test_eof;
  1162. _test_eof55: cs = 55; goto _test_eof;
  1163. _test_eof56: cs = 56; goto _test_eof;
  1164. _test_eof: {}
  1165. _out: {}
  1166. }
  1167. #line 114 "ext/http11/http11_parser.rl"
  1168. if (!http_parser_has_error(parser))
  1169. parser->cs = cs;
  1170. parser->nread += p - (buffer + off);
  1171. assert(p <= pe && "buffer overflow after parsing execute");
  1172. assert(parser->nread <= len && "nread longer than length");
  1173. assert(parser->body_start <= len && "body starts after buffer end");
  1174. assert(parser->mark < len && "mark is after buffer end");
  1175. assert(parser->field_len <= len && "field has length longer than whole buffer");
  1176. assert(parser->field_start < len && "field starts after buffer end");
  1177. return(parser->nread);
  1178. }
  1179. int http_parser_finish(http_parser *parser)
  1180. {
  1181. if (http_parser_has_error(parser) ) {
  1182. return -1;
  1183. } else if (http_parser_is_finished(parser) ) {
  1184. return 1;
  1185. } else {
  1186. return 0;
  1187. }
  1188. }
  1189. int http_parser_has_error(http_parser *parser) {
  1190. return parser->cs == http_parser_error;
  1191. }
  1192. int http_parser_is_finished(http_parser *parser) {
  1193. return parser->cs >= http_parser_first_final;
  1194. }