ext/thin_parser/parser.c in thin-1.0.0 vs ext/thin_parser/parser.c in thin-1.2.1

- old
+ new

@@ -20,22 +20,190 @@ /** Data **/ #line 25 "parser.c" +static const char _http_parser_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5, 1, 6, 1, + 7, 1, 8, 1, 10, 1, 11, 1, + 12, 2, 0, 7, 2, 3, 4, 2, + 9, 6, 2, 11, 6, 3, 8, 9, + 6 +}; + +static const short _http_parser_key_offsets[] = { + 0, 0, 8, 17, 27, 29, 30, 31, + 32, 33, 34, 36, 39, 41, 44, 45, + 61, 62, 78, 80, 81, 87, 93, 99, + 105, 115, 121, 127, 133, 141, 147, 153, + 160, 166, 172, 178, 184, 190, 196, 205, + 214, 223, 232, 241, 250, 259, 268, 277, + 286, 295, 304, 313, 322, 331, 340, 349, + 358, 359 +}; + +static const char _http_parser_trans_keys[] = { + 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, + 90, 42, 43, 47, 58, 45, 57, 65, + 90, 97, 122, 32, 35, 72, 84, 84, + 80, 47, 48, 57, 46, 48, 57, 48, + 57, 13, 48, 57, 10, 13, 33, 124, + 126, 35, 39, 42, 43, 45, 46, 48, + 57, 65, 90, 94, 122, 10, 33, 58, + 124, 126, 35, 39, 42, 43, 45, 46, + 48, 57, 65, 90, 94, 122, 13, 32, + 13, 32, 35, 37, 127, 0, 31, 32, + 35, 37, 127, 0, 31, 48, 57, 65, + 70, 97, 102, 48, 57, 65, 70, 97, + 102, 43, 58, 45, 46, 48, 57, 65, + 90, 97, 122, 32, 35, 37, 127, 0, + 31, 48, 57, 65, 70, 97, 102, 48, + 57, 65, 70, 97, 102, 32, 35, 37, + 59, 63, 127, 0, 31, 48, 57, 65, + 70, 97, 102, 48, 57, 65, 70, 97, + 102, 32, 35, 37, 63, 127, 0, 31, + 48, 57, 65, 70, 97, 102, 48, 57, + 65, 70, 97, 102, 32, 35, 37, 127, + 0, 31, 32, 35, 37, 127, 0, 31, + 48, 57, 65, 70, 97, 102, 48, 57, + 65, 70, 97, 102, 32, 36, 95, 45, + 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 36, + 95, 45, 46, 48, 57, 65, 90, 32, + 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, + 90, 32, 36, 95, 45, 46, 48, 57, + 65, 90, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, + 48, 57, 65, 90, 32, 36, 95, 45, + 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 36, + 95, 45, 46, 48, 57, 65, 90, 32, + 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, + 90, 32, 36, 95, 45, 46, 48, 57, + 65, 90, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, + 48, 57, 65, 90, 32, 36, 95, 45, + 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 0 +}; + +static const char _http_parser_single_lengths[] = { + 0, 2, 3, 4, 2, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 1, 4, + 1, 4, 2, 1, 4, 4, 0, 0, + 2, 4, 0, 0, 6, 0, 0, 5, + 0, 0, 4, 4, 0, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 1, 0 +}; + +static const char _http_parser_range_lengths[] = { + 0, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 6, + 0, 6, 0, 0, 1, 1, 3, 3, + 4, 1, 3, 3, 1, 3, 3, 1, + 3, 3, 1, 1, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0 +}; + +static const short _http_parser_index_offsets[] = { + 0, 0, 6, 13, 21, 24, 26, 28, + 30, 32, 34, 36, 39, 41, 44, 46, + 57, 59, 70, 73, 75, 81, 87, 91, + 95, 102, 108, 112, 116, 124, 128, 132, + 139, 143, 147, 153, 159, 163, 167, 174, + 181, 188, 195, 202, 209, 216, 223, 230, + 237, 244, 251, 258, 265, 272, 279, 286, + 293, 295 +}; + +static const char _http_parser_indicies[] = { + 0, 0, 0, 0, 0, 1, 2, 3, + 3, 3, 3, 3, 1, 4, 5, 6, + 7, 5, 5, 5, 1, 8, 9, 1, + 10, 1, 11, 1, 12, 1, 13, 1, + 14, 1, 15, 1, 16, 15, 1, 17, + 1, 18, 17, 1, 19, 1, 20, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 1, 22, 1, 23, 24, 23, 23, 23, + 23, 23, 23, 23, 23, 1, 26, 27, + 25, 29, 28, 31, 1, 32, 1, 1, + 30, 34, 1, 35, 1, 1, 33, 36, + 36, 36, 1, 33, 33, 33, 1, 37, + 38, 37, 37, 37, 37, 1, 8, 9, + 39, 1, 1, 38, 40, 40, 40, 1, + 38, 38, 38, 1, 42, 43, 44, 45, + 46, 1, 1, 41, 47, 47, 47, 1, + 41, 41, 41, 1, 8, 9, 49, 50, + 1, 1, 48, 51, 51, 51, 1, 48, + 48, 48, 1, 53, 54, 55, 1, 1, + 52, 57, 58, 59, 1, 1, 56, 60, + 60, 60, 1, 56, 56, 56, 1, 2, + 61, 61, 61, 61, 61, 1, 2, 62, + 62, 62, 62, 62, 1, 2, 63, 63, + 63, 63, 63, 1, 2, 64, 64, 64, + 64, 64, 1, 2, 65, 65, 65, 65, + 65, 1, 2, 66, 66, 66, 66, 66, + 1, 2, 67, 67, 67, 67, 67, 1, + 2, 68, 68, 68, 68, 68, 1, 2, + 69, 69, 69, 69, 69, 1, 2, 70, + 70, 70, 70, 70, 1, 2, 71, 71, + 71, 71, 71, 1, 2, 72, 72, 72, + 72, 72, 1, 2, 73, 73, 73, 73, + 73, 1, 2, 74, 74, 74, 74, 74, + 1, 2, 75, 75, 75, 75, 75, 1, + 2, 76, 76, 76, 76, 76, 1, 2, + 77, 77, 77, 77, 77, 1, 2, 78, + 78, 78, 78, 78, 1, 2, 1, 1, + 0 +}; + +static const char _http_parser_trans_targs[] = { + 2, 0, 3, 38, 4, 24, 28, 25, + 5, 20, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 57, 17, + 18, 19, 14, 18, 19, 14, 21, 5, + 22, 21, 5, 22, 23, 24, 25, 26, + 27, 28, 5, 20, 29, 31, 34, 30, + 31, 32, 34, 33, 35, 5, 20, 36, + 35, 5, 20, 36, 37, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56 +}; + +static const char _http_parser_trans_actions[] = { + 1, 0, 11, 0, 1, 1, 1, 1, + 13, 13, 1, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 3, 23, 0, + 5, 7, 28, 7, 0, 9, 1, 25, + 1, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 34, 34, 0, 21, 21, 0, + 0, 0, 0, 0, 17, 37, 37, 17, + 0, 31, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + static const int http_parser_start = 1; static const int http_parser_first_final = 57; static const int http_parser_error = 0; static const int http_parser_en_main = 1; #line 85 "parser.rl" -int http_parser_init(http_parser *parser) { +int thin_http_parser_init(http_parser *parser) { int cs = 0; -#line 37 "parser.c" +#line 205 "parser.c" { cs = http_parser_start; } #line 89 "parser.rl" parser->cs = cs; @@ -49,11 +217,11 @@ return(1); } /** exec **/ -size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) { +size_t thin_http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) { const char *p, *pe; int cs = parser->cs; assert(off <= len && "offset past end of buffer"); @@ -63,1110 +231,182 @@ assert(*pe == '\0' && "pointer does not end on NUL"); assert(pe - p == len - off && "pointers aren't same distance"); -#line 69 "parser.c" +#line 237 "parser.c" { + int _klen; + unsigned int _trans; + const char *_acts; + unsigned int _nacts; + const char *_keys; + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) goto _out; - switch ( cs ) - { -case 1: - switch( (*p) ) { - case 36: goto tr0; - case 95: goto tr0; +_resume: + _keys = _http_parser_trans_keys + _http_parser_key_offsets[cs]; + _trans = _http_parser_index_offsets[cs]; + + _klen = _http_parser_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (*p) < *_mid ) + _upper = _mid - 1; + else if ( (*p) > *_mid ) + _lower = _mid + 1; + else { + _trans += (_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto tr0; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto tr0; - } else - goto tr0; - goto st0; -st0: - goto _out0; -tr0: + + _klen = _http_parser_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (*p) < _mid[0] ) + _upper = _mid - 2; + else if ( (*p) > _mid[1] ) + _lower = _mid + 2; + else { + _trans += ((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + _trans = _http_parser_indicies[_trans]; + cs = _http_parser_trans_targs[_trans]; + + if ( _http_parser_trans_actions[_trans] == 0 ) + goto _again; + + _acts = _http_parser_actions + _http_parser_trans_actions[_trans]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) + { + switch ( *_acts++ ) + { + case 0: #line 22 "parser.rl" {MARK(mark, p); } - goto st2; -st2: - if ( ++p == pe ) - goto _out2; -case 2: -#line 99 "parser.c" - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st38; - case 95: goto st38; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st38; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st38; - } else - goto st38; - goto st0; -tr2: + break; + case 1: +#line 25 "parser.rl" + { MARK(field_start, p); } + break; + case 2: +#line 26 "parser.rl" + { + parser->field_len = LEN(field_start, p); + } + break; + case 3: +#line 30 "parser.rl" + { MARK(mark, p); } + break; + case 4: +#line 31 "parser.rl" + { + if (parser->http_field != NULL) { + parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); + } + } + break; + case 5: #line 36 "parser.rl" { if (parser->request_method != NULL) { parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p)); } } - goto st3; -st3: - if ( ++p == pe ) - goto _out3; -case 3: -#line 126 "parser.c" - switch( (*p) ) { - case 42: goto tr4; - case 43: goto tr5; - case 47: goto tr6; - case 58: goto tr7; - } - if ( (*p) < 65 ) { - if ( 45 <= (*p) && (*p) <= 57 ) - goto tr5; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr5; - } else - goto tr5; - goto st0; -tr4: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st4; -st4: - if ( ++p == pe ) - goto _out4; -case 4: -#line 150 "parser.c" - switch( (*p) ) { - case 32: goto tr8; - case 35: goto tr9; - } - goto st0; -tr8: + break; + case 6: #line 41 "parser.rl" { if (parser->request_uri != NULL) { parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); } } - goto st5; -tr30: + break; + case 7: #line 46 "parser.rl" { if (parser->fragment != NULL) { parser->fragment(parser->data, PTR_TO(mark), LEN(mark, p)); } } - goto st5; -tr40: -#line 65 "parser.rl" - { - if (parser->request_path != NULL) { - parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); - } - } -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st5; -tr51: + break; + case 8: #line 52 "parser.rl" {MARK(query_start, p); } + break; + case 9: #line 53 "parser.rl" { if (parser->query_string != NULL) { parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p)); } } -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st5; -tr55: -#line 53 "parser.rl" - { - if (parser->query_string != NULL) { - parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p)); - } - } -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st5; -st5: - if ( ++p == pe ) - goto _out5; -case 5: -#line 220 "parser.c" - if ( (*p) == 72 ) - goto tr10; - goto st0; -tr10: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st6; -st6: - if ( ++p == pe ) - goto _out6; -case 6: -#line 232 "parser.c" - if ( (*p) == 84 ) - goto st7; - goto st0; -st7: - if ( ++p == pe ) - goto _out7; -case 7: - if ( (*p) == 84 ) - goto st8; - goto st0; -st8: - if ( ++p == pe ) - goto _out8; -case 8: - if ( (*p) == 80 ) - goto st9; - goto st0; -st9: - if ( ++p == pe ) - goto _out9; -case 9: - if ( (*p) == 47 ) - goto st10; - goto st0; -st10: - if ( ++p == pe ) - goto _out10; -case 10: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st11; - goto st0; -st11: - if ( ++p == pe ) - goto _out11; -case 11: - if ( (*p) == 46 ) - goto st12; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st11; - goto st0; -st12: - if ( ++p == pe ) - goto _out12; -case 12: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st13; - goto st0; -st13: - if ( ++p == pe ) - goto _out13; -case 13: - if ( (*p) == 13 ) - goto tr18; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st13; - goto st0; -tr18: + break; + case 10: #line 59 "parser.rl" { if (parser->http_version != NULL) { parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p)); } } - goto st14; -tr26: -#line 31 "parser.rl" - { - if (parser->http_field != NULL) { - parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); + break; + case 11: +#line 65 "parser.rl" + { + if (parser->request_path != NULL) { + parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); } } - goto st14; -st14: - if ( ++p == pe ) - goto _out14; -case 14: -#line 309 "parser.c" - if ( (*p) == 10 ) - goto st15; - goto st0; -st15: - if ( ++p == pe ) - goto _out15; -case 15: - switch( (*p) ) { - case 13: goto st16; - case 33: goto tr21; - case 124: goto tr21; - case 126: goto tr21; - } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr21; - } else if ( (*p) >= 35 ) - goto tr21; - } else if ( (*p) > 46 ) { - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr21; - } else if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 122 ) - goto tr21; - } else - goto tr21; - } else - goto tr21; - goto st0; -st16: - if ( ++p == pe ) - goto _out16; -case 16: - if ( (*p) == 10 ) - goto tr22; - goto st0; -tr22: + break; + case 12: #line 71 "parser.rl" { parser->body_start = p - buffer + 1; if (parser->header_done != NULL) { parser->header_done(parser->data, p + 1, pe - p - 1); } - goto _out57; + {p++; goto _out; } } - goto st57; -st57: - if ( ++p == pe ) - goto _out57; -case 57: -#line 362 "parser.c" - goto st0; -tr21: -#line 25 "parser.rl" - { MARK(field_start, p); } - goto st17; -st17: - if ( ++p == pe ) - goto _out17; -case 17: -#line 372 "parser.c" - switch( (*p) ) { - case 33: goto st17; - case 58: goto tr24; - case 124: goto st17; - case 126: goto st17; + break; +#line 399 "parser.c" + } } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto st17; - } else if ( (*p) >= 35 ) - goto st17; - } else if ( (*p) > 46 ) { - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st17; - } else if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 122 ) - goto st17; - } else - goto st17; - } else - goto st17; - goto st0; -tr24: -#line 26 "parser.rl" - { - parser->field_len = LEN(field_start, p); - } - goto st18; -tr27: -#line 30 "parser.rl" - { MARK(mark, p); } - goto st18; -st18: - if ( ++p == pe ) - goto _out18; -case 18: -#line 411 "parser.c" - switch( (*p) ) { - case 13: goto tr26; - case 32: goto tr27; - } - goto tr25; -tr25: -#line 30 "parser.rl" - { MARK(mark, p); } - goto st19; -st19: - if ( ++p == pe ) - goto _out19; -case 19: -#line 425 "parser.c" - if ( (*p) == 13 ) - goto tr26; - goto st19; -tr9: -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st20; -tr41: -#line 65 "parser.rl" - { - if (parser->request_path != NULL) { - parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); - } - } -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st20; -tr52: -#line 52 "parser.rl" - {MARK(query_start, p); } -#line 53 "parser.rl" - { - if (parser->query_string != NULL) { - parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p)); - } - } -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st20; -tr56: -#line 53 "parser.rl" - { - if (parser->query_string != NULL) { - parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p)); - } - } -#line 41 "parser.rl" - { - if (parser->request_uri != NULL) { - parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); - } - } - goto st20; -st20: - if ( ++p == pe ) - goto _out20; -case 20: -#line 485 "parser.c" - switch( (*p) ) { - case 32: goto tr30; - case 35: goto st0; - case 37: goto tr31; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto tr29; -tr29: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st21; -st21: - if ( ++p == pe ) - goto _out21; -case 21: -#line 503 "parser.c" - switch( (*p) ) { - case 32: goto tr30; - case 35: goto st0; - case 37: goto st22; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st21; -tr31: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st22; -st22: - if ( ++p == pe ) - goto _out22; -case 22: -#line 521 "parser.c" - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st23; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st23; - } else - goto st23; - goto st0; -st23: - if ( ++p == pe ) - goto _out23; -case 23: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st21; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st21; - } else - goto st21; - goto st0; -tr5: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st24; -st24: - if ( ++p == pe ) - goto _out24; -case 24: -#line 552 "parser.c" - switch( (*p) ) { - case 43: goto st24; - case 58: goto st25; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st24; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st24; - } else if ( (*p) >= 65 ) - goto st24; - } else - goto st24; - goto st0; -tr7: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st25; -st25: - if ( ++p == pe ) - goto _out25; -case 25: -#line 577 "parser.c" - switch( (*p) ) { - case 32: goto tr8; - case 35: goto tr9; - case 37: goto st26; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st25; -st26: - if ( ++p == pe ) - goto _out26; -case 26: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st27; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st27; - } else - goto st27; - goto st0; -st27: - if ( ++p == pe ) - goto _out27; -case 27: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st25; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st25; - } else - goto st25; - goto st0; -tr6: -#line 22 "parser.rl" - {MARK(mark, p); } - goto st28; -st28: - if ( ++p == pe ) - goto _out28; -case 28: -#line 621 "parser.c" - switch( (*p) ) { - case 32: goto tr40; - case 35: goto tr41; - case 37: goto st29; - case 59: goto tr43; - case 63: goto tr44; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st28; -st29: - if ( ++p == pe ) - goto _out29; -case 29: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st30; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st30; - } else - goto st30; - goto st0; -st30: - if ( ++p == pe ) - goto _out30; -case 30: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st28; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st28; - } else - goto st28; - goto st0; -tr43: -#line 65 "parser.rl" - { - if (parser->request_path != NULL) { - parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); - } - } - goto st31; -st31: - if ( ++p == pe ) - goto _out31; -case 31: -#line 671 "parser.c" - switch( (*p) ) { - case 32: goto tr8; - case 35: goto tr9; - case 37: goto st32; - case 63: goto st34; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st31; -st32: - if ( ++p == pe ) - goto _out32; -case 32: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st33; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st33; - } else - goto st33; - goto st0; -st33: - if ( ++p == pe ) - goto _out33; -case 33: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st31; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st31; - } else - goto st31; - goto st0; -tr44: -#line 65 "parser.rl" - { - if (parser->request_path != NULL) { - parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); - } - } - goto st34; -st34: - if ( ++p == pe ) - goto _out34; -case 34: -#line 720 "parser.c" - switch( (*p) ) { - case 32: goto tr51; - case 35: goto tr52; - case 37: goto tr53; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto tr50; -tr50: -#line 52 "parser.rl" - {MARK(query_start, p); } - goto st35; -st35: - if ( ++p == pe ) - goto _out35; -case 35: -#line 738 "parser.c" - switch( (*p) ) { - case 32: goto tr55; - case 35: goto tr56; - case 37: goto st36; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st35; -tr53: -#line 52 "parser.rl" - {MARK(query_start, p); } - goto st36; -st36: - if ( ++p == pe ) - goto _out36; -case 36: -#line 756 "parser.c" - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st37; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st37; - } else - goto st37; - goto st0; -st37: - if ( ++p == pe ) - goto _out37; -case 37: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st35; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto st35; - } else - goto st35; - goto st0; -st38: - if ( ++p == pe ) - goto _out38; -case 38: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st39; - case 95: goto st39; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st39; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st39; - } else - goto st39; - goto st0; -st39: - if ( ++p == pe ) - goto _out39; -case 39: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st40; - case 95: goto st40; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st40; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st40; - } else - goto st40; - goto st0; -st40: - if ( ++p == pe ) - goto _out40; -case 40: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st41; - case 95: goto st41; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st41; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st41; - } else - goto st41; - goto st0; -st41: - if ( ++p == pe ) - goto _out41; -case 41: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st42; - case 95: goto st42; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st42; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st42; - } else - goto st42; - goto st0; -st42: - if ( ++p == pe ) - goto _out42; -case 42: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st43; - case 95: goto st43; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st43; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st43; - } else - goto st43; - goto st0; -st43: - if ( ++p == pe ) - goto _out43; -case 43: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st44; - case 95: goto st44; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st44; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st44; - } else - goto st44; - goto st0; -st44: - if ( ++p == pe ) - goto _out44; -case 44: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st45; - case 95: goto st45; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st45; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st45; - } else - goto st45; - goto st0; -st45: - if ( ++p == pe ) - goto _out45; -case 45: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st46; - case 95: goto st46; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st46; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st46; - } else - goto st46; - goto st0; -st46: - if ( ++p == pe ) - goto _out46; -case 46: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st47; - case 95: goto st47; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st47; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st47; - } else - goto st47; - goto st0; -st47: - if ( ++p == pe ) - goto _out47; -case 47: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st48; - case 95: goto st48; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st48; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st48; - } else - goto st48; - goto st0; -st48: - if ( ++p == pe ) - goto _out48; -case 48: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st49; - case 95: goto st49; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st49; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st49; - } else - goto st49; - goto st0; -st49: - if ( ++p == pe ) - goto _out49; -case 49: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st50; - case 95: goto st50; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st50; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st50; - } else - goto st50; - goto st0; -st50: - if ( ++p == pe ) - goto _out50; -case 50: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st51; - case 95: goto st51; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st51; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st51; - } else - goto st51; - goto st0; -st51: - if ( ++p == pe ) - goto _out51; -case 51: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st52; - case 95: goto st52; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st52; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st52; - } else - goto st52; - goto st0; -st52: - if ( ++p == pe ) - goto _out52; -case 52: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st53; - case 95: goto st53; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st53; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st53; - } else - goto st53; - goto st0; -st53: - if ( ++p == pe ) - goto _out53; -case 53: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st54; - case 95: goto st54; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st54; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st54; - } else - goto st54; - goto st0; -st54: - if ( ++p == pe ) - goto _out54; -case 54: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st55; - case 95: goto st55; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st55; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st55; - } else - goto st55; - goto st0; -st55: - if ( ++p == pe ) - goto _out55; -case 55: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st56; - case 95: goto st56; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st56; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st56; - } else - goto st56; - goto st0; -st56: - if ( ++p == pe ) - goto _out56; -case 56: - if ( (*p) == 32 ) - goto tr2; - goto st0; - } - _out0: cs = 0; goto _out; - _out2: cs = 2; goto _out; - _out3: cs = 3; goto _out; - _out4: cs = 4; goto _out; - _out5: cs = 5; goto _out; - _out6: cs = 6; goto _out; - _out7: cs = 7; goto _out; - _out8: cs = 8; goto _out; - _out9: cs = 9; goto _out; - _out10: cs = 10; goto _out; - _out11: cs = 11; goto _out; - _out12: cs = 12; goto _out; - _out13: cs = 13; goto _out; - _out14: cs = 14; goto _out; - _out15: cs = 15; goto _out; - _out16: cs = 16; goto _out; - _out57: cs = 57; goto _out; - _out17: cs = 17; goto _out; - _out18: cs = 18; goto _out; - _out19: cs = 19; goto _out; - _out20: cs = 20; goto _out; - _out21: cs = 21; goto _out; - _out22: cs = 22; goto _out; - _out23: cs = 23; goto _out; - _out24: cs = 24; goto _out; - _out25: cs = 25; goto _out; - _out26: cs = 26; goto _out; - _out27: cs = 27; goto _out; - _out28: cs = 28; goto _out; - _out29: cs = 29; goto _out; - _out30: cs = 30; goto _out; - _out31: cs = 31; goto _out; - _out32: cs = 32; goto _out; - _out33: cs = 33; goto _out; - _out34: cs = 34; goto _out; - _out35: cs = 35; goto _out; - _out36: cs = 36; goto _out; - _out37: cs = 37; goto _out; - _out38: cs = 38; goto _out; - _out39: cs = 39; goto _out; - _out40: cs = 40; goto _out; - _out41: cs = 41; goto _out; - _out42: cs = 42; goto _out; - _out43: cs = 43; goto _out; - _out44: cs = 44; goto _out; - _out45: cs = 45; goto _out; - _out46: cs = 46; goto _out; - _out47: cs = 47; goto _out; - _out48: cs = 48; goto _out; - _out49: cs = 49; goto _out; - _out50: cs = 50; goto _out; - _out51: cs = 51; goto _out; - _out52: cs = 52; goto _out; - _out53: cs = 53; goto _out; - _out54: cs = 54; goto _out; - _out55: cs = 55; goto _out; - _out56: cs = 56; goto _out; +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} _out: {} } #line 116 "parser.rl" parser->cs = cs; @@ -1179,40 +419,34 @@ assert(parser->field_len <= len && "field has length longer than whole buffer"); assert(parser->field_start < len && "field starts after buffer end"); if(parser->body_start) { /* final \r\n combo encountered so stop right here */ - -#line 1186 "parser.c" -#line 130 "parser.rl" parser->nread++; } return(parser->nread); } -int http_parser_finish(http_parser *parser) +int thin_http_parser_finish(http_parser *parser) { int cs = parser->cs; - -#line 1199 "parser.c" -#line 141 "parser.rl" parser->cs = cs; - if (http_parser_has_error(parser) ) { + if (thin_http_parser_has_error(parser) ) { return -1; - } else if (http_parser_is_finished(parser) ) { + } else if (thin_http_parser_is_finished(parser) ) { return 1; } else { return 0; } } -int http_parser_has_error(http_parser *parser) { +int thin_http_parser_has_error(http_parser *parser) { return parser->cs == http_parser_error; } -int http_parser_is_finished(http_parser *parser) { +int thin_http_parser_is_finished(http_parser *parser) { return parser->cs == http_parser_first_final; }