diff options
author | evanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9> | 2007-10-17 07:05:32 +0000 |
---|---|---|
committer | evanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9> | 2007-10-17 07:05:32 +0000 |
commit | 594f6fe42cba5b21b67b3492e1835a169b5a6c1d (patch) | |
tree | 08a328eec156f1f3144a726ca16814dab2db18f4 /ext/http11_java/http11_parser.rl | |
parent | 6d91530c8d0e35b236afb2b4a573def300cf3913 (diff) | |
download | unicorn-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.rl | 53 |
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; |