about summary refs log tree commit homepage
path: root/ext/http11_java/http11_parser.rl
diff options
context:
space:
mode:
Diffstat (limited to 'ext/http11_java/http11_parser.rl')
-rw-r--r--ext/http11_java/http11_parser.rl53
1 files changed, 52 insertions, 1 deletions
diff --git a/ext/http11_java/http11_parser.rl b/ext/http11_java/http11_parser.rl
index 32dca11..0c67e92 100644
--- a/ext/http11_java/http11_parser.rl
+++ b/ext/http11_java/http11_parser.rl
@@ -3,9 +3,60 @@ package org.jruby.mongrel;
 import org.jruby.util.ByteList;
 
 public class Http11Parser {
-  
+
 /** Machine **/
 
+%%{
+  
+  machine http_parser;
+
+  action mark {parser.mark = fpc; }
+
+  action start_field { parser.field_start = fpc; }
+  action write_field {
+    parser.field_len = fpc-parser.field_start;
+  }
+
+  action start_value { parser.mark = fpc; }
+  action write_value {
+    if(parser.http_field != null) {
+      parser.http_field.call(parser.data, parser.field_start, parser.field_len, parser.mark, fpc-parser.mark);
+    }
+  }
+  action request_method {
+    if(parser.request_method != null)
+      parser.request_method.call(parser.data, parser.mark, fpc-parser.mark);
+  }
+  action request_uri {
+    if(parser.request_uri != null)
+      parser.request_uri.call(parser.data, parser.mark, fpc-parser.mark);
+  }
+
+  action start_query {parser.query_start = fpc; }
+  action query_string {
+    if(parser.query_string != null)
+      parser.query_string.call(parser.data, parser.query_start, fpc-parser.query_start);
+  }
+
+  action http_version {        
+    if(parser.http_version != null)
+      parser.http_version.call(parser.data, parser.mark, fpc-parser.mark);
+  }
+
+  action request_path {
+    if(parser.request_path != null)
+      parser.request_path.call(parser.data, parser.mark, fpc-parser.mark);
+  }
+
+  action done {
+    parser.body_start = fpc + 1;
+    if(parser.header_done != null)
+      parser.header_done.call(parser.data, fpc + 1, pe - fpc - 1);
+    fbreak;
+  }
+
+}%%
+
 /** Data **/
 %% write data;