From 1c7d2316b2cef5bff1254f215e57a2395895bd41 Mon Sep 17 00:00:00 2001 From: zedshaw Date: Mon, 20 Feb 2006 06:38:35 +0000 Subject: Fix recommended to the Ragel spec from Ragel author that makes the parser behave better. git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@47 19e92222-5c0b-0410-8929-a290d50e31e9 --- ext/http11/http11_parser.c | 439 ++++++++++++++++++-------------------------- ext/http11/http11_parser.rl | 6 +- 2 files changed, 179 insertions(+), 266 deletions(-) diff --git a/ext/http11/http11_parser.c b/ext/http11/http11_parser.c index 9c1c01b..c17d907 100644 --- a/ext/http11/http11_parser.c +++ b/ext/http11/http11_parser.c @@ -17,7 +17,7 @@ #line 18 "ext/http11/http11_parser.c" static int http_parser_start = 0; -static int http_parser_first_final = 56; +static int http_parser_first_final = 53; static int http_parser_error = 1; @@ -162,7 +162,7 @@ tr34: parser->request_uri(parser->data, parser->mark, p - parser->mark); } goto st10; -tr48: +tr46: #line 37 "ext/http11/http11_parser.rl" { if(parser->query_string != NULL) @@ -249,11 +249,21 @@ tr37: parser->http_version(parser->data, parser->mark, p - parser->mark); } goto st19; +tr49: +#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 st19; st19: if ( ++p == pe ) goto _out19; case 19: -#line 257 "ext/http11/http11_parser.c" +#line 267 "ext/http11/http11_parser.c" if ( (*p) == 10 ) goto st20; goto st1; @@ -295,14 +305,14 @@ case 21: tr40: #line 46 "ext/http11/http11_parser.rl" { - parser->body_start = p+1; goto _out56; + parser->body_start = p+1; goto _out53; } - goto st56; -st56: + goto st53; +st53: if ( ++p == pe ) - goto _out56; -case 56: -#line 306 "ext/http11/http11_parser.c" + goto _out53; +case 53: +#line 316 "ext/http11/http11_parser.c" goto st1; tr36: #line 16 "ext/http11/http11_parser.rl" @@ -312,7 +322,7 @@ st22: if ( ++p == pe ) goto _out22; case 22: -#line 316 "ext/http11/http11_parser.c" +#line 326 "ext/http11/http11_parser.c" switch( (*p) ) { case 33: goto st22; case 58: goto tr32; @@ -347,11 +357,11 @@ st23: if ( ++p == pe ) goto _out23; case 23: -#line 351 "ext/http11/http11_parser.c" +#line 361 "ext/http11/http11_parser.c" if ( (*p) == 13 ) - goto tr56; - goto tr55; -tr55: + goto tr49; + goto tr52; +tr52: #line 21 "ext/http11/http11_parser.rl" { MARK(parser, p); } goto st24; @@ -359,141 +369,47 @@ st24: if ( ++p == pe ) goto _out24; case 24: -#line 363 "ext/http11/http11_parser.c" +#line 373 "ext/http11/http11_parser.c" if ( (*p) == 13 ) - goto tr51; + goto tr49; 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" +tr28: +#line 14 "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: +#line 385 "ext/http11/http11_parser.c" 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; + case 43: goto st25; + case 58: goto st26; } if ( (*p) < 48 ) { if ( 45 <= (*p) && (*p) <= 46 ) - goto st28; + goto st25; } else if ( (*p) > 57 ) { if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto st28; + goto st25; } else if ( (*p) >= 65 ) - goto st28; + goto st25; } else - goto st28; + goto st25; goto st1; tr30: #line 14 "ext/http11/http11_parser.rl" { MARK(parser, p); } - goto st29; -st29: + goto st26; +st26: if ( ++p == pe ) - goto _out29; -case 29: -#line 494 "ext/http11/http11_parser.c" + goto _out26; +case 26: +#line 410 "ext/http11/http11_parser.c" switch( (*p) ) { case 32: goto tr34; - case 37: goto st30; + case 37: goto st27; case 60: goto st1; case 62: goto st1; case 127: goto st1; @@ -503,49 +419,49 @@ case 29: goto st1; } else if ( (*p) >= 0 ) goto st1; - goto st29; -st30: + goto st26; +st27: if ( ++p == pe ) - goto _out30; -case 30: + goto _out27; +case 27: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto st31; + goto st28; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) - goto st31; + goto st28; } else - goto st31; + goto st28; goto st1; -st31: +st28: if ( ++p == pe ) - goto _out31; -case 31: + goto _out28; +case 28: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto st29; + goto st26; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) - goto st29; + goto st26; } else - goto st29; + goto st26; goto st1; tr29: #line 14 "ext/http11/http11_parser.rl" { MARK(parser, p); } - goto st32; -st32: + goto st29; +st29: if ( ++p == pe ) - goto _out32; -case 32: -#line 542 "ext/http11/http11_parser.c" + goto _out29; +case 29: +#line 458 "ext/http11/http11_parser.c" switch( (*p) ) { case 32: goto tr34; - case 37: goto st34; + case 37: goto st31; case 47: goto st1; case 60: goto st1; case 62: goto st1; - case 63: goto tr46; + case 63: goto tr44; case 127: goto st1; } if ( (*p) > 31 ) { @@ -553,17 +469,17 @@ case 32: goto st1; } else if ( (*p) >= 0 ) goto st1; - goto st33; -st33: + goto st30; +st30: if ( ++p == pe ) - goto _out33; -case 33: + goto _out30; +case 30: switch( (*p) ) { case 32: goto tr34; - case 37: goto st34; + case 37: goto st31; case 60: goto st1; case 62: goto st1; - case 63: goto tr46; + case 63: goto tr44; case 127: goto st1; } if ( (*p) > 31 ) { @@ -571,48 +487,48 @@ case 33: goto st1; } else if ( (*p) >= 0 ) goto st1; - goto st33; -st34: + goto st30; +st31: if ( ++p == pe ) - goto _out34; -case 34: + goto _out31; +case 31: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto st35; + goto st32; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) - goto st35; + goto st32; } else - goto st35; + goto st32; goto st1; -st35: +st32: if ( ++p == pe ) - goto _out35; -case 35: + goto _out32; +case 32: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto st33; + goto st30; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) - goto st33; + goto st30; } else - goto st33; + goto st30; goto st1; -tr46: +tr44: #line 33 "ext/http11/http11_parser.rl" { if(parser->request_uri != NULL) parser->request_uri(parser->data, parser->mark, p - parser->mark); } - goto st36; -st36: + goto st33; +st33: if ( ++p == pe ) - goto _out36; -case 36: -#line 613 "ext/http11/http11_parser.c" + goto _out33; +case 33: +#line 529 "ext/http11/http11_parser.c" switch( (*p) ) { - case 32: goto tr48; - case 37: goto tr54; + case 32: goto tr46; + case 37: goto tr51; case 60: goto st1; case 62: goto st1; case 127: goto st1; @@ -622,19 +538,19 @@ case 36: goto st1; } else if ( (*p) >= 0 ) goto st1; - goto tr53; -tr53: + goto tr50; +tr50: #line 14 "ext/http11/http11_parser.rl" { MARK(parser, p); } - goto st37; -st37: + goto st34; +st34: if ( ++p == pe ) - goto _out37; -case 37: -#line 635 "ext/http11/http11_parser.c" + goto _out34; +case 34: +#line 551 "ext/http11/http11_parser.c" switch( (*p) ) { - case 32: goto tr48; - case 37: goto st38; + case 32: goto tr46; + case 37: goto st35; case 60: goto st1; case 62: goto st1; case 127: goto st1; @@ -644,58 +560,84 @@ case 37: goto st1; } else if ( (*p) >= 0 ) goto st1; - goto st37; -tr54: + goto st34; +tr51: #line 14 "ext/http11/http11_parser.rl" { MARK(parser, p); } - goto st38; -st38: + goto st35; +st35: if ( ++p == pe ) - goto _out38; -case 38: -#line 657 "ext/http11/http11_parser.c" + goto _out35; +case 35: +#line 573 "ext/http11/http11_parser.c" if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto st39; + goto st36; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) - goto st39; + goto st36; } else - goto st39; + goto st36; goto st1; -st39: +st36: if ( ++p == pe ) - goto _out39; -case 39: + goto _out36; +case 36: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto st37; + goto st34; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) - goto st37; + goto st34; } else - goto st37; + goto st34; goto st1; tr14: #line 14 "ext/http11/http11_parser.rl" { MARK(parser, p); } - goto st40; + goto st37; +st37: + if ( ++p == pe ) + goto _out37; +case 37: +#line 604 "ext/http11/http11_parser.c" + if ( (*p) == 69 ) + goto st38; + goto st1; +st38: + if ( ++p == pe ) + goto _out38; +case 38: + if ( (*p) == 84 ) + goto st7; + goto st1; +tr15: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st39; +st39: + if ( ++p == pe ) + goto _out39; +case 39: +#line 623 "ext/http11/http11_parser.c" + if ( (*p) == 69 ) + goto st40; + goto st1; st40: if ( ++p == pe ) goto _out40; case 40: -#line 688 "ext/http11/http11_parser.c" - if ( (*p) == 69 ) + if ( (*p) == 65 ) goto st41; goto st1; st41: if ( ++p == pe ) goto _out41; case 41: - if ( (*p) == 84 ) + if ( (*p) == 68 ) goto st7; goto st1; -tr15: +tr16: #line 14 "ext/http11/http11_parser.rl" { MARK(parser, p); } goto st42; @@ -703,115 +645,89 @@ st42: if ( ++p == pe ) goto _out42; case 42: -#line 707 "ext/http11/http11_parser.c" - if ( (*p) == 69 ) +#line 649 "ext/http11/http11_parser.c" + if ( (*p) == 80 ) goto st43; goto st1; st43: if ( ++p == pe ) goto _out43; case 43: - if ( (*p) == 65 ) + if ( (*p) == 84 ) goto st44; goto st1; st44: if ( ++p == pe ) goto _out44; case 44: - if ( (*p) == 68 ) - goto st7; + if ( (*p) == 73 ) + goto st45; 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 ) + if ( (*p) == 79 ) goto st46; goto st1; st46: if ( ++p == pe ) goto _out46; case 46: - if ( (*p) == 84 ) + if ( (*p) == 78 ) goto st47; goto st1; st47: if ( ++p == pe ) goto _out47; case 47: - if ( (*p) == 73 ) - goto st48; + if ( (*p) == 83 ) + goto st7; goto st1; +tr17: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st48; st48: if ( ++p == pe ) goto _out48; case 48: - if ( (*p) == 79 ) - goto st49; +#line 696 "ext/http11/http11_parser.c" + switch( (*p) ) { + case 79: goto st49; + case 85: goto st38; + } goto st1; st49: if ( ++p == pe ) goto _out49; case 49: - if ( (*p) == 78 ) - goto st50; + if ( (*p) == 83 ) + goto st38; goto st1; +tr18: +#line 14 "ext/http11/http11_parser.rl" + { MARK(parser, p); } + goto st50; st50: if ( ++p == pe ) goto _out50; case 50: - if ( (*p) == 83 ) - goto st7; +#line 717 "ext/http11/http11_parser.c" + if ( (*p) == 82 ) + goto st51; 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; - } + if ( (*p) == 65 ) + goto st52; 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; @@ -837,7 +753,7 @@ case 55: _out19: cs = 19; goto _out; _out20: cs = 20; goto _out; _out21: cs = 21; goto _out; - _out56: cs = 56; goto _out; + _out53: cs = 53; goto _out; _out22: cs = 22; goto _out; _out23: cs = 23; goto _out; _out24: cs = 24; goto _out; @@ -869,9 +785,6 @@ case 55: _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: {} } @@ -882,7 +795,7 @@ case 55: if(parser->body_start) { /* final \r\n combo encountered so stop right here */ -#line 886 "ext/http11/http11_parser.c" +#line 799 "ext/http11/http11_parser.c" #line 131 "ext/http11/http11_parser.rl" parser->nread++; } @@ -895,7 +808,7 @@ int http_parser_finish(http_parser *parser) int cs = parser->cs; -#line 899 "ext/http11/http11_parser.c" +#line 812 "ext/http11/http11_parser.c" #line 142 "ext/http11/http11_parser.rl" parser->cs = cs; diff --git a/ext/http11/http11_parser.rl b/ext/http11/http11_parser.rl index c86be7a..1073d9f 100644 --- a/ext/http11/http11_parser.rl +++ b/ext/http11/http11_parser.rl @@ -88,11 +88,11 @@ field_name = (token - ":")+ >start_field %write_field; - field_value = (any - CRLF)*; + field_value = any* >start_value %write_value; - message_header = field_name ":" field_value >start_value %write_value CRLF; + message_header = field_name ":" field_value $0 CRLF >1; - Request = Request_Line (message_header)* $0 ( CRLF $1 @done ); + Request = Request_Line (message_header)* ( CRLF @done ); main := Request; }%% -- cgit v1.2.3-24-ge0c7