This code implements (and expands) the new parser for Mistral.
authorStefan de Konink <stefan@konink.de>
Thu, 13 May 2010 20:15:53 +0000 (13 22:15 +0200)
committerStefan de Konink <stefan@konink.de>
Thu, 13 May 2010 20:15:53 +0000 (13 22:15 +0200)
original_parser/parser.h [new file with mode: 0644]
original_parser/parser.rl [new file with mode: 0644]
parser.c [new file with mode: 0644]
parser.h [new file with mode: 0644]

diff --git a/original_parser/parser.h b/original_parser/parser.h
new file mode 100644 (file)
index 0000000..d515281
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2005 Zed A. Shaw
+ * You can redistribute it and/or modify it under the same terms as Ruby.
+ */
+
+#ifndef http11_parser_h
+#define http11_parser_h
+
+#include <sys/types.h>
+
+#if defined(_WIN32)
+#include <stddef.h>
+#endif
+
+enum { MONGREL_CONTENT_LENGTH
+     , MONGREL_CONTENT_TYPE
+     , MONGREL_FRAGMENT
+     , MONGREL_HTTP_VERSION
+     , MONGREL_QUERY_STRING
+     , MONGREL_REQUEST_PATH
+     , MONGREL_REQUEST_METHOD
+     , MONGREL_REQUEST_URI
+     };
+
+typedef void (*field_cb)(void *data, const char *field, size_t flen, const char *value, size_t vlen);
+typedef void (*element_cb)(void *data, int type, const char *at, size_t length);
+
+typedef struct http_parser { 
+  int cs;
+  int overflow_error;
+  size_t body_start;
+  size_t content_length;
+  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 on_element;
+} http_parser;
+
+void http_parser_init(http_parser *parser);
+int http_parser_finish(http_parser *parser);
+size_t http_parser_execute(http_parser *parser, const char *data, size_t len, size_t off);
+int http_parser_has_error(http_parser *parser);
+int http_parser_is_finished(http_parser *parser);
+
+#define http_parser_nread(parser) (parser)->nread 
+
+#endif
diff --git a/original_parser/parser.rl b/original_parser/parser.rl
new file mode 100644 (file)
index 0000000..5850e9f
--- /dev/null
@@ -0,0 +1,239 @@
+/**
+ * Copyright (c) 2005 Zed A. Shaw
+ * You can redistribute it and/or modify it under the same terms as Ruby.
+ */
+#include "parser.h"
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#define TRUE 1
+#define FALSE 0
+#define LEN(AT, FPC) (FPC - buffer - parser->AT)
+#define MARK(M,FPC) (parser->M = (FPC) - buffer)
+#define PTR_TO(F) (buffer + parser->F)
+/** machine **/
+%%{
+  machine http_parser;
+  
+  action mark {MARK(mark, fpc); }
+  
+  action start_field { MARK(field_start, fpc); }
+  action write_field { 
+    parser->field_len = LEN(field_start, fpc);
+    if(parser->field_len > 256) {
+      parser->overflow_error = TRUE;
+      fbreak;
+    }
+  }
+  
+  action start_value { MARK(mark, fpc); }
+  action write_value {
+    if(LEN(mark, fpc) > 80 * 1024) { parser->overflow_error = TRUE; fbreak; }
+    if(parser->http_field != NULL) {
+      parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc));
+    }
+  }
+  
+  action content_length {
+    if(!apply_element(parser, MONGREL_CONTENT_LENGTH, PTR_TO(mark), fpc, 20))
+      fbreak;
+    set_content_length(parser, PTR_TO(mark), LEN(mark, fpc));
+  }
+  
+  action content_type {
+    if(!apply_element(parser, MONGREL_CONTENT_TYPE, PTR_TO(mark), fpc, 10*1024))
+      fbreak;
+  }
+  
+  action fragment {
+    if(!apply_element(parser, MONGREL_FRAGMENT, PTR_TO(mark), fpc, 10*1024))
+      fbreak;
+  }
+  
+  action http_version {
+    if(!apply_element(parser, MONGREL_HTTP_VERSION, PTR_TO(mark), fpc, 10))
+      fbreak;
+  }
+  
+  action request_path {
+    if(!apply_element(parser, MONGREL_REQUEST_PATH, PTR_TO(mark), fpc, 1024))
+      fbreak;
+  }
+  
+  action request_method {
+    if(!apply_element(parser, MONGREL_REQUEST_METHOD, PTR_TO(mark), fpc, 1024))
+      fbreak;
+  }
+  
+  action request_uri {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), fpc, 12*1024))
+      fbreak;
+  }
+  
+  action start_query {MARK(query_start, fpc); }
+  action query_string {
+    if(!apply_element(parser, MONGREL_QUERY_STRING, PTR_TO(query_start), fpc, 10*1024))
+      fbreak;
+  }
+  
+  action done {
+    parser->body_start = fpc - buffer + 1;
+    fbreak;
+  }
+
+#### HTTP PROTOCOL GRAMMAR
+# line endings
+  CRLF = "\r\n";
+
+# character types
+  CTL = (cntrl | 127);
+  safe = ("$" | "-" | "_" | ".");
+  extra = ("!" | "*" | "'" | "(" | ")" | ",");
+  reserved = (";" | "/" | "?" | ":" | "@" | "&" | "=" | "+");
+  unsafe = (CTL | " " | "\"" | "#" | "%" | "<" | ">");
+  national = any -- (alpha | digit | reserved | extra | safe | unsafe);
+  unreserved = (alpha | digit | safe | extra | national);
+  escape = ("%" xdigit xdigit);
+  uchar = (unreserved | escape);
+  pchar = (uchar | ":" | "@" | "&" | "=" | "+");
+  tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\"" | "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t");
+
+# elements
+  token = (ascii -- (CTL | tspecials));
+
+# URI schemes and absolute paths
+  scheme = ( alpha | digit | "+" | "-" | "." )* ;
+  absolute_uri = (scheme ":" (uchar | reserved )*);
+
+  path = ( pchar+ ( "/" pchar* )* ) ;
+  query = ( uchar | reserved )* %query_string ;
+  param = ( pchar | "/" )* ;
+  params = ( param ( ";" param )* ) ;
+  rel_path = ( path? %request_path (";" params)? ) ("?" %start_query query)?;
+  absolute_path = ( "/"+ rel_path );
+
+  Request_URI = ( "*" | absolute_uri | absolute_path ) >mark %request_uri;
+  Fragment = ( uchar | reserved )* >mark %fragment;
+  Method = ( upper | digit | safe ){1,20} >mark %request_method;
+
+  http_number = ( digit+ "." digit+ ) ;
+  HTTP_Version = ( "HTTP/" http_number ) >mark %http_version ;
+  Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " " HTTP_Version CRLF ) ;
+
+  field_name = ( token -- ":" )+ >start_field %write_field;
+
+  field_value = any* >start_value %write_value;
+  
+  known_headers = ( ("Content-Length:"i " "* (digit+ >mark %content_length))
+                  | ("Content-Type:"i " "* (any* >mark %content_type))
+                  ) :> CRLF;
+  unknown_header = (field_name ":" " "* field_value :> CRLF) -- known_headers;
+  
+  Request = Request_Line (known_headers | unknown_header)* ( CRLF @done );
+
+main := Request;
+
+}%%
+
+/** Data **/
+%% write data;
+
+/* returns TRUE if applied, FALSE if there was an error */
+static int apply_element(http_parser *parser, int type, const char *begin, const char *end, int max_length)
+{
+  int len = (int)(end-begin);
+  if(len > max_length) {
+    parser->overflow_error = TRUE;
+    return FALSE;
+  }
+  if(parser->on_element)
+    parser->on_element(parser->data, type, begin, len);
+  return TRUE;
+}
+
+static void set_content_length(http_parser *parser, const char *at, int length)
+{
+  /* atoi_length - why isn't this in the statndard library? i hate c */
+  assert(parser->content_length == 0);
+  int i, mult;
+  for(mult=1, i=length-1; i>=0; i--, mult*=10)
+    parser->content_length += (at[i] - '0') * mult;
+}
+
+void http_parser_init(http_parser *parser)  {
+  int cs = 0;
+  %% write init;
+  parser->cs = cs;
+  parser->overflow_error = FALSE;
+  parser->body_start = 0;
+  parser->content_length = 0;
+  parser->mark = 0;
+  parser->nread = 0;
+  parser->field_len = 0;
+  parser->field_start = 0;
+  parser->data = NULL;
+  parser->http_field = NULL;
+}
+
+
+/** 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;
+  
+  /* Ragel 6 does not require this */
+  // assert(*pe == '\0' && "pointer does not end on NUL");
+  assert(pe - p == len - off && "pointers aren't same distance");
+  
+  %% write exec;
+  
+  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");
+  
+  if(parser->nread > 1024 * (80 + 32))
+    parser->overflow_error = TRUE;
+  
+  
+  /* Ragel 6 does not use write eof; no need for this
+  if(parser->body_start) {
+    // final \r\n combo encountered so stop right here 
+    parser->nread++;
+    %% write eof;
+  }
+  */
+  
+  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 || parser->overflow_error;
+}
+
+int http_parser_is_finished(http_parser *parser) {
+  return parser->cs >= http_parser_first_final;
+}
diff --git a/parser.c b/parser.c
new file mode 100644 (file)
index 0000000..d30253c
--- /dev/null
+++ b/parser.c
@@ -0,0 +1,2860 @@
+#line 1 "src/parser.rl"
+/**
+ * Copyright (c) 2005 Zed A. Shaw
+ * You can redistribute it and/or modify it under the same terms as Ruby.
+ */
+#include "parser.h"
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#define TRUE 1
+#define FALSE 0
+#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 139 "src/parser.rl"
+
+
+/** Data **/
+
+#line 25 "src/parser.c"
+static const int http_parser_start = 1;
+static const int http_parser_first_final = 118;
+static const int http_parser_error = 0;
+
+static const int http_parser_en_main = 1;
+
+#line 143 "src/parser.rl"
+
+/* returns TRUE if applied, FALSE if there was an error */
+static int apply_element(http_parser *parser, int type, const char *begin, const char *end, int max_length)
+{
+  int len = (int)(end-begin);
+  if(len > max_length) {
+    parser->overflow_error = TRUE;
+    return FALSE;
+  }
+  if(parser->on_element)
+    parser->on_element(parser->data, type, begin, len);
+  return TRUE;
+}
+
+static void set_content_length(http_parser *parser, const char *at, int length)
+{
+  /* atoi_length - why isn't this in the statndard library? i hate c */
+  assert(parser->content_length == 0);
+  int i, mult;
+  for(mult=1, i=length-1; i>=0; i--, mult*=10)
+    parser->content_length += (at[i] - '0') * mult;
+}
+
+void http_parser_init(http_parser *parser)  {
+  int cs = 0;
+  
+#line 59 "src/parser.c"
+       {
+       cs = http_parser_start;
+       }
+#line 169 "src/parser.rl"
+  parser->cs = cs;
+  parser->overflow_error = FALSE;
+  parser->body_start = 0;
+  parser->content_length = 0;
+  parser->mark = 0;
+  parser->nread = 0;
+  parser->field_len = 0;
+  parser->field_start = 0;
+  parser->data = NULL;
+  parser->http_field = NULL;
+}
+
+
+/** 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;
+  
+  /* Ragel 6 does not require this */
+  // assert(*pe == '\0' && "pointer does not end on NUL");
+  assert(pe - p == len - off && "pointers aren't same distance");
+  
+  
+#line 92 "src/parser.c"
+       {
+       if ( p == pe )
+               goto _test_eof;
+       switch ( cs )
+       {
+case 1:
+       switch( (*p) ) {
+               case 36: goto tr0;
+               case 95: goto tr0;
+       }
+       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:
+cs = 0;
+       goto _out;
+tr0:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st2;
+st2:
+       if ( ++p == pe )
+               goto _test_eof2;
+case 2:
+#line 123 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st99;
+               case 95: goto st99;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st99;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st99;
+       } else
+               goto st99;
+       goto st0;
+tr2:
+#line 66 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_METHOD, PTR_TO(mark), p, 1024))
+      {p++; cs = 3; goto _out;}
+  }
+       goto st3;
+st3:
+       if ( ++p == pe )
+               goto _test_eof3;
+case 3:
+#line 149 "src/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 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st4;
+st4:
+       if ( ++p == pe )
+               goto _test_eof4;
+case 4:
+#line 173 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr8;
+               case 35: goto tr9;
+       }
+       goto st0;
+tr8:
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 5; goto _out;}
+  }
+       goto st5;
+tr103:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+#line 51 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_FRAGMENT, PTR_TO(mark), p, 10*1024))
+      {p++; cs = 5; goto _out;}
+  }
+       goto st5;
+tr106:
+#line 51 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_FRAGMENT, PTR_TO(mark), p, 10*1024))
+      {p++; cs = 5; goto _out;}
+  }
+       goto st5;
+tr114:
+#line 61 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_PATH, PTR_TO(mark), p, 1024))
+      {p++; cs = 5; goto _out;}
+  }
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 5; goto _out;}
+  }
+       goto st5;
+tr125:
+#line 76 "src/parser.rl"
+       {MARK(query_start, p); }
+#line 77 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_QUERY_STRING, PTR_TO(query_start), p, 10*1024))
+      {p++; cs = 5; goto _out;}
+  }
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 5; goto _out;}
+  }
+       goto st5;
+tr129:
+#line 77 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_QUERY_STRING, PTR_TO(query_start), p, 10*1024))
+      {p++; cs = 5; goto _out;}
+  }
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 5; goto _out;}
+  }
+       goto st5;
+st5:
+       if ( ++p == pe )
+               goto _test_eof5;
+case 5:
+#line 244 "src/parser.c"
+       if ( (*p) == 72 )
+               goto tr10;
+       goto st0;
+tr10:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st6;
+st6:
+       if ( ++p == pe )
+               goto _test_eof6;
+case 6:
+#line 256 "src/parser.c"
+       if ( (*p) == 84 )
+               goto st7;
+       goto st0;
+st7:
+       if ( ++p == pe )
+               goto _test_eof7;
+case 7:
+       if ( (*p) == 84 )
+               goto st8;
+       goto st0;
+st8:
+       if ( ++p == pe )
+               goto _test_eof8;
+case 8:
+       if ( (*p) == 80 )
+               goto st9;
+       goto st0;
+st9:
+       if ( ++p == pe )
+               goto _test_eof9;
+case 9:
+       if ( (*p) == 47 )
+               goto st10;
+       goto st0;
+st10:
+       if ( ++p == pe )
+               goto _test_eof10;
+case 10:
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st11;
+       goto st0;
+st11:
+       if ( ++p == pe )
+               goto _test_eof11;
+case 11:
+       if ( (*p) == 46 )
+               goto st12;
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st11;
+       goto st0;
+st12:
+       if ( ++p == pe )
+               goto _test_eof12;
+case 12:
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st13;
+       goto st0;
+st13:
+       if ( ++p == pe )
+               goto _test_eof13;
+case 13:
+       if ( (*p) == 13 )
+               goto tr18;
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st13;
+       goto st0;
+tr18:
+#line 56 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_HTTP_VERSION, PTR_TO(mark), p, 10))
+      {p++; cs = 14; goto _out;}
+  }
+       goto st14;
+tr28:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+#line 33 "src/parser.rl"
+       {
+    if(LEN(mark, p) > 80 * 1024) { parser->overflow_error = TRUE; {p++; cs = 14; goto _out;} }
+    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;
+tr32:
+#line 33 "src/parser.rl"
+       {
+    if(LEN(mark, p) > 80 * 1024) { parser->overflow_error = TRUE; {p++; cs = 14; goto _out;} }
+    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;
+tr91:
+#line 40 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_CONTENT_LENGTH, PTR_TO(mark), p, 20))
+      {p++; cs = 14; goto _out;}
+    set_content_length(parser, PTR_TO(mark), LEN(mark, p));
+  }
+       goto st14;
+tr98:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+#line 46 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_CONTENT_TYPE, PTR_TO(mark), p, 10*1024))
+      {p++; cs = 14; goto _out;}
+  }
+       goto st14;
+tr101:
+#line 46 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_CONTENT_TYPE, PTR_TO(mark), p, 10*1024))
+      {p++; cs = 14; goto _out;}
+  }
+       goto st14;
+st14:
+       if ( ++p == pe )
+               goto _test_eof14;
+case 14:
+#line 368 "src/parser.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 tr21;
+               case 67: goto tr22;
+               case 99: goto tr22;
+               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 _test_eof16;
+case 16:
+       if ( (*p) == 10 )
+               goto tr23;
+       goto st0;
+tr23:
+#line 82 "src/parser.rl"
+       {
+    parser->body_start = p - buffer + 1;
+    {p++; cs = 118; goto _out;}
+  }
+       goto st118;
+st118:
+       if ( ++p == pe )
+               goto _test_eof118;
+case 118:
+#line 420 "src/parser.c"
+       goto st0;
+tr21:
+#line 23 "src/parser.rl"
+       { MARK(field_start, p); }
+       goto st17;
+st17:
+       if ( ++p == pe )
+               goto _test_eof17;
+case 17:
+#line 430 "src/parser.c"
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 99: goto st40;
+               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;
+tr25:
+#line 24 "src/parser.rl"
+       { 
+    parser->field_len = LEN(field_start, p);
+    if(parser->field_len > 256) {
+      parser->overflow_error = TRUE;
+      {p++; cs = 18; goto _out;}
+    }
+  }
+       goto st18;
+tr29:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+       goto st18;
+st18:
+       if ( ++p == pe )
+               goto _test_eof18;
+case 18:
+#line 475 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr28;
+               case 32: goto tr29;
+               case 67: goto tr30;
+               case 99: goto tr30;
+       }
+       goto tr27;
+tr27:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+       goto st19;
+st19:
+       if ( ++p == pe )
+               goto _test_eof19;
+case 19:
+#line 491 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       goto st19;
+tr30:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+       goto st20;
+st20:
+       if ( ++p == pe )
+               goto _test_eof20;
+case 20:
+#line 506 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 79: goto st21;
+               case 99: goto st20;
+               case 111: goto st21;
+       }
+       goto st19;
+st21:
+       if ( ++p == pe )
+               goto _test_eof21;
+case 21:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 78: goto st22;
+               case 99: goto st20;
+               case 110: goto st22;
+       }
+       goto st19;
+st22:
+       if ( ++p == pe )
+               goto _test_eof22;
+case 22:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 84: goto st23;
+               case 99: goto st20;
+               case 116: goto st23;
+       }
+       goto st19;
+st23:
+       if ( ++p == pe )
+               goto _test_eof23;
+case 23:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 69: goto st24;
+               case 99: goto st20;
+               case 101: goto st24;
+       }
+       goto st19;
+st24:
+       if ( ++p == pe )
+               goto _test_eof24;
+case 24:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 78: goto st25;
+               case 99: goto st20;
+               case 110: goto st25;
+       }
+       goto st19;
+st25:
+       if ( ++p == pe )
+               goto _test_eof25;
+case 25:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 84: goto st26;
+               case 99: goto st20;
+               case 116: goto st26;
+       }
+       goto st19;
+st26:
+       if ( ++p == pe )
+               goto _test_eof26;
+case 26:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 45: goto st27;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       goto st19;
+st27:
+       if ( ++p == pe )
+               goto _test_eof27;
+case 27:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 76: goto st28;
+               case 84: goto st36;
+               case 99: goto st20;
+               case 108: goto st28;
+               case 116: goto st36;
+       }
+       goto st19;
+st28:
+       if ( ++p == pe )
+               goto _test_eof28;
+case 28:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 69: goto st29;
+               case 99: goto st20;
+               case 101: goto st29;
+       }
+       goto st19;
+st29:
+       if ( ++p == pe )
+               goto _test_eof29;
+case 29:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 78: goto st30;
+               case 99: goto st20;
+               case 110: goto st30;
+       }
+       goto st19;
+st30:
+       if ( ++p == pe )
+               goto _test_eof30;
+case 30:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 71: goto st31;
+               case 99: goto st20;
+               case 103: goto st31;
+       }
+       goto st19;
+st31:
+       if ( ++p == pe )
+               goto _test_eof31;
+case 31:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 84: goto st32;
+               case 99: goto st20;
+               case 116: goto st32;
+       }
+       goto st19;
+st32:
+       if ( ++p == pe )
+               goto _test_eof32;
+case 32:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 72: goto st33;
+               case 99: goto st20;
+               case 104: goto st33;
+       }
+       goto st19;
+st33:
+       if ( ++p == pe )
+               goto _test_eof33;
+case 33:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 58: goto st34;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       goto st19;
+st34:
+       if ( ++p == pe )
+               goto _test_eof34;
+case 34:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 32: goto st34;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto tr49;
+       goto st19;
+tr49:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st35;
+tr70:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st35;
+st35:
+       if ( ++p == pe )
+               goto _test_eof35;
+case 35:
+#line 698 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto st0;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st35;
+       goto st19;
+st36:
+       if ( ++p == pe )
+               goto _test_eof36;
+case 36:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 89: goto st37;
+               case 99: goto st20;
+               case 121: goto st37;
+       }
+       goto st19;
+st37:
+       if ( ++p == pe )
+               goto _test_eof37;
+case 37:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 80: goto st38;
+               case 99: goto st20;
+               case 112: goto st38;
+       }
+       goto st19;
+st38:
+       if ( ++p == pe )
+               goto _test_eof38;
+case 38:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 67: goto st20;
+               case 69: goto st39;
+               case 99: goto st20;
+               case 101: goto st39;
+       }
+       goto st19;
+st39:
+       if ( ++p == pe )
+               goto _test_eof39;
+case 39:
+       switch( (*p) ) {
+               case 13: goto tr32;
+               case 58: goto st0;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       goto st19;
+st40:
+       if ( ++p == pe )
+               goto _test_eof40;
+case 40:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 79: goto st41;
+               case 99: goto st40;
+               case 111: goto st41;
+               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;
+st41:
+       if ( ++p == pe )
+               goto _test_eof41;
+case 41:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 78: goto st42;
+               case 99: goto st40;
+               case 110: goto st42;
+               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;
+st42:
+       if ( ++p == pe )
+               goto _test_eof42;
+case 42:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 84: goto st43;
+               case 99: goto st40;
+               case 116: goto st43;
+               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;
+st43:
+       if ( ++p == pe )
+               goto _test_eof43;
+case 43:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 69: goto st44;
+               case 99: goto st40;
+               case 101: goto st44;
+               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;
+st44:
+       if ( ++p == pe )
+               goto _test_eof44;
+case 44:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 78: goto st45;
+               case 99: goto st40;
+               case 110: goto st45;
+               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;
+st45:
+       if ( ++p == pe )
+               goto _test_eof45;
+case 45:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 84: goto st46;
+               case 99: goto st40;
+               case 116: goto st46;
+               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;
+st46:
+       if ( ++p == pe )
+               goto _test_eof46;
+case 46:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 45: goto st47;
+               case 46: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 99: goto st40;
+               case 124: goto st17;
+               case 126: goto st17;
+       }
+       if ( (*p) < 48 ) {
+               if ( (*p) > 39 ) {
+                       if ( 42 <= (*p) && (*p) <= 43 )
+                               goto st17;
+               } else if ( (*p) >= 35 )
+                       goto st17;
+       } else if ( (*p) > 57 ) {
+               if ( (*p) > 90 ) {
+                       if ( 94 <= (*p) && (*p) <= 122 )
+                               goto st17;
+               } else if ( (*p) >= 65 )
+                       goto st17;
+       } else
+               goto st17;
+       goto st0;
+st47:
+       if ( ++p == pe )
+               goto _test_eof47;
+case 47:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 76: goto st48;
+               case 84: goto st55;
+               case 99: goto st40;
+               case 108: goto st48;
+               case 116: goto st55;
+               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;
+st48:
+       if ( ++p == pe )
+               goto _test_eof48;
+case 48:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 69: goto st49;
+               case 99: goto st40;
+               case 101: goto st49;
+               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;
+st49:
+       if ( ++p == pe )
+               goto _test_eof49;
+case 49:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 78: goto st50;
+               case 99: goto st40;
+               case 110: goto st50;
+               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;
+st50:
+       if ( ++p == pe )
+               goto _test_eof50;
+case 50:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 71: goto st51;
+               case 99: goto st40;
+               case 103: goto st51;
+               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;
+st51:
+       if ( ++p == pe )
+               goto _test_eof51;
+case 51:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 84: goto st52;
+               case 99: goto st40;
+               case 116: goto st52;
+               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;
+st52:
+       if ( ++p == pe )
+               goto _test_eof52;
+case 52:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 72: goto st53;
+               case 99: goto st40;
+               case 104: goto st53;
+               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;
+st53:
+       if ( ++p == pe )
+               goto _test_eof53;
+case 53:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr68;
+               case 67: goto st40;
+               case 99: goto st40;
+               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;
+tr68:
+#line 24 "src/parser.rl"
+       { 
+    parser->field_len = LEN(field_start, p);
+    if(parser->field_len > 256) {
+      parser->overflow_error = TRUE;
+      {p++; cs = 54; goto _out;}
+    }
+  }
+       goto st54;
+tr69:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+       goto st54;
+st54:
+       if ( ++p == pe )
+               goto _test_eof54;
+case 54:
+#line 1217 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr28;
+               case 32: goto tr69;
+               case 67: goto tr30;
+               case 99: goto tr30;
+       }
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto tr70;
+       goto tr27;
+st55:
+       if ( ++p == pe )
+               goto _test_eof55;
+case 55:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 89: goto st56;
+               case 99: goto st40;
+               case 121: goto st56;
+               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;
+st56:
+       if ( ++p == pe )
+               goto _test_eof56;
+case 56:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 80: goto st57;
+               case 99: goto st40;
+               case 112: goto st57;
+               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;
+st57:
+       if ( ++p == pe )
+               goto _test_eof57;
+case 57:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 69: goto st58;
+               case 99: goto st40;
+               case 101: goto st58;
+               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;
+st58:
+       if ( ++p == pe )
+               goto _test_eof58;
+case 58:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 67: goto st40;
+               case 99: goto st40;
+               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;
+tr22:
+#line 23 "src/parser.rl"
+       { MARK(field_start, p); }
+       goto st59;
+st59:
+       if ( ++p == pe )
+               goto _test_eof59;
+case 59:
+#line 1360 "src/parser.c"
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 79: goto st60;
+               case 99: goto st40;
+               case 111: goto st60;
+               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;
+st60:
+       if ( ++p == pe )
+               goto _test_eof60;
+case 60:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 78: goto st61;
+               case 99: goto st40;
+               case 110: goto st61;
+               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;
+st61:
+       if ( ++p == pe )
+               goto _test_eof61;
+case 61:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 84: goto st62;
+               case 99: goto st40;
+               case 116: goto st62;
+               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;
+st62:
+       if ( ++p == pe )
+               goto _test_eof62;
+case 62:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 69: goto st63;
+               case 99: goto st40;
+               case 101: goto st63;
+               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;
+st63:
+       if ( ++p == pe )
+               goto _test_eof63;
+case 63:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 78: goto st64;
+               case 99: goto st40;
+               case 110: goto st64;
+               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;
+st64:
+       if ( ++p == pe )
+               goto _test_eof64;
+case 64:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 84: goto st65;
+               case 99: goto st40;
+               case 116: goto st65;
+               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;
+st65:
+       if ( ++p == pe )
+               goto _test_eof65;
+case 65:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 45: goto st66;
+               case 46: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 99: goto st40;
+               case 124: goto st17;
+               case 126: goto st17;
+       }
+       if ( (*p) < 48 ) {
+               if ( (*p) > 39 ) {
+                       if ( 42 <= (*p) && (*p) <= 43 )
+                               goto st17;
+               } else if ( (*p) >= 35 )
+                       goto st17;
+       } else if ( (*p) > 57 ) {
+               if ( (*p) > 90 ) {
+                       if ( 94 <= (*p) && (*p) <= 122 )
+                               goto st17;
+               } else if ( (*p) >= 65 )
+                       goto st17;
+       } else
+               goto st17;
+       goto st0;
+st66:
+       if ( ++p == pe )
+               goto _test_eof66;
+case 66:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 76: goto st67;
+               case 84: goto st75;
+               case 99: goto st40;
+               case 108: goto st67;
+               case 116: goto st75;
+               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;
+st67:
+       if ( ++p == pe )
+               goto _test_eof67;
+case 67:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 69: goto st68;
+               case 99: goto st40;
+               case 101: goto st68;
+               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;
+st68:
+       if ( ++p == pe )
+               goto _test_eof68;
+case 68:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 78: goto st69;
+               case 99: goto st40;
+               case 110: goto st69;
+               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;
+st69:
+       if ( ++p == pe )
+               goto _test_eof69;
+case 69:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 71: goto st70;
+               case 99: goto st40;
+               case 103: goto st70;
+               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;
+st70:
+       if ( ++p == pe )
+               goto _test_eof70;
+case 70:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 84: goto st71;
+               case 99: goto st40;
+               case 116: goto st71;
+               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;
+st71:
+       if ( ++p == pe )
+               goto _test_eof71;
+case 71:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 72: goto st72;
+               case 99: goto st40;
+               case 104: goto st72;
+               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;
+st72:
+       if ( ++p == pe )
+               goto _test_eof72;
+case 72:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr88;
+               case 67: goto st40;
+               case 99: goto st40;
+               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;
+tr88:
+#line 24 "src/parser.rl"
+       { 
+    parser->field_len = LEN(field_start, p);
+    if(parser->field_len > 256) {
+      parser->overflow_error = TRUE;
+      {p++; cs = 73; goto _out;}
+    }
+  }
+       goto st73;
+tr89:
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+       goto st73;
+st73:
+       if ( ++p == pe )
+               goto _test_eof73;
+case 73:
+#line 1820 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr28;
+               case 32: goto tr89;
+               case 67: goto tr30;
+               case 99: goto tr30;
+       }
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto tr90;
+       goto tr27;
+tr90:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+#line 32 "src/parser.rl"
+       { MARK(mark, p); }
+       goto st74;
+st74:
+       if ( ++p == pe )
+               goto _test_eof74;
+case 74:
+#line 1840 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr91;
+               case 67: goto st20;
+               case 99: goto st20;
+       }
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st74;
+       goto st19;
+st75:
+       if ( ++p == pe )
+               goto _test_eof75;
+case 75:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 89: goto st76;
+               case 99: goto st40;
+               case 121: goto st76;
+               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;
+st76:
+       if ( ++p == pe )
+               goto _test_eof76;
+case 76:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 80: goto st77;
+               case 99: goto st40;
+               case 112: goto st77;
+               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;
+st77:
+       if ( ++p == pe )
+               goto _test_eof77;
+case 77:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto tr25;
+               case 67: goto st40;
+               case 69: goto st78;
+               case 99: goto st40;
+               case 101: goto st78;
+               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;
+st78:
+       if ( ++p == pe )
+               goto _test_eof78;
+case 78:
+       switch( (*p) ) {
+               case 33: goto st17;
+               case 58: goto st79;
+               case 67: goto st40;
+               case 99: goto st40;
+               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;
+tr99:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st79;
+st79:
+       if ( ++p == pe )
+               goto _test_eof79;
+case 79:
+#line 1983 "src/parser.c"
+       switch( (*p) ) {
+               case 13: goto tr98;
+               case 32: goto tr99;
+       }
+       goto tr97;
+tr97:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st80;
+st80:
+       if ( ++p == pe )
+               goto _test_eof80;
+case 80:
+#line 1997 "src/parser.c"
+       if ( (*p) == 13 )
+               goto tr101;
+       goto st80;
+tr9:
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 81; goto _out;}
+  }
+       goto st81;
+tr115:
+#line 61 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_PATH, PTR_TO(mark), p, 1024))
+      {p++; cs = 81; goto _out;}
+  }
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 81; goto _out;}
+  }
+       goto st81;
+tr126:
+#line 76 "src/parser.rl"
+       {MARK(query_start, p); }
+#line 77 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_QUERY_STRING, PTR_TO(query_start), p, 10*1024))
+      {p++; cs = 81; goto _out;}
+  }
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 81; goto _out;}
+  }
+       goto st81;
+tr130:
+#line 77 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_QUERY_STRING, PTR_TO(query_start), p, 10*1024))
+      {p++; cs = 81; goto _out;}
+  }
+#line 71 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_URI, PTR_TO(mark), p, 12*1024))
+      {p++; cs = 81; goto _out;}
+  }
+       goto st81;
+st81:
+       if ( ++p == pe )
+               goto _test_eof81;
+case 81:
+#line 2050 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr103;
+               case 37: goto tr104;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 127: goto st0;
+       }
+       if ( (*p) > 31 ) {
+               if ( 34 <= (*p) && (*p) <= 35 )
+                       goto st0;
+       } else if ( (*p) >= 0 )
+               goto st0;
+       goto tr102;
+tr102:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st82;
+st82:
+       if ( ++p == pe )
+               goto _test_eof82;
+case 82:
+#line 2072 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr106;
+               case 37: goto st83;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 127: goto st0;
+       }
+       if ( (*p) > 31 ) {
+               if ( 34 <= (*p) && (*p) <= 35 )
+                       goto st0;
+       } else if ( (*p) >= 0 )
+               goto st0;
+       goto st82;
+tr104:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st83;
+st83:
+       if ( ++p == pe )
+               goto _test_eof83;
+case 83:
+#line 2094 "src/parser.c"
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st84;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st84;
+       } else
+               goto st84;
+       goto st0;
+st84:
+       if ( ++p == pe )
+               goto _test_eof84;
+case 84:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st82;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st82;
+       } else
+               goto st82;
+       goto st0;
+tr5:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st85;
+st85:
+       if ( ++p == pe )
+               goto _test_eof85;
+case 85:
+#line 2125 "src/parser.c"
+       switch( (*p) ) {
+               case 43: goto st85;
+               case 58: goto st86;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st85;
+       } else if ( (*p) > 57 ) {
+               if ( (*p) > 90 ) {
+                       if ( 97 <= (*p) && (*p) <= 122 )
+                               goto st85;
+               } else if ( (*p) >= 65 )
+                       goto st85;
+       } else
+               goto st85;
+       goto st0;
+tr7:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st86;
+st86:
+       if ( ++p == pe )
+               goto _test_eof86;
+case 86:
+#line 2150 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr8;
+               case 34: goto st0;
+               case 35: goto tr9;
+               case 37: goto st87;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 127: goto st0;
+       }
+       if ( 0 <= (*p) && (*p) <= 31 )
+               goto st0;
+       goto st86;
+st87:
+       if ( ++p == pe )
+               goto _test_eof87;
+case 87:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st88;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st88;
+       } else
+               goto st88;
+       goto st0;
+st88:
+       if ( ++p == pe )
+               goto _test_eof88;
+case 88:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st86;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st86;
+       } else
+               goto st86;
+       goto st0;
+tr6:
+#line 21 "src/parser.rl"
+       {MARK(mark, p); }
+       goto st89;
+st89:
+       if ( ++p == pe )
+               goto _test_eof89;
+case 89:
+#line 2197 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr114;
+               case 34: goto st0;
+               case 35: goto tr115;
+               case 37: goto st90;
+               case 59: goto tr117;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 63: goto tr118;
+               case 127: goto st0;
+       }
+       if ( 0 <= (*p) && (*p) <= 31 )
+               goto st0;
+       goto st89;
+st90:
+       if ( ++p == pe )
+               goto _test_eof90;
+case 90:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st91;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st91;
+       } else
+               goto st91;
+       goto st0;
+st91:
+       if ( ++p == pe )
+               goto _test_eof91;
+case 91:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st89;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st89;
+       } else
+               goto st89;
+       goto st0;
+tr117:
+#line 61 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_PATH, PTR_TO(mark), p, 1024))
+      {p++; cs = 92; goto _out;}
+  }
+       goto st92;
+st92:
+       if ( ++p == pe )
+               goto _test_eof92;
+case 92:
+#line 2249 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr8;
+               case 34: goto st0;
+               case 35: goto tr9;
+               case 37: goto st93;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 63: goto st95;
+               case 127: goto st0;
+       }
+       if ( 0 <= (*p) && (*p) <= 31 )
+               goto st0;
+       goto st92;
+st93:
+       if ( ++p == pe )
+               goto _test_eof93;
+case 93:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st94;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st94;
+       } else
+               goto st94;
+       goto st0;
+st94:
+       if ( ++p == pe )
+               goto _test_eof94;
+case 94:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st92;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st92;
+       } else
+               goto st92;
+       goto st0;
+tr118:
+#line 61 "src/parser.rl"
+       {
+    if(!apply_element(parser, MONGREL_REQUEST_PATH, PTR_TO(mark), p, 1024))
+      {p++; cs = 95; goto _out;}
+  }
+       goto st95;
+st95:
+       if ( ++p == pe )
+               goto _test_eof95;
+case 95:
+#line 2300 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr125;
+               case 34: goto st0;
+               case 35: goto tr126;
+               case 37: goto tr127;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 127: goto st0;
+       }
+       if ( 0 <= (*p) && (*p) <= 31 )
+               goto st0;
+       goto tr124;
+tr124:
+#line 76 "src/parser.rl"
+       {MARK(query_start, p); }
+       goto st96;
+st96:
+       if ( ++p == pe )
+               goto _test_eof96;
+case 96:
+#line 2321 "src/parser.c"
+       switch( (*p) ) {
+               case 32: goto tr129;
+               case 34: goto st0;
+               case 35: goto tr130;
+               case 37: goto st97;
+               case 60: goto st0;
+               case 62: goto st0;
+               case 127: goto st0;
+       }
+       if ( 0 <= (*p) && (*p) <= 31 )
+               goto st0;
+       goto st96;
+tr127:
+#line 76 "src/parser.rl"
+       {MARK(query_start, p); }
+       goto st97;
+st97:
+       if ( ++p == pe )
+               goto _test_eof97;
+case 97:
+#line 2342 "src/parser.c"
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st98;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st98;
+       } else
+               goto st98;
+       goto st0;
+st98:
+       if ( ++p == pe )
+               goto _test_eof98;
+case 98:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st96;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st96;
+       } else
+               goto st96;
+       goto st0;
+st99:
+       if ( ++p == pe )
+               goto _test_eof99;
+case 99:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st100;
+               case 95: goto st100;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st100;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st100;
+       } else
+               goto st100;
+       goto st0;
+st100:
+       if ( ++p == pe )
+               goto _test_eof100;
+case 100:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st101;
+               case 95: goto st101;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st101;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st101;
+       } else
+               goto st101;
+       goto st0;
+st101:
+       if ( ++p == pe )
+               goto _test_eof101;
+case 101:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st102;
+               case 95: goto st102;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st102;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st102;
+       } else
+               goto st102;
+       goto st0;
+st102:
+       if ( ++p == pe )
+               goto _test_eof102;
+case 102:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st103;
+               case 95: goto st103;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st103;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st103;
+       } else
+               goto st103;
+       goto st0;
+st103:
+       if ( ++p == pe )
+               goto _test_eof103;
+case 103:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st104;
+               case 95: goto st104;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st104;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st104;
+       } else
+               goto st104;
+       goto st0;
+st104:
+       if ( ++p == pe )
+               goto _test_eof104;
+case 104:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st105;
+               case 95: goto st105;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st105;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st105;
+       } else
+               goto st105;
+       goto st0;
+st105:
+       if ( ++p == pe )
+               goto _test_eof105;
+case 105:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st106;
+               case 95: goto st106;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st106;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st106;
+       } else
+               goto st106;
+       goto st0;
+st106:
+       if ( ++p == pe )
+               goto _test_eof106;
+case 106:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st107;
+               case 95: goto st107;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st107;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st107;
+       } else
+               goto st107;
+       goto st0;
+st107:
+       if ( ++p == pe )
+               goto _test_eof107;
+case 107:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st108;
+               case 95: goto st108;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st108;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st108;
+       } else
+               goto st108;
+       goto st0;
+st108:
+       if ( ++p == pe )
+               goto _test_eof108;
+case 108:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st109;
+               case 95: goto st109;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st109;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st109;
+       } else
+               goto st109;
+       goto st0;
+st109:
+       if ( ++p == pe )
+               goto _test_eof109;
+case 109:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st110;
+               case 95: goto st110;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st110;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st110;
+       } else
+               goto st110;
+       goto st0;
+st110:
+       if ( ++p == pe )
+               goto _test_eof110;
+case 110:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st111;
+               case 95: goto st111;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st111;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st111;
+       } else
+               goto st111;
+       goto st0;
+st111:
+       if ( ++p == pe )
+               goto _test_eof111;
+case 111:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st112;
+               case 95: goto st112;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st112;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st112;
+       } else
+               goto st112;
+       goto st0;
+st112:
+       if ( ++p == pe )
+               goto _test_eof112;
+case 112:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st113;
+               case 95: goto st113;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st113;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st113;
+       } else
+               goto st113;
+       goto st0;
+st113:
+       if ( ++p == pe )
+               goto _test_eof113;
+case 113:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st114;
+               case 95: goto st114;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st114;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st114;
+       } else
+               goto st114;
+       goto st0;
+st114:
+       if ( ++p == pe )
+               goto _test_eof114;
+case 114:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st115;
+               case 95: goto st115;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st115;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st115;
+       } else
+               goto st115;
+       goto st0;
+st115:
+       if ( ++p == pe )
+               goto _test_eof115;
+case 115:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st116;
+               case 95: goto st116;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st116;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st116;
+       } else
+               goto st116;
+       goto st0;
+st116:
+       if ( ++p == pe )
+               goto _test_eof116;
+case 116:
+       switch( (*p) ) {
+               case 32: goto tr2;
+               case 36: goto st117;
+               case 95: goto st117;
+       }
+       if ( (*p) < 48 ) {
+               if ( 45 <= (*p) && (*p) <= 46 )
+                       goto st117;
+       } else if ( (*p) > 57 ) {
+               if ( 65 <= (*p) && (*p) <= 90 )
+                       goto st117;
+       } else
+               goto st117;
+       goto st0;
+st117:
+       if ( ++p == pe )
+               goto _test_eof117;
+case 117:
+       if ( (*p) == 32 )
+               goto tr2;
+       goto st0;
+       }
+       _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_eof118: cs = 118; 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_eof20: cs = 20; goto _test_eof; 
+       _test_eof21: cs = 21; goto _test_eof; 
+       _test_eof22: cs = 22; goto _test_eof; 
+       _test_eof23: cs = 23; goto _test_eof; 
+       _test_eof24: cs = 24; goto _test_eof; 
+       _test_eof25: cs = 25; goto _test_eof; 
+       _test_eof26: cs = 26; goto _test_eof; 
+       _test_eof27: cs = 27; goto _test_eof; 
+       _test_eof28: cs = 28; goto _test_eof; 
+       _test_eof29: cs = 29; goto _test_eof; 
+       _test_eof30: cs = 30; goto _test_eof; 
+       _test_eof31: cs = 31; goto _test_eof; 
+       _test_eof32: cs = 32; goto _test_eof; 
+       _test_eof33: cs = 33; goto _test_eof; 
+       _test_eof34: cs = 34; goto _test_eof; 
+       _test_eof35: cs = 35; goto _test_eof; 
+       _test_eof36: cs = 36; goto _test_eof; 
+       _test_eof37: cs = 37; goto _test_eof; 
+       _test_eof38: cs = 38; goto _test_eof; 
+       _test_eof39: cs = 39; goto _test_eof; 
+       _test_eof40: cs = 40; goto _test_eof; 
+       _test_eof41: cs = 41; goto _test_eof; 
+       _test_eof42: cs = 42; goto _test_eof; 
+       _test_eof43: cs = 43; goto _test_eof; 
+       _test_eof44: cs = 44; goto _test_eof; 
+       _test_eof45: cs = 45; goto _test_eof; 
+       _test_eof46: cs = 46; goto _test_eof; 
+       _test_eof47: cs = 47; goto _test_eof; 
+       _test_eof48: cs = 48; goto _test_eof; 
+       _test_eof49: cs = 49; goto _test_eof; 
+       _test_eof50: cs = 50; goto _test_eof; 
+       _test_eof51: cs = 51; goto _test_eof; 
+       _test_eof52: cs = 52; goto _test_eof; 
+       _test_eof53: cs = 53; goto _test_eof; 
+       _test_eof54: cs = 54; goto _test_eof; 
+       _test_eof55: cs = 55; goto _test_eof; 
+       _test_eof56: cs = 56; goto _test_eof; 
+       _test_eof57: cs = 57; goto _test_eof; 
+       _test_eof58: cs = 58; goto _test_eof; 
+       _test_eof59: cs = 59; goto _test_eof; 
+       _test_eof60: cs = 60; goto _test_eof; 
+       _test_eof61: cs = 61; goto _test_eof; 
+       _test_eof62: cs = 62; goto _test_eof; 
+       _test_eof63: cs = 63; goto _test_eof; 
+       _test_eof64: cs = 64; goto _test_eof; 
+       _test_eof65: cs = 65; goto _test_eof; 
+       _test_eof66: cs = 66; goto _test_eof; 
+       _test_eof67: cs = 67; goto _test_eof; 
+       _test_eof68: cs = 68; goto _test_eof; 
+       _test_eof69: cs = 69; goto _test_eof; 
+       _test_eof70: cs = 70; goto _test_eof; 
+       _test_eof71: cs = 71; goto _test_eof; 
+       _test_eof72: cs = 72; goto _test_eof; 
+       _test_eof73: cs = 73; goto _test_eof; 
+       _test_eof74: cs = 74; goto _test_eof; 
+       _test_eof75: cs = 75; goto _test_eof; 
+       _test_eof76: cs = 76; goto _test_eof; 
+       _test_eof77: cs = 77; goto _test_eof; 
+       _test_eof78: cs = 78; goto _test_eof; 
+       _test_eof79: cs = 79; goto _test_eof; 
+       _test_eof80: cs = 80; goto _test_eof; 
+       _test_eof81: cs = 81; goto _test_eof; 
+       _test_eof82: cs = 82; goto _test_eof; 
+       _test_eof83: cs = 83; goto _test_eof; 
+       _test_eof84: cs = 84; goto _test_eof; 
+       _test_eof85: cs = 85; goto _test_eof; 
+       _test_eof86: cs = 86; goto _test_eof; 
+       _test_eof87: cs = 87; goto _test_eof; 
+       _test_eof88: cs = 88; goto _test_eof; 
+       _test_eof89: cs = 89; goto _test_eof; 
+       _test_eof90: cs = 90; goto _test_eof; 
+       _test_eof91: cs = 91; goto _test_eof; 
+       _test_eof92: cs = 92; goto _test_eof; 
+       _test_eof93: cs = 93; goto _test_eof; 
+       _test_eof94: cs = 94; goto _test_eof; 
+       _test_eof95: cs = 95; goto _test_eof; 
+       _test_eof96: cs = 96; goto _test_eof; 
+       _test_eof97: cs = 97; goto _test_eof; 
+       _test_eof98: cs = 98; goto _test_eof; 
+       _test_eof99: cs = 99; goto _test_eof; 
+       _test_eof100: cs = 100; goto _test_eof; 
+       _test_eof101: cs = 101; goto _test_eof; 
+       _test_eof102: cs = 102; goto _test_eof; 
+       _test_eof103: cs = 103; goto _test_eof; 
+       _test_eof104: cs = 104; goto _test_eof; 
+       _test_eof105: cs = 105; goto _test_eof; 
+       _test_eof106: cs = 106; goto _test_eof; 
+       _test_eof107: cs = 107; goto _test_eof; 
+       _test_eof108: cs = 108; goto _test_eof; 
+       _test_eof109: cs = 109; goto _test_eof; 
+       _test_eof110: cs = 110; goto _test_eof; 
+       _test_eof111: cs = 111; goto _test_eof; 
+       _test_eof112: cs = 112; goto _test_eof; 
+       _test_eof113: cs = 113; goto _test_eof; 
+       _test_eof114: cs = 114; goto _test_eof; 
+       _test_eof115: cs = 115; goto _test_eof; 
+       _test_eof116: cs = 116; goto _test_eof; 
+       _test_eof117: cs = 117; goto _test_eof; 
+
+       _test_eof: {}
+       _out: {}
+       }
+#line 197 "src/parser.rl"
+  
+  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");
+  
+  if(parser->nread > 1024 * (80 + 32))
+    parser->overflow_error = TRUE;
+  
+  
+  /* Ragel 6 does not use write eof; no need for this
+  if(parser->body_start) {
+    // final \r\n combo encountered so stop right here 
+    parser->nread++;
+    %% write eof;
+  }
+  */
+  
+  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 || parser->overflow_error;
+}
+
+int http_parser_is_finished(http_parser *parser) {
+  return parser->cs >= http_parser_first_final;
+}
diff --git a/parser.h b/parser.h
new file mode 100644 (file)
index 0000000..d515281
--- /dev/null
+++ b/parser.h
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2005 Zed A. Shaw
+ * You can redistribute it and/or modify it under the same terms as Ruby.
+ */
+
+#ifndef http11_parser_h
+#define http11_parser_h
+
+#include <sys/types.h>
+
+#if defined(_WIN32)
+#include <stddef.h>
+#endif
+
+enum { MONGREL_CONTENT_LENGTH
+     , MONGREL_CONTENT_TYPE
+     , MONGREL_FRAGMENT
+     , MONGREL_HTTP_VERSION
+     , MONGREL_QUERY_STRING
+     , MONGREL_REQUEST_PATH
+     , MONGREL_REQUEST_METHOD
+     , MONGREL_REQUEST_URI
+     };
+
+typedef void (*field_cb)(void *data, const char *field, size_t flen, const char *value, size_t vlen);
+typedef void (*element_cb)(void *data, int type, const char *at, size_t length);
+
+typedef struct http_parser { 
+  int cs;
+  int overflow_error;
+  size_t body_start;
+  size_t content_length;
+  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 on_element;
+} http_parser;
+
+void http_parser_init(http_parser *parser);
+int http_parser_finish(http_parser *parser);
+size_t http_parser_execute(http_parser *parser, const char *data, size_t len, size_t off);
+int http_parser_has_error(http_parser *parser);
+int http_parser_is_finished(http_parser *parser);
+
+#define http_parser_nread(parser) (parser)->nread 
+
+#endif