Mercurial > projects > dreactor
diff asyncdreactor/protocol/Http11Parser.d @ 11:5836613d16ac
reorg! reorg!
author | rick@minifunk |
---|---|
date | Tue, 12 Aug 2008 16:59:56 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/asyncdreactor/protocol/Http11Parser.d Tue Aug 12 16:59:56 2008 -0400 @@ -0,0 +1,1293 @@ +/* #line 1 "http11_parser.rl" */ +/** + * Copyright (c) 2005 Zed A. Shaw, + * Modified for D/DReactor by Rick Richardson, 2008 + * You can redistribute it and/or modify it under the same terms as Ruby. + */ + +alias void delegate (void *data, const char *at, size_t length) element_cb; +alias void delegate (void *data, const char *field, size_t flen, const char *value, size_t vlen) field_cb; + +class Http11Parser +{ + int cs; + size_t body_start; + int content_len; + size_t nread; + size_t mark; + size_t field_start; + size_t field_len; + size_t query_start; + + void *data; + + field_cb http_field; + element_cb request_method; + element_cb request_uri; + element_cb fragment; + element_cb request_path; + element_cb query_string; + element_cb http_version; + element_cb header_done; + +/* + * capitalizes all lower-case ASCII characters, + * converts dashes to underscores. + */ +private void snake_upcase_char(char *c) +{ + if (*c >= 'a' && *c <= 'z') + *c &= ~0x20; + else if (*c == '-') + *c = '_'; +} + +//#define LEN(AT, FPC) (FPC - buffer - parser->AT) +private int LEN(char* at, char* fpc) +{ + return (fpc - buffer.ptr - at); +} + +//#define MARK(M,FPC) (parser->M = (FPC) - buffer) +private void MARK(size_t* item, char* fpc) +{ + *item = fpc - buffer.ptr; +} + +//#define PTR_TO(F) (buffer + parser->F) +private char* PTR_TO(size_t F) +{ + return (buffer.ptr + F); +} +/** Machine **/ + +/* #line 126 "http11_parser.rl" */ + + +/** Data **/ + +/* #line 70 "Http11Parser.d" */ +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 130 "http11_parser.rl" */ + +this () +{ + cs = 0; + +/* #line 83 "Http11Parser.d" */ + { + cs = http_parser_start; + } +/* #line 135 "http11_parser.rl" */ + + body_start = 0; + content_len = 0; + mark = 0; + nread = 0; + field_len = 0; + field_start = 0; +} + + +/** exec **/ +size_t execute(const char[] buffer, size_t off) { + const char *p, *pe; + int len = buffer.length; + + assert(off <= len && "offset past end of buffer"); + + p = buffer.ptr+off; + pe = buffer.ptr+len; + + /* assert(*pe == '\0' && "pointer does not end on NUL"); */ + assert(pe - p == len - off && "pointers aren't same distance"); + + +/* #line 112 "Http11Parser.d" */ + { + if ( p == pe ) + goto _out; + switch ( cs ) + { +case 1: + switch( (*p) ) { + case 36u: goto tr0; + case 95u: goto tr0; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto tr0; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto tr0; + } else + goto tr0; + goto st0; +st0: + goto _out0; +tr0: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st2; +st2: + if ( ++p == pe ) + goto _out2; +case 2: +/* #line 143 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st38; + case 95u: goto st38; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st38; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st38; + } else + goto st38; + goto st0; +tr2: +/* #line 85 "http11_parser.rl" */ + { + if(request_method) + request_method(data, PTR_TO(mark), LEN(mark, p)); + } + goto st3; +st3: + if ( ++p == pe ) + goto _out3; +case 3: +/* #line 170 "Http11Parser.d" */ + switch( (*p) ) { + case 42u: goto tr4; + case 43u: goto tr5; + case 47u: goto tr6; + case 58u: goto tr7; + default: break; + } + if ( (*p) < 65u ) { + if ( 45u <= (*p) && (*p) <= 57u ) + goto tr5; + } else if ( (*p) > 90u ) { + if ( 97u <= (*p) && (*p) <= 122u ) + goto tr5; + } else + goto tr5; + goto st0; +tr4: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st4; +st4: + if ( ++p == pe ) + goto _out4; +case 4: +/* #line 195 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr8; + case 35u: goto tr9; + default: break; + } + goto st0; +tr8: +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr29: +/* #line 95 "http11_parser.rl" */ + { + if(fragment) + fragment(data, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr39: +/* #line 112 "http11_parser.rl" */ + { + if(request_path) + request_path(data, PTR_TO(mark), LEN(mark,p)); + } +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr50: +/* #line 100 "http11_parser.rl" */ + {MARK(query_start, p); } +/* #line 102 "http11_parser.rl" */ + { + if(query_string) + query_string(data, PTR_TO(query_start), LEN(query_start, p)); + } +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr54: +/* #line 102 "http11_parser.rl" */ + { + if(query_string) + query_string(data, PTR_TO(query_start), LEN(query_start, p)); + } +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +st5: + if ( ++p == pe ) + goto _out5; +case 5: +/* #line 258 "Http11Parser.d" */ + if ( (*p) == 72u ) + goto tr10; + goto st0; +tr10: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st6; +st6: + if ( ++p == pe ) + goto _out6; +case 6: +/* #line 270 "Http11Parser.d" */ + if ( (*p) == 84u ) + goto st7; + goto st0; +st7: + if ( ++p == pe ) + goto _out7; +case 7: + if ( (*p) == 84u ) + goto st8; + goto st0; +st8: + if ( ++p == pe ) + goto _out8; +case 8: + if ( (*p) == 80u ) + goto st9; + goto st0; +st9: + if ( ++p == pe ) + goto _out9; +case 9: + if ( (*p) == 47u ) + goto st10; + goto st0; +st10: + if ( ++p == pe ) + goto _out10; +case 10: + if ( 48u <= (*p) && (*p) <= 57u ) + goto st11; + goto st0; +st11: + if ( ++p == pe ) + goto _out11; +case 11: + if ( (*p) == 46u ) + goto st12; + if ( 48u <= (*p) && (*p) <= 57u ) + goto st11; + goto st0; +st12: + if ( ++p == pe ) + goto _out12; +case 12: + if ( 48u <= (*p) && (*p) <= 57u ) + goto st13; + goto st0; +st13: + if ( ++p == pe ) + goto _out13; +case 13: + if ( (*p) == 13u ) + goto tr18; + if ( 48u <= (*p) && (*p) <= 57u ) + goto st13; + goto st0; +tr18: +/* #line 107 "http11_parser.rl" */ + { + if(http_version) + http_version(data, PTR_TO(mark), LEN(mark, p)); + } + goto st14; +tr26: +/* #line 77 "http11_parser.rl" */ + { + if(http_field) + http_field(data, + PTR_TO(field_start), + field_len, + PTR_TO(mark), + LEN(mark, p)); + } + goto st14; +st14: + if ( ++p == pe ) + goto _out14; +case 14: +/* #line 349 "Http11Parser.d" */ + if ( (*p) == 10u ) + goto st15; + goto st0; +st15: + if ( ++p == pe ) + goto _out15; +case 15: + switch( (*p) ) { + case 13u: goto st16; + case 33u: goto tr21; + case 124u: goto tr21; + case 126u: goto tr21; + default: break; + } + if ( (*p) < 45u ) { + if ( (*p) > 39u ) { + if ( 42u <= (*p) && (*p) <= 43u ) + goto tr21; + } else if ( (*p) >= 35u ) + goto tr21; + } else if ( (*p) > 46u ) { + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto tr21; + } else if ( (*p) > 90u ) { + if ( 94u <= (*p) && (*p) <= 122u ) + goto tr21; + } else + goto tr21; + } else + goto tr21; + goto st0; +st16: + if ( ++p == pe ) + goto _out16; +case 16: + if ( (*p) == 10u ) + goto tr22; + goto st0; +tr22: +/* #line 117 "http11_parser.rl" */ + { + body_start = p - buffer + 1; + if(header_done) + header_done(data, p + 1, pe - p - 1); + if (true) goto _out57; + } + goto st57; +st57: + if ( ++p == pe ) + goto _out57; +case 57: +/* #line 402 "Http11Parser.d" */ + goto st0; +tr21: +/* #line 70 "http11_parser.rl" */ + { MARK(field_start, p); } +/* #line 71 "http11_parser.rl" */ + { snake_upcase_char((char *)p); } + goto st17; +tr23: +/* #line 71 "http11_parser.rl" */ + { snake_upcase_char((char *)p); } + goto st17; +st17: + if ( ++p == pe ) + goto _out17; +case 17: +/* #line 418 "Http11Parser.d" */ + switch( (*p) ) { + case 33u: goto tr23; + case 58u: goto tr24; + case 124u: goto tr23; + case 126u: goto tr23; + default: break; + } + if ( (*p) < 45u ) { + if ( (*p) > 39u ) { + if ( 42u <= (*p) && (*p) <= 43u ) + goto tr23; + } else if ( (*p) >= 35u ) + goto tr23; + } else if ( (*p) > 46u ) { + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto tr23; + } else if ( (*p) > 90u ) { + if ( 94u <= (*p) && (*p) <= 122u ) + goto tr23; + } else + goto tr23; + } else + goto tr23; + goto st0; +tr24: +/* #line 72 "http11_parser.rl" */ + { + field_len = LEN(field_start, p); + } + goto st18; +tr27: +/* #line 76 "http11_parser.rl" */ + { MARK(mark, p); } + goto st18; +st18: + if ( ++p == pe ) + goto _out18; +case 18: +/* #line 458 "Http11Parser.d" */ + switch( (*p) ) { + case 13u: goto tr26; + case 32u: goto tr27; + default: break; + } + goto tr25; +tr25: +/* #line 76 "http11_parser.rl" */ + { MARK(mark, p); } + goto st19; +st19: + if ( ++p == pe ) + goto _out19; +case 19: +/* #line 473 "Http11Parser.d" */ + if ( (*p) == 13u ) + goto tr26; + goto st19; +tr9: +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +tr41: +/* #line 112 "http11_parser.rl" */ + { + if(request_path) + request_path(data, PTR_TO(mark), LEN(mark,p)); + } +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +tr52: +/* #line 100 "http11_parser.rl" */ + {MARK(query_start, p); } +/* #line 102 "http11_parser.rl" */ + { + if(query_string) + query_string(data, PTR_TO(query_start), LEN(query_start, p)); + } +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +tr56: +/* #line 102 "http11_parser.rl" */ + { + if(query_string) + query_string(data, PTR_TO(query_start), LEN(query_start, p)); + } +/* #line 90 "http11_parser.rl" */ + { + if(request_uri) + request_uri(data, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +st20: + if ( ++p == pe ) + goto _out20; +case 20: +/* #line 526 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr29; + case 37u: goto tr31; + case 60u: goto st0; + case 62u: goto st0; + case 127u: goto st0; + default: break; + } + if ( (*p) > 31u ) { + if ( 34u <= (*p) && (*p) <= 35u ) + goto st0; + } else + goto st0; + goto tr30; +tr30: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st21; +st21: + if ( ++p == pe ) + goto _out21; +case 21: +/* #line 549 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr29; + case 37u: goto st22; + case 60u: goto st0; + case 62u: goto st0; + case 127u: goto st0; + default: break; + } + if ( (*p) > 31u ) { + if ( 34u <= (*p) && (*p) <= 35u ) + goto st0; + } else + goto st0; + goto st21; +tr31: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st22; +st22: + if ( ++p == pe ) + goto _out22; +case 22: +/* #line 572 "Http11Parser.d" */ + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st23; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st23; + } else + goto st23; + goto st0; +st23: + if ( ++p == pe ) + goto _out23; +case 23: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st21; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st21; + } else + goto st21; + goto st0; +tr5: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st24; +st24: + if ( ++p == pe ) + goto _out24; +case 24: +/* #line 603 "Http11Parser.d" */ + switch( (*p) ) { + case 43u: goto st24; + case 58u: goto st25; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st24; + } else if ( (*p) > 57u ) { + if ( (*p) > 90u ) { + if ( 97u <= (*p) && (*p) <= 122u ) + goto st24; + } else if ( (*p) >= 65u ) + goto st24; + } else + goto st24; + goto st0; +tr7: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st25; +st25: + if ( ++p == pe ) + goto _out25; +case 25: +/* #line 629 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr8; + case 34u: goto st0; + case 35u: goto tr9; + case 37u: goto st26; + case 60u: goto st0; + case 62u: goto st0; + case 127u: goto st0; + default: break; + } + if ( (*p) <= 31u ) + goto st0; + goto st25; +st26: + if ( ++p == pe ) + goto _out26; +case 26: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st27; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st27; + } else + goto st27; + goto st0; +st27: + if ( ++p == pe ) + goto _out27; +case 27: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st25; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st25; + } else + goto st25; + goto st0; +tr6: +/* #line 67 "http11_parser.rl" */ + {MARK(mark, p); } + goto st28; +st28: + if ( ++p == pe ) + goto _out28; +case 28: +/* #line 677 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr39; + case 34u: goto st0; + case 35u: goto tr41; + case 37u: goto st29; + case 59u: goto tr43; + case 60u: goto st0; + case 62u: goto st0; + case 63u: goto tr44; + case 127u: goto st0; + default: break; + } + if ( (*p) <= 31u ) + goto st0; + goto st28; +st29: + if ( ++p == pe ) + goto _out29; +case 29: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st30; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st30; + } else + goto st30; + goto st0; +st30: + if ( ++p == pe ) + goto _out30; +case 30: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st28; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st28; + } else + goto st28; + goto st0; +tr43: +/* #line 112 "http11_parser.rl" */ + { + if(request_path) + request_path(data, PTR_TO(mark), LEN(mark,p)); + } + goto st31; +st31: + if ( ++p == pe ) + goto _out31; +case 31: +/* #line 730 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr8; + case 34u: goto st0; + case 35u: goto tr9; + case 37u: goto st32; + case 60u: goto st0; + case 62u: goto st0; + case 63u: goto st34; + case 127u: goto st0; + default: break; + } + if ( (*p) <= 31u ) + goto st0; + goto st31; +st32: + if ( ++p == pe ) + goto _out32; +case 32: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st33; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st33; + } else + goto st33; + goto st0; +st33: + if ( ++p == pe ) + goto _out33; +case 33: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st31; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st31; + } else + goto st31; + goto st0; +tr44: +/* #line 112 "http11_parser.rl" */ + { + if(request_path) + request_path(data, PTR_TO(mark), LEN(mark,p)); + } + goto st34; +st34: + if ( ++p == pe ) + goto _out34; +case 34: +/* #line 782 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr50; + case 34u: goto st0; + case 35u: goto tr52; + case 37u: goto tr53; + case 60u: goto st0; + case 62u: goto st0; + case 127u: goto st0; + default: break; + } + if ( (*p) <= 31u ) + goto st0; + goto tr51; +tr51: +/* #line 100 "http11_parser.rl" */ + {MARK(query_start, p); } + goto st35; +st35: + if ( ++p == pe ) + goto _out35; +case 35: +/* #line 804 "Http11Parser.d" */ + switch( (*p) ) { + case 32u: goto tr54; + case 34u: goto st0; + case 35u: goto tr56; + case 37u: goto st36; + case 60u: goto st0; + case 62u: goto st0; + case 127u: goto st0; + default: break; + } + if ( (*p) <= 31u ) + goto st0; + goto st35; +tr53: +/* #line 100 "http11_parser.rl" */ + {MARK(query_start, p); } + goto st36; +st36: + if ( ++p == pe ) + goto _out36; +case 36: +/* #line 826 "Http11Parser.d" */ + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st37; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st37; + } else + goto st37; + goto st0; +st37: + if ( ++p == pe ) + goto _out37; +case 37: + if ( (*p) < 65u ) { + if ( 48u <= (*p) && (*p) <= 57u ) + goto st35; + } else if ( (*p) > 70u ) { + if ( 97u <= (*p) && (*p) <= 102u ) + goto st35; + } else + goto st35; + goto st0; +st38: + if ( ++p == pe ) + goto _out38; +case 38: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st39; + case 95u: goto st39; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st39; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st39; + } else + goto st39; + goto st0; +st39: + if ( ++p == pe ) + goto _out39; +case 39: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st40; + case 95u: goto st40; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st40; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st40; + } else + goto st40; + goto st0; +st40: + if ( ++p == pe ) + goto _out40; +case 40: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st41; + case 95u: goto st41; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st41; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st41; + } else + goto st41; + goto st0; +st41: + if ( ++p == pe ) + goto _out41; +case 41: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st42; + case 95u: goto st42; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st42; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st42; + } else + goto st42; + goto st0; +st42: + if ( ++p == pe ) + goto _out42; +case 42: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st43; + case 95u: goto st43; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st43; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st43; + } else + goto st43; + goto st0; +st43: + if ( ++p == pe ) + goto _out43; +case 43: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st44; + case 95u: goto st44; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st44; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st44; + } else + goto st44; + goto st0; +st44: + if ( ++p == pe ) + goto _out44; +case 44: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st45; + case 95u: goto st45; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st45; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st45; + } else + goto st45; + goto st0; +st45: + if ( ++p == pe ) + goto _out45; +case 45: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st46; + case 95u: goto st46; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st46; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st46; + } else + goto st46; + goto st0; +st46: + if ( ++p == pe ) + goto _out46; +case 46: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st47; + case 95u: goto st47; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st47; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st47; + } else + goto st47; + goto st0; +st47: + if ( ++p == pe ) + goto _out47; +case 47: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st48; + case 95u: goto st48; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st48; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st48; + } else + goto st48; + goto st0; +st48: + if ( ++p == pe ) + goto _out48; +case 48: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st49; + case 95u: goto st49; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st49; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st49; + } else + goto st49; + goto st0; +st49: + if ( ++p == pe ) + goto _out49; +case 49: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st50; + case 95u: goto st50; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st50; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st50; + } else + goto st50; + goto st0; +st50: + if ( ++p == pe ) + goto _out50; +case 50: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st51; + case 95u: goto st51; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st51; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st51; + } else + goto st51; + goto st0; +st51: + if ( ++p == pe ) + goto _out51; +case 51: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st52; + case 95u: goto st52; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st52; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st52; + } else + goto st52; + goto st0; +st52: + if ( ++p == pe ) + goto _out52; +case 52: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st53; + case 95u: goto st53; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st53; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st53; + } else + goto st53; + goto st0; +st53: + if ( ++p == pe ) + goto _out53; +case 53: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st54; + case 95u: goto st54; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st54; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st54; + } else + goto st54; + goto st0; +st54: + if ( ++p == pe ) + goto _out54; +case 54: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st55; + case 95u: goto st55; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st55; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st55; + } else + goto st55; + goto st0; +st55: + if ( ++p == pe ) + goto _out55; +case 55: + switch( (*p) ) { + case 32u: goto tr2; + case 36u: goto st56; + case 95u: goto st56; + default: break; + } + if ( (*p) < 48u ) { + if ( 45u <= (*p) && (*p) <= 46u ) + goto st56; + } else if ( (*p) > 57u ) { + if ( 65u <= (*p) && (*p) <= 90u ) + goto st56; + } else + goto st56; + goto st0; +st56: + if ( ++p == pe ) + goto _out56; +case 56: + if ( (*p) == 32u ) + goto tr2; + goto st0; + default: break; + } + _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; + + _out: {} + } +/* #line 159 "http11_parser.rl" */ + + //parser->cs = cs; + nread += p - (buffer.ptr + off); + + assert(p <= pe && "buffer overflow after parsing execute"); + assert(nread <= len && "nread longer than length"); + assert(body_start <= len && "body starts after buffer end"); + assert(mark < len && "mark is after buffer end"); + assert(field_len <= len && "field has length longer than whole buffer"); + assert(field_start < len && "field starts after buffer end"); + + return(nread); +} + +int finish() +{ + if (has_error() ) { + return -1; + } else if (is_finished() ) { + return 1; + } else { + return 0; + } +} + +bool has_error() { + return cs == http_parser_error; +} + +bool is_finished() { + return cs >= http_parser_first_final; +} + +}