about summary refs log tree commit homepage
path: root/ext/http11_java/http11_parser.rl
diff options
context:
space:
mode:
authorevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2007-10-17 07:05:32 +0000
committerevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2007-10-17 07:05:32 +0000
commit594f6fe42cba5b21b67b3492e1835a169b5a6c1d (patch)
tree08a328eec156f1f3144a726ca16814dab2db18f4 /ext/http11_java/http11_parser.rl
parent6d91530c8d0e35b236afb2b4a573def300cf3913 (diff)
downloadunicorn-594f6fe42cba5b21b67b3492e1835a169b5a6c1d.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@674 19e92222-5c0b-0410-8929-a290d50e31e9
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;