diff options
Diffstat (limited to 'ext/http11/http11_parser.c')
-rw-r--r-- | ext/http11/http11_parser.c | 918 |
1 files changed, 918 insertions, 0 deletions
diff --git a/ext/http11/http11_parser.c b/ext/http11/http11_parser.c new file mode 100644 index 0000000..c256037 --- /dev/null +++ b/ext/http11/http11_parser.c @@ -0,0 +1,918 @@ +#line 1 "ext/http11/http11_parser.rl" +#include "http11_parser.h" +#include <stdio.h> +#include <assert.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#define MARK(S,F) assert((F) - (S)->mark >= 0); (S)->mark = (F); + +/** machine **/ +#line 100 "ext/http11/http11_parser.rl" + + +/** Data **/ + +#line 18 "ext/http11/http11_parser.c" +static int http_parser_start = 0; + +static int http_parser_first_final = 56; + +static int http_parser_error = 1; + +#line 104 "ext/http11/http11_parser.rl" + +int http_parser_init(http_parser *parser) { + int cs = 0; + +#line 30 "ext/http11/http11_parser.c" + { + cs = http_parser_start; + } +#line 108 "ext/http11/http11_parser.rl" + parser->cs = cs; + parser->body_start = NULL; + parser->content_len = 0; + parser->mark = NULL; + parser->nread = 0; + + return(1); +} + + +/** exec **/ +size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len) { + const char *p, *pe; + int cs = parser->cs; + + p = buffer; + pe = buffer+len; + + +#line 54 "ext/http11/http11_parser.c" + { + p -= 1; + if ( ++p == pe ) + goto _out; + switch ( cs ) + { +case 0: + switch( (*p) ) { + case 68: goto tr13; + case 71: goto tr14; + case 72: goto tr15; + case 79: goto tr16; + case 80: goto tr17; + case 84: goto tr18; + } + goto st1; +st1: + goto _out1; +tr13: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st2; +st2: + if ( ++p == pe ) + goto _out2; +case 2: +#line 81 "ext/http11/http11_parser.c" + if ( (*p) == 69 ) + goto st3; + goto st1; +st3: + if ( ++p == pe ) + goto _out3; +case 3: + if ( (*p) == 76 ) + goto st4; + goto st1; +st4: + if ( ++p == pe ) + goto _out4; +case 4: + if ( (*p) == 69 ) + goto st5; + goto st1; +st5: + if ( ++p == pe ) + goto _out5; +case 5: + if ( (*p) == 84 ) + goto st6; + goto st1; +st6: + if ( ++p == pe ) + goto _out6; +case 6: + if ( (*p) == 69 ) + goto st7; + goto st1; +st7: + if ( ++p == pe ) + goto _out7; +case 7: + if ( (*p) == 32 ) + goto tr33; + goto st1; +tr33: +#line 29 "ext/http11/http11_parser.rl" + { + if(parser->request_method != NULL) + parser->request_method(parser->data, parser->mark, p - parser->mark); + } + goto st8; +st8: + if ( ++p == pe ) + goto _out8; +case 8: +#line 131 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 42: goto tr27; + case 43: goto tr28; + case 47: goto tr29; + case 58: goto tr30; + } + if ( (*p) < 65 ) { + if ( 45 <= (*p) && (*p) <= 57 ) + goto tr28; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr28; + } else + goto tr28; + goto st1; +tr27: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st9; +st9: + if ( ++p == pe ) + goto _out9; +case 9: +#line 155 "ext/http11/http11_parser.c" + if ( (*p) == 32 ) + goto tr34; + goto st1; +tr34: +#line 33 "ext/http11/http11_parser.rl" + { + if(parser->path_info != NULL) + parser->path_info(parser->data, parser->mark, p - parser->mark); + } + goto st10; +tr48: +#line 37 "ext/http11/http11_parser.rl" + { + if(parser->query_string != NULL) + parser->query_string(parser->data, parser->mark, p - parser->mark); + } + goto st10; +st10: + if ( ++p == pe ) + goto _out10; +case 10: +#line 177 "ext/http11/http11_parser.c" + if ( (*p) == 72 ) + goto tr11; + goto st1; +tr11: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st11; +st11: + if ( ++p == pe ) + goto _out11; +case 11: +#line 189 "ext/http11/http11_parser.c" + if ( (*p) == 84 ) + goto st12; + goto st1; +st12: + if ( ++p == pe ) + goto _out12; +case 12: + if ( (*p) == 84 ) + goto st13; + goto st1; +st13: + if ( ++p == pe ) + goto _out13; +case 13: + if ( (*p) == 80 ) + goto st14; + goto st1; +st14: + if ( ++p == pe ) + goto _out14; +case 14: + if ( (*p) == 47 ) + goto st15; + goto st1; +st15: + if ( ++p == pe ) + goto _out15; +case 15: + if ( 48 <= (*p) && (*p) <= 57 ) + goto st16; + goto st1; +st16: + if ( ++p == pe ) + goto _out16; +case 16: + if ( (*p) == 46 ) + goto st17; + if ( 48 <= (*p) && (*p) <= 57 ) + goto st16; + goto st1; +st17: + if ( ++p == pe ) + goto _out17; +case 17: + if ( 48 <= (*p) && (*p) <= 57 ) + goto st18; + goto st1; +st18: + if ( ++p == pe ) + goto _out18; +case 18: + if ( (*p) == 13 ) + goto tr37; + if ( 48 <= (*p) && (*p) <= 57 ) + goto st18; + goto st1; +tr37: +#line 42 "ext/http11/http11_parser.rl" + { + if(parser->http_version != NULL) + parser->http_version(parser->data, parser->mark, p - parser->mark); + } + goto st19; +st19: + if ( ++p == pe ) + goto _out19; +case 19: +#line 257 "ext/http11/http11_parser.c" + if ( (*p) == 10 ) + goto st20; + goto st1; +st20: + if ( ++p == pe ) + goto _out20; +case 20: + switch( (*p) ) { + case 13: goto st21; + case 33: goto tr36; + case 124: goto tr36; + case 126: goto tr36; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr36; + } else if ( (*p) >= 35 ) + goto tr36; + } else if ( (*p) > 46 ) { + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr36; + } else if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 122 ) + goto tr36; + } else + goto tr36; + } else + goto tr36; + goto st1; +st21: + if ( ++p == pe ) + goto _out21; +case 21: + if ( (*p) == 10 ) + goto tr40; + goto st1; +tr40: +#line 46 "ext/http11/http11_parser.rl" + { + parser->body_start = p+1; goto _out56; + } + goto st56; +st56: + if ( ++p == pe ) + goto _out56; +case 56: +#line 306 "ext/http11/http11_parser.c" + goto st1; +tr36: +#line 16 "ext/http11/http11_parser.rl" + { parser->field_start = p; } + goto st22; +st22: + if ( ++p == pe ) + goto _out22; +case 22: +#line 316 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 33: goto st22; + case 58: goto tr32; + case 124: goto st22; + case 126: goto st22; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto st22; + } else if ( (*p) >= 35 ) + goto st22; + } else if ( (*p) > 46 ) { + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto st22; + } else if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 122 ) + goto st22; + } else + goto st22; + } else + goto st22; + goto st1; +tr32: +#line 17 "ext/http11/http11_parser.rl" + { + parser->field_len = (p - parser->field_start); + } + goto st23; +st23: + if ( ++p == pe ) + goto _out23; +case 23: +#line 351 "ext/http11/http11_parser.c" + if ( (*p) == 13 ) + goto tr56; + goto tr55; +tr55: +#line 21 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st24; +st24: + if ( ++p == pe ) + goto _out24; +case 24: +#line 363 "ext/http11/http11_parser.c" + if ( (*p) == 13 ) + goto tr51; + goto st24; +tr51: +#line 22 "ext/http11/http11_parser.rl" + { + if(parser->http_field != NULL) { + parser->http_field(parser->data, + parser->field_start, parser->field_len, + parser->mark+1, p - (parser->mark +1)); + } + } + goto st25; +tr56: +#line 21 "ext/http11/http11_parser.rl" + { MARK(parser, p); } +#line 22 "ext/http11/http11_parser.rl" + { + if(parser->http_field != NULL) { + parser->http_field(parser->data, + parser->field_start, parser->field_len, + parser->mark+1, p - (parser->mark +1)); + } + } + goto st25; +st25: + if ( ++p == pe ) + goto _out25; +case 25: +#line 393 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 10: goto st26; + case 13: goto tr51; + } + goto st24; +st26: + if ( ++p == pe ) + goto _out26; +case 26: + switch( (*p) ) { + case 13: goto st21; + case 33: goto tr42; + case 124: goto tr42; + case 126: goto tr42; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr42; + } else if ( (*p) >= 35 ) + goto tr42; + } else if ( (*p) > 46 ) { + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr42; + } else if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 122 ) + goto tr42; + } else + goto tr42; + } else + goto tr42; + goto st24; +tr42: +#line 16 "ext/http11/http11_parser.rl" + { parser->field_start = p; } + goto st27; +st27: + if ( ++p == pe ) + goto _out27; +case 27: +#line 435 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 13: goto tr51; + case 33: goto st27; + case 58: goto tr32; + case 124: goto st27; + case 126: goto st27; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto st27; + } else if ( (*p) >= 35 ) + goto st27; + } else if ( (*p) > 46 ) { + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto st27; + } else if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 122 ) + goto st27; + } else + goto st27; + } else + goto st27; + goto st24; +tr28: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st28; +st28: + if ( ++p == pe ) + goto _out28; +case 28: +#line 469 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 43: goto st28; + case 58: goto st29; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st28; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto st28; + } else if ( (*p) >= 65 ) + goto st28; + } else + goto st28; + goto st1; +tr30: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st29; +st29: + if ( ++p == pe ) + goto _out29; +case 29: +#line 494 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr34; + case 37: goto st30; + case 60: goto st1; + case 62: goto st1; + case 127: goto st1; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st1; + } else if ( (*p) >= 0 ) + goto st1; + goto st29; +st30: + if ( ++p == pe ) + goto _out30; +case 30: + 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 st1; +st31: + if ( ++p == pe ) + goto _out31; +case 31: + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto st29; + } else if ( (*p) > 70 ) { + if ( 97 <= (*p) && (*p) <= 102 ) + goto st29; + } else + goto st29; + goto st1; +tr29: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st32; +st32: + if ( ++p == pe ) + goto _out32; +case 32: +#line 542 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr34; + case 37: goto st34; + case 47: goto st1; + case 60: goto st1; + case 62: goto st1; + case 63: goto tr46; + case 127: goto st1; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st1; + } else if ( (*p) >= 0 ) + goto st1; + goto st33; +st33: + if ( ++p == pe ) + goto _out33; +case 33: + switch( (*p) ) { + case 32: goto tr34; + case 37: goto st34; + case 60: goto st1; + case 62: goto st1; + case 63: goto tr46; + case 127: goto st1; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st1; + } else if ( (*p) >= 0 ) + goto st1; + goto st33; +st34: + if ( ++p == pe ) + goto _out34; +case 34: + 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 st1; +st35: + if ( ++p == pe ) + goto _out35; +case 35: + 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 st1; +tr46: +#line 33 "ext/http11/http11_parser.rl" + { + if(parser->path_info != NULL) + parser->path_info(parser->data, parser->mark, p - parser->mark); + } + goto st36; +st36: + if ( ++p == pe ) + goto _out36; +case 36: +#line 613 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr48; + case 37: goto tr54; + case 60: goto st1; + case 62: goto st1; + case 127: goto st1; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st1; + } else if ( (*p) >= 0 ) + goto st1; + goto tr53; +tr53: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st37; +st37: + if ( ++p == pe ) + goto _out37; +case 37: +#line 635 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr48; + case 37: goto st38; + case 60: goto st1; + case 62: goto st1; + case 127: goto st1; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st1; + } else if ( (*p) >= 0 ) + goto st1; + goto st37; +tr54: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st38; +st38: + if ( ++p == pe ) + goto _out38; +case 38: +#line 657 "ext/http11/http11_parser.c" + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto st39; + } else if ( (*p) > 70 ) { + if ( 97 <= (*p) && (*p) <= 102 ) + goto st39; + } else + goto st39; + goto st1; +st39: + if ( ++p == pe ) + goto _out39; +case 39: + 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 st1; +tr14: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st40; +st40: + if ( ++p == pe ) + goto _out40; +case 40: +#line 688 "ext/http11/http11_parser.c" + if ( (*p) == 69 ) + goto st41; + goto st1; +st41: + if ( ++p == pe ) + goto _out41; +case 41: + if ( (*p) == 84 ) + goto st7; + goto st1; +tr15: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st42; +st42: + if ( ++p == pe ) + goto _out42; +case 42: +#line 707 "ext/http11/http11_parser.c" + if ( (*p) == 69 ) + goto st43; + goto st1; +st43: + if ( ++p == pe ) + goto _out43; +case 43: + if ( (*p) == 65 ) + goto st44; + goto st1; +st44: + if ( ++p == pe ) + goto _out44; +case 44: + if ( (*p) == 68 ) + goto st7; + goto st1; +tr16: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st45; +st45: + if ( ++p == pe ) + goto _out45; +case 45: +#line 733 "ext/http11/http11_parser.c" + if ( (*p) == 80 ) + goto st46; + goto st1; +st46: + if ( ++p == pe ) + goto _out46; +case 46: + if ( (*p) == 84 ) + goto st47; + goto st1; +st47: + if ( ++p == pe ) + goto _out47; +case 47: + if ( (*p) == 73 ) + goto st48; + goto st1; +st48: + if ( ++p == pe ) + goto _out48; +case 48: + if ( (*p) == 79 ) + goto st49; + goto st1; +st49: + if ( ++p == pe ) + goto _out49; +case 49: + if ( (*p) == 78 ) + goto st50; + goto st1; +st50: + if ( ++p == pe ) + goto _out50; +case 50: + if ( (*p) == 83 ) + goto st7; + goto st1; +tr17: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st51; +st51: + if ( ++p == pe ) + goto _out51; +case 51: +#line 780 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 79: goto st52; + case 85: goto st41; + } + goto st1; +st52: + if ( ++p == pe ) + goto _out52; +case 52: + if ( (*p) == 83 ) + goto st41; + goto st1; +tr18: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st53; +st53: + if ( ++p == pe ) + goto _out53; +case 53: +#line 801 "ext/http11/http11_parser.c" + if ( (*p) == 82 ) + goto st54; + goto st1; +st54: + if ( ++p == pe ) + goto _out54; +case 54: + if ( (*p) == 65 ) + goto st55; + goto st1; +st55: + if ( ++p == pe ) + goto _out55; +case 55: + if ( (*p) == 67 ) + goto st6; + goto st1; + } + _out1: cs = 1; 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; + _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; + _out56: cs = 56; 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; + + _out: {} + } +#line 127 "ext/http11/http11_parser.rl" + + parser->cs = cs; + parser->nread = p - buffer; + if(parser->body_start) { + /* final \r\n combo encountered so stop right here */ + +#line 886 "ext/http11/http11_parser.c" +#line 133 "ext/http11/http11_parser.rl" + parser->nread++; + } + + return(parser->nread); +} + +int http_parser_finish(http_parser *parser) +{ + int cs = parser->cs; + + +#line 899 "ext/http11/http11_parser.c" +#line 144 "ext/http11/http11_parser.rl" + + parser->cs = cs; + + if (http_parser_has_error(parser) ) { + return -1; + } else if (http_parser_is_finished(parser) ) { + return 1; + } else { + return 0; + } +} + +int http_parser_has_error(http_parser *parser) { + return parser->cs == http_parser_error; +} + +int http_parser_is_finished(http_parser *parser) { + return parser->cs == http_parser_first_final; +} |