about summary refs log tree commit homepage
path: root/ext
diff options
context:
space:
mode:
authorzedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9>2006-02-03 05:42:08 +0000
committerzedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9>2006-02-03 05:42:08 +0000
commit788e4f4902992a9de25f995729b7de713003bcc2 (patch)
tree66705625a27d5dcef9e1e24e01638252988ace1c /ext
parent1b9b3bcb734778037d7bc872e1c4d2290a7415e8 (diff)
downloadunicorn-788e4f4902992a9de25f995729b7de713003bcc2.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@20 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'ext')
-rw-r--r--ext/http11/http11.c19
-rw-r--r--ext/http11/http11_parser.c130
-rw-r--r--ext/http11/http11_parser.h6
-rw-r--r--ext/http11/http11_parser.rl16
4 files changed, 87 insertions, 84 deletions
diff --git a/ext/http11/http11.c b/ext/http11/http11.c
index c01798a..c2659c4 100644
--- a/ext/http11/http11.c
+++ b/ext/http11/http11.c
@@ -13,7 +13,7 @@ static int id_handler_map;
 
 static VALUE global_http_prefix;
 static VALUE global_request_method;
-static VALUE global_path_info;
+static VALUE global_request_uri;
 static VALUE global_query_string;
 static VALUE global_http_version;
 
@@ -45,11 +45,11 @@ void request_method(void *data, const char *at, size_t length)
   rb_hash_aset(req, global_request_method, val);
 }
 
-void path_info(void *data, const char *at, size_t length)
+void request_uri(void *data, const char *at, size_t length)
 {
   VALUE req = (VALUE)data;
   VALUE val = rb_str_new(at, length);
-  rb_hash_aset(req, global_path_info, val);
+  rb_hash_aset(req, global_request_uri, val);
 }
 
 
@@ -87,7 +87,7 @@ VALUE HttpParser_alloc(VALUE klass)
     TRACE();
     hp->http_field = http_field;
     hp->request_method = request_method;
-    hp->path_info = path_info;
+    hp->request_uri = request_uri;
     hp->query_string = query_string;
     hp->http_version = http_version;
     
@@ -279,8 +279,9 @@ VALUE URIClassifier_init(VALUE self)
  *
  * Registers the SampleHandler (one for all requests) with the "/someuri".
  * When URIClassifier::resolve is called with "/someuri" it'll return
- * SampleHandler immediately.  When "/someuri/pathhere" is called it'll
- * find SomeHandler after a second search, and setup PATH_INFO="/pathhere".
+ * SampleHandler immediately.  When called with "/someuri/iwant" it'll also
+ * return SomeHandler immediatly, with no additional searches, but it will
+ * return path info with "/iwant".
  *
  * You actually can reuse this class to register nearly anything and
  * quickly resolve it.  This could be used for caching, fast mapping, etc.
@@ -357,7 +358,7 @@ VALUE URIClassifier_unregister(VALUE self, VALUE uri)
  * It also means that it's very efficient to do this only taking as long as the URI has
  * characters.
  *
- * It expects strings.  Don't try other string-line stuff yet.
+ * It expects strings with no embedded '\0' characters.  Don't try other string-line stuff yet.
  */
 VALUE URIClassifier_resolve(VALUE self, VALUE uri)
 {
@@ -401,8 +402,8 @@ void Init_http11()
   rb_global_variable(&global_http_prefix);
   global_request_method = rb_str_new2("REQUEST_METHOD");
   rb_global_variable(&global_request_method);
-  global_path_info = rb_str_new2("PATH_INFO");
-  rb_global_variable(&global_path_info);
+  global_request_uri = rb_str_new2("REQUEST_URI");
+  rb_global_variable(&global_request_uri);
   global_query_string = rb_str_new2("QUERY_STRING");
   rb_global_variable(&global_query_string);
   global_http_version = rb_str_new2("HTTP_VERSION");
diff --git a/ext/http11/http11_parser.c b/ext/http11/http11_parser.c
index c256037..83d0431 100644
--- a/ext/http11/http11_parser.c
+++ b/ext/http11/http11_parser.c
@@ -1,4 +1,4 @@
-#line 1 "ext/http11/http11_parser.rl"
+#line 1 "http11_parser.rl"
 #include "http11_parser.h"
 #include <stdio.h>
 #include <assert.h>
@@ -9,28 +9,28 @@
 #define MARK(S,F) assert((F) - (S)->mark >= 0); (S)->mark = (F);
 
 /** machine **/
-#line 100 "ext/http11/http11_parser.rl"
+#line 98 "http11_parser.rl"
 
 
 /** Data **/
 
-#line 18 "ext/http11/http11_parser.c"
+#line 18 "http11_parser.c"
 static int http_parser_start = 0;
 
 static int http_parser_first_final = 56;
 
 static int http_parser_error = 1;
 
-#line 104 "ext/http11/http11_parser.rl"
+#line 102 "http11_parser.rl"
 
 int http_parser_init(http_parser *parser)  {
     int cs = 0;
     
-#line 30 "ext/http11/http11_parser.c"
+#line 30 "http11_parser.c"
         {
         cs = http_parser_start;
         }
-#line 108 "ext/http11/http11_parser.rl"
+#line 106 "http11_parser.rl"
     parser->cs = cs;
     parser->body_start = NULL;
     parser->content_len = 0;
@@ -50,7 +50,7 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len)
     pe = buffer+len;
 
     
-#line 54 "ext/http11/http11_parser.c"
+#line 54 "http11_parser.c"
         {
         p -= 1;
         if ( ++p == pe )
@@ -70,14 +70,14 @@ case 0:
 st1:
         goto _out1;
 tr13:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st2;
 st2:
         if ( ++p == pe )
                 goto _out2;
 case 2:
-#line 81 "ext/http11/http11_parser.c"
+#line 81 "http11_parser.c"
         if ( (*p) == 69 )
                 goto st3;
         goto st1;
@@ -117,7 +117,7 @@ case 7:
                 goto tr33;
         goto st1;
 tr33:
-#line 29 "ext/http11/http11_parser.rl"
+#line 29 "http11_parser.rl"
         {
                if(parser->request_method != NULL)
                               parser->request_method(parser->data, parser->mark, p - parser->mark);
@@ -127,7 +127,7 @@ st8:
         if ( ++p == pe )
                 goto _out8;
 case 8:
-#line 131 "ext/http11/http11_parser.c"
+#line 131 "http11_parser.c"
         switch( (*p) ) {
                 case 42: goto tr27;
                 case 43: goto tr28;
@@ -144,26 +144,26 @@ case 8:
                 goto tr28;
         goto st1;
 tr27:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st9;
 st9:
         if ( ++p == pe )
                 goto _out9;
 case 9:
-#line 155 "ext/http11/http11_parser.c"
+#line 155 "http11_parser.c"
         if ( (*p) == 32 )
                 goto tr34;
         goto st1;
 tr34:
-#line 33 "ext/http11/http11_parser.rl"
+#line 33 "http11_parser.rl"
         {
-               if(parser->path_info != NULL)
-                              parser->path_info(parser->data, parser->mark, p - parser->mark);
+               if(parser->request_uri != NULL)
+                              parser->request_uri(parser->data, parser->mark, p - parser->mark);
         }
         goto st10;
 tr48:
-#line 37 "ext/http11/http11_parser.rl"
+#line 37 "http11_parser.rl"
         {
                if(parser->query_string != NULL)
                               parser->query_string(parser->data, parser->mark, p - parser->mark);
@@ -173,19 +173,19 @@ st10:
         if ( ++p == pe )
                 goto _out10;
 case 10:
-#line 177 "ext/http11/http11_parser.c"
+#line 177 "http11_parser.c"
         if ( (*p) == 72 )
                 goto tr11;
         goto st1;
 tr11:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st11;
 st11:
         if ( ++p == pe )
                 goto _out11;
 case 11:
-#line 189 "ext/http11/http11_parser.c"
+#line 189 "http11_parser.c"
         if ( (*p) == 84 )
                 goto st12;
         goto st1;
@@ -243,7 +243,7 @@ case 18:
                 goto st18;
         goto st1;
 tr37:
-#line 42 "ext/http11/http11_parser.rl"
+#line 42 "http11_parser.rl"
         {        
                if(parser->http_version != NULL)
                               parser->http_version(parser->data, parser->mark, p - parser->mark);
@@ -253,7 +253,7 @@ st19:
         if ( ++p == pe )
                 goto _out19;
 case 19:
-#line 257 "ext/http11/http11_parser.c"
+#line 257 "http11_parser.c"
         if ( (*p) == 10 )
                 goto st20;
         goto st1;
@@ -293,7 +293,7 @@ case 21:
                 goto tr40;
         goto st1;
 tr40:
-#line 46 "ext/http11/http11_parser.rl"
+#line 46 "http11_parser.rl"
         {
                parser->body_start = p+1; goto _out56;
         }
@@ -302,17 +302,17 @@ st56:
         if ( ++p == pe )
                 goto _out56;
 case 56:
-#line 306 "ext/http11/http11_parser.c"
+#line 306 "http11_parser.c"
         goto st1;
 tr36:
-#line 16 "ext/http11/http11_parser.rl"
+#line 16 "http11_parser.rl"
         { parser->field_start = p; }
         goto st22;
 st22:
         if ( ++p == pe )
                 goto _out22;
 case 22:
-#line 316 "ext/http11/http11_parser.c"
+#line 316 "http11_parser.c"
         switch( (*p) ) {
                 case 33: goto st22;
                 case 58: goto tr32;
@@ -338,7 +338,7 @@ case 22:
                 goto st22;
         goto st1;
 tr32:
-#line 17 "ext/http11/http11_parser.rl"
+#line 17 "http11_parser.rl"
         {
                parser->field_len = (p - parser->field_start);
         }
@@ -347,24 +347,24 @@ st23:
         if ( ++p == pe )
                 goto _out23;
 case 23:
-#line 351 "ext/http11/http11_parser.c"
+#line 351 "http11_parser.c"
         if ( (*p) == 13 )
                 goto tr56;
         goto tr55;
 tr55:
-#line 21 "ext/http11/http11_parser.rl"
+#line 21 "http11_parser.rl"
         { MARK(parser, p); }
         goto st24;
 st24:
         if ( ++p == pe )
                 goto _out24;
 case 24:
-#line 363 "ext/http11/http11_parser.c"
+#line 363 "http11_parser.c"
         if ( (*p) == 13 )
                 goto tr51;
         goto st24;
 tr51:
-#line 22 "ext/http11/http11_parser.rl"
+#line 22 "http11_parser.rl"
         {
                if(parser->http_field != NULL) {
                               parser->http_field(parser->data,
@@ -374,9 +374,9 @@ tr51:
         }
         goto st25;
 tr56:
-#line 21 "ext/http11/http11_parser.rl"
+#line 21 "http11_parser.rl"
         { MARK(parser, p); }
-#line 22 "ext/http11/http11_parser.rl"
+#line 22 "http11_parser.rl"
         {
                if(parser->http_field != NULL) {
                               parser->http_field(parser->data,
@@ -389,7 +389,7 @@ st25:
         if ( ++p == pe )
                 goto _out25;
 case 25:
-#line 393 "ext/http11/http11_parser.c"
+#line 393 "http11_parser.c"
         switch( (*p) ) {
                 case 10: goto st26;
                 case 13: goto tr51;
@@ -424,14 +424,14 @@ case 26:
                 goto tr42;
         goto st24;
 tr42:
-#line 16 "ext/http11/http11_parser.rl"
+#line 16 "http11_parser.rl"
         { parser->field_start = p; }
         goto st27;
 st27:
         if ( ++p == pe )
                 goto _out27;
 case 27:
-#line 435 "ext/http11/http11_parser.c"
+#line 435 "http11_parser.c"
         switch( (*p) ) {
                 case 13: goto tr51;
                 case 33: goto st27;
@@ -458,14 +458,14 @@ case 27:
                 goto st27;
         goto st24;
 tr28:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st28;
 st28:
         if ( ++p == pe )
                 goto _out28;
 case 28:
-#line 469 "ext/http11/http11_parser.c"
+#line 469 "http11_parser.c"
         switch( (*p) ) {
                 case 43: goto st28;
                 case 58: goto st29;
@@ -483,14 +483,14 @@ case 28:
                 goto st28;
         goto st1;
 tr30:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st29;
 st29:
         if ( ++p == pe )
                 goto _out29;
 case 29:
-#line 494 "ext/http11/http11_parser.c"
+#line 494 "http11_parser.c"
         switch( (*p) ) {
                 case 32: goto tr34;
                 case 37: goto st30;
@@ -531,14 +531,14 @@ case 31:
                 goto st29;
         goto st1;
 tr29:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st32;
 st32:
         if ( ++p == pe )
                 goto _out32;
 case 32:
-#line 542 "ext/http11/http11_parser.c"
+#line 542 "http11_parser.c"
         switch( (*p) ) {
                 case 32: goto tr34;
                 case 37: goto st34;
@@ -599,17 +599,17 @@ case 35:
                 goto st33;
         goto st1;
 tr46:
-#line 33 "ext/http11/http11_parser.rl"
+#line 33 "http11_parser.rl"
         {
-               if(parser->path_info != NULL)
-                              parser->path_info(parser->data, parser->mark, p - parser->mark);
+               if(parser->request_uri != NULL)
+                              parser->request_uri(parser->data, parser->mark, p - parser->mark);
         }
         goto st36;
 st36:
         if ( ++p == pe )
                 goto _out36;
 case 36:
-#line 613 "ext/http11/http11_parser.c"
+#line 613 "http11_parser.c"
         switch( (*p) ) {
                 case 32: goto tr48;
                 case 37: goto tr54;
@@ -624,14 +624,14 @@ case 36:
                 goto st1;
         goto tr53;
 tr53:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st37;
 st37:
         if ( ++p == pe )
                 goto _out37;
 case 37:
-#line 635 "ext/http11/http11_parser.c"
+#line 635 "http11_parser.c"
         switch( (*p) ) {
                 case 32: goto tr48;
                 case 37: goto st38;
@@ -646,14 +646,14 @@ case 37:
                 goto st1;
         goto st37;
 tr54:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st38;
 st38:
         if ( ++p == pe )
                 goto _out38;
 case 38:
-#line 657 "ext/http11/http11_parser.c"
+#line 657 "http11_parser.c"
         if ( (*p) < 65 ) {
                 if ( 48 <= (*p) && (*p) <= 57 )
                         goto st39;
@@ -677,14 +677,14 @@ case 39:
                 goto st37;
         goto st1;
 tr14:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st40;
 st40:
         if ( ++p == pe )
                 goto _out40;
 case 40:
-#line 688 "ext/http11/http11_parser.c"
+#line 688 "http11_parser.c"
         if ( (*p) == 69 )
                 goto st41;
         goto st1;
@@ -696,14 +696,14 @@ case 41:
                 goto st7;
         goto st1;
 tr15:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st42;
 st42:
         if ( ++p == pe )
                 goto _out42;
 case 42:
-#line 707 "ext/http11/http11_parser.c"
+#line 707 "http11_parser.c"
         if ( (*p) == 69 )
                 goto st43;
         goto st1;
@@ -722,14 +722,14 @@ case 44:
                 goto st7;
         goto st1;
 tr16:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st45;
 st45:
         if ( ++p == pe )
                 goto _out45;
 case 45:
-#line 733 "ext/http11/http11_parser.c"
+#line 733 "http11_parser.c"
         if ( (*p) == 80 )
                 goto st46;
         goto st1;
@@ -769,14 +769,14 @@ case 50:
                 goto st7;
         goto st1;
 tr17:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st51;
 st51:
         if ( ++p == pe )
                 goto _out51;
 case 51:
-#line 780 "ext/http11/http11_parser.c"
+#line 780 "http11_parser.c"
         switch( (*p) ) {
                 case 79: goto st52;
                 case 85: goto st41;
@@ -790,14 +790,14 @@ case 52:
                 goto st41;
         goto st1;
 tr18:
-#line 14 "ext/http11/http11_parser.rl"
+#line 14 "http11_parser.rl"
         { MARK(parser, p); }
         goto st53;
 st53:
         if ( ++p == pe )
                 goto _out53;
 case 53:
-#line 801 "ext/http11/http11_parser.c"
+#line 801 "http11_parser.c"
         if ( (*p) == 82 )
                 goto st54;
         goto st1;
@@ -875,15 +875,15 @@ case 55:
 
         _out: {}
         }
-#line 127 "ext/http11/http11_parser.rl"
+#line 125 "http11_parser.rl"
 
     parser->cs = cs;
     parser->nread = p - buffer;
     if(parser->body_start) {
         /* final \r\n combo encountered so stop right here */
         
-#line 886 "ext/http11/http11_parser.c"
-#line 133 "ext/http11/http11_parser.rl"
+#line 886 "http11_parser.c"
+#line 131 "http11_parser.rl"
         parser->nread++;
     }
 
@@ -895,8 +895,8 @@ int http_parser_finish(http_parser *parser)
         int cs = parser->cs;
 
         
-#line 899 "ext/http11/http11_parser.c"
-#line 144 "ext/http11/http11_parser.rl"
+#line 899 "http11_parser.c"
+#line 142 "http11_parser.rl"
 
         parser->cs = cs;
 
diff --git a/ext/http11/http11_parser.h b/ext/http11/http11_parser.h
index f4a205f..6ca9cef 100644
--- a/ext/http11/http11_parser.h
+++ b/ext/http11/http11_parser.h
@@ -3,6 +3,10 @@
 
 #include <sys/types.h>
 
+#if defined(_WIN32)
+#include <stddef.h>
+#endif
+
 typedef void (*element_cb)(void *data, const char *at, size_t length);
 typedef void (*field_cb)(void *data, const char *field, size_t flen, const char *value, size_t vlen);
 
@@ -19,7 +23,7 @@ typedef struct http_parser {
 
   field_cb http_field;
   element_cb request_method;
-  element_cb path_info;
+  element_cb request_uri;
   element_cb query_string;
   element_cb http_version;
 
diff --git a/ext/http11/http11_parser.rl b/ext/http11/http11_parser.rl
index 7642cb1..c86be7a 100644
--- a/ext/http11/http11_parser.rl
+++ b/ext/http11/http11_parser.rl
@@ -30,9 +30,9 @@
                if(parser->request_method != NULL)
                               parser->request_method(parser->data, parser->mark, p - parser->mark);
         }
-        action path_info {
-               if(parser->path_info != NULL)
-                              parser->path_info(parser->data, parser->mark, p - parser->mark);
+        action request_uri {
+               if(parser->request_uri != NULL)
+                              parser->request_uri(parser->data, parser->mark, p - parser->mark);
         }
         action query_string {
                if(parser->query_string != NULL)
@@ -70,23 +70,21 @@
 
         # URI schemes and absolute paths
         scheme = ( alpha | digit | "+" | "-" | "." )* ;
-        absolute_uri = (scheme ":" (uchar | reserved )*) >mark %path_info;
+        absolute_uri = (scheme ":" (uchar | reserved )*) >mark %request_uri;
 
         path = (pchar+ ( "/" pchar* )*) ;
         query = ( uchar | reserved )* >mark %query_string ;
         param = ( pchar | "/" )* ;
         params = (param ( ";" param )*) ;
-        rel_path = (path? (";" params)?) %path_info  ("?" query)? ;
+        rel_path = (path? (";" params)?) %request_uri  ("?" query)? ;
         absolute_path = ("/" rel_path) >mark ;
         
-        Request_URI = ("*" >mark %path_info | absolute_uri | absolute_path) ;
+        Request_URI = ("*" >mark %request_uri | absolute_uri | absolute_path) ;
         Method = ("OPTIONS"| "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "TRACE") >mark %request_method;
         
         http_number = (digit+ "." digit+) ;
         HTTP_Version = ("HTTP/" http_number) >mark %http_version ;
         Request_Line = (Method " " Request_URI " " HTTP_Version CRLF) ;
-
-      
         
         field_name = (token - ":")+ >start_field %write_field;
 
@@ -96,7 +94,7 @@
         
         Request = Request_Line (message_header)* $0 ( CRLF $1 @done );
 
-                main := Request;
+        main := Request;
 }%%
 
 /** Data **/