#line 1 "http11_response.rl" #include "http11_response.h" #include #include #include #include #include #define LEN(AT, FPC) (FPC - buffer - parser->AT) #define MARK(M,FPC) (parser->M = (FPC) - buffer) #define PTR_TO(F) (buffer + parser->F) /** Machine **/ #line 59 "http11_response.rl" /** Data **/ #line 25 "http11_response.c" static const int http_parser_start = 1; static const int http_parser_first_final = 20; static const int http_parser_error = 0; static const int http_parser_en_main = 1; #line 63 "http11_response.rl" int http_parser_init(http_parser *parser) { int cs = 0; #line 38 "http11_response.c" { cs = http_parser_start; } #line 67 "http11_response.rl" parser->cs = cs; parser->body_start = 0; parser->content_len = 0; parser->mark = 0; parser->nread = 0; parser->field_len = 0; parser->field_start = 0; return(1); } /** exec **/ size_t 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"); p = buffer+off; pe = buffer+len; assert(pe - p == len - off && "pointers aren't same distance"); #line 69 "http11_response.c" { if ( p == pe ) goto _test_eof; switch ( cs ) { case 1: if ( (*p) == 72 ) goto tr0; goto st0; st0: cs = 0; goto _out; tr0: #line 20 "http11_response.rl" {MARK(mark, p); } goto st2; st2: if ( ++p == pe ) goto _test_eof2; case 2: #line 90 "http11_response.c" if ( (*p) == 84 ) goto st3; goto st0; st3: if ( ++p == pe ) goto _test_eof3; case 3: if ( (*p) == 84 ) goto st4; goto st0; st4: if ( ++p == pe ) goto _test_eof4; case 4: if ( (*p) == 80 ) goto st5; goto st0; st5: if ( ++p == pe ) goto _test_eof5; case 5: if ( (*p) == 47 ) goto st6; goto st0; st6: if ( ++p == pe ) goto _test_eof6; case 6: if ( 48 <= (*p) && (*p) <= 57 ) goto st7; goto st0; st7: if ( ++p == pe ) goto _test_eof7; case 7: if ( (*p) == 46 ) goto st8; if ( 48 <= (*p) && (*p) <= 57 ) goto st7; goto st0; st8: if ( ++p == pe ) goto _test_eof8; case 8: if ( 48 <= (*p) && (*p) <= 57 ) goto st9; goto st0; st9: if ( ++p == pe ) goto _test_eof9; case 9: if ( (*p) == 32 ) goto tr9; if ( 48 <= (*p) && (*p) <= 57 ) goto st9; goto st0; tr9: #line 35 "http11_response.rl" { if(parser->http_version != NULL) parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st10; st10: if ( ++p == pe ) goto _test_eof10; case 10: #line 158 "http11_response.c" if ( 48 <= (*p) && (*p) <= 57 ) goto tr10; goto st0; tr10: #line 20 "http11_response.rl" {MARK(mark, p); } goto st11; st11: if ( ++p == pe ) goto _test_eof11; case 11: #line 170 "http11_response.c" if ( (*p) == 32 ) goto tr11; if ( 48 <= (*p) && (*p) <= 57 ) goto st11; goto st0; tr11: #line 40 "http11_response.rl" { if(parser->status_code != NULL) parser->status_code(parser->data, PTR_TO(mark), LEN(mark,p)); } goto st12; st12: if ( ++p == pe ) goto _test_eof12; case 12: #line 187 "http11_response.c" if ( (*p) < 11 ) { if ( 0 <= (*p) && (*p) <= 9 ) goto tr13; } else if ( (*p) > 12 ) { if ( 14 <= (*p) ) goto tr13; } else goto tr13; goto st0; tr13: #line 20 "http11_response.rl" {MARK(mark, p); } goto st13; st13: if ( ++p == pe ) goto _test_eof13; case 13: #line 205 "http11_response.c" if ( (*p) == 13 ) goto tr15; if ( (*p) > 9 ) { if ( 11 <= (*p) ) goto st13; } else if ( (*p) >= 0 ) goto st13; goto st0; tr15: #line 45 "http11_response.rl" { if(parser->reason_phrase != NULL) parser->reason_phrase(parser->data, PTR_TO(mark), LEN(mark,p)); } goto st14; tr23: #line 27 "http11_response.rl" { MARK(mark, p); } #line 29 "http11_response.rl" { if(parser->http_field != NULL) { parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); } } goto st14; tr26: #line 29 "http11_response.rl" { if(parser->http_field != NULL) { parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); } } goto st14; st14: if ( ++p == pe ) goto _test_eof14; case 14: #line 243 "http11_response.c" if ( (*p) == 10 ) goto st15; goto st0; st15: if ( ++p == pe ) goto _test_eof15; case 15: switch( (*p) ) { case 13: goto st16; case 33: goto tr18; case 124: goto tr18; case 126: goto tr18; } if ( (*p) < 45 ) { if ( (*p) > 39 ) { if ( 42 <= (*p) && (*p) <= 43 ) goto tr18; } else if ( (*p) >= 35 ) goto tr18; } else if ( (*p) > 46 ) { if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto tr18; } else if ( (*p) > 90 ) { if ( 94 <= (*p) && (*p) <= 122 ) goto tr18; } else goto tr18; } else goto tr18; goto st0; st16: if ( ++p == pe ) goto _test_eof16; case 16: if ( (*p) == 10 ) goto tr19; goto st0; tr19: #line 50 "http11_response.rl" { parser->body_start = p - buffer + 1; if(parser->header_done != NULL) parser->header_done(parser->data, p + 1, pe - p - 1); {p++; cs = 20; goto _out;} } goto st20; st20: if ( ++p == pe ) goto _test_eof20; case 20: #line 295 "http11_response.c" goto st0; tr18: #line 22 "http11_response.rl" { MARK(field_start, p); } goto st17; st17: if ( ++p == pe ) goto _test_eof17; case 17: #line 305 "http11_response.c" switch( (*p) ) { case 33: goto st17; case 58: goto tr21; case 124: goto st17; case 126: goto st17; } 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; tr21: #line 23 "http11_response.rl" { parser->field_len = LEN(field_start, p); } goto st18; tr24: #line 27 "http11_response.rl" { MARK(mark, p); } goto st18; st18: if ( ++p == pe ) goto _test_eof18; case 18: #line 344 "http11_response.c" switch( (*p) ) { case 13: goto tr23; case 32: goto tr24; } goto tr22; tr22: #line 27 "http11_response.rl" { MARK(mark, p); } goto st19; st19: if ( ++p == pe ) goto _test_eof19; case 19: #line 358 "http11_response.c" if ( (*p) == 13 ) goto tr26; goto st19; } _test_eof2: cs = 2; goto _test_eof; _test_eof3: cs = 3; goto _test_eof; _test_eof4: cs = 4; goto _test_eof; _test_eof5: cs = 5; goto _test_eof; _test_eof6: cs = 6; goto _test_eof; _test_eof7: cs = 7; goto _test_eof; _test_eof8: cs = 8; goto _test_eof; _test_eof9: cs = 9; goto _test_eof; _test_eof10: cs = 10; goto _test_eof; _test_eof11: cs = 11; goto _test_eof; _test_eof12: cs = 12; goto _test_eof; _test_eof13: cs = 13; goto _test_eof; _test_eof14: cs = 14; goto _test_eof; _test_eof15: cs = 15; goto _test_eof; _test_eof16: cs = 16; goto _test_eof; _test_eof20: cs = 20; goto _test_eof; _test_eof17: cs = 17; goto _test_eof; _test_eof18: cs = 18; goto _test_eof; _test_eof19: cs = 19; goto _test_eof; _test_eof: {} _out: {} } #line 92 "http11_response.rl" if (!http_parser_has_error(parser)) parser->cs = cs; parser->nread += p - (buffer + off); assert(p <= pe && "buffer overflow after parsing execute"); assert(parser->nread <= len && "nread longer than length"); assert(parser->body_start <= len && "body starts after buffer end"); assert(parser->mark < len && "mark is after buffer end"); assert(parser->field_len <= len && "field has length longer than whole buffer"); assert(parser->field_start < len && "field starts after buffer end"); return(parser->nread); } int http_parser_finish(http_parser *parser) { 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; }