From 2ee65b8ea25e767211eaad196fc02930c25c6190 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 24 Feb 2009 19:13:58 +0100 Subject: [PATCH] add headers to request object --- count-hosts.js | 16 ++++++-- server.cc | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 129 insertions(+), 10 deletions(-) diff --git a/count-hosts.js b/count-hosts.js index 6c639fc..d338606 100644 --- a/count-hosts.js +++ b/count-hosts.js @@ -8,9 +8,16 @@ function Process(request) { // // request.headers => { "Content-Length": "123" } - // request.http_version => "1.1" // - //log("Processing " + request.path + ". method: " + request.method); +// log("Processing " + request.path + ". method: " + request.method); +// log("version " + request.http_version); +// log("query_string " + request.query_string); +// log("fragment " + request.fragment); +// log("uri " + request.uri); +// log("headers: " + request.headers.toString()); + //for(var f in request.headers) { + //log(f + ": " + request.headers[f]); + //} var s = ""; // sends null on the last chunk. @@ -20,8 +27,11 @@ function Process(request) { //this.respond(chunk.length.toString(16) + "\r\n" + evalchunk + "\r\n"); s += chunk; } else { + this.respond(encode("hello world\n")); var output = eval(s); - this.respond(encode(output)); + if(output) { + this.respond(encode(output)); + } this.respond(encode("\n")); this.respond("0\r\n\r\n"); this.respond(null); diff --git a/server.cc b/server.cc index c8965e6..ef45738 100644 --- a/server.cc +++ b/server.cc @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,12 @@ class HttpRequest { ~HttpRequest(); string path; + string query_string; + string fragment; + string uri; + + list header_fields; + list header_values; Connection &connection; ebb_request parser_info; @@ -61,7 +68,6 @@ static void make_onBody_callback { HandleScope handle_scope; - Handle obj = request->js_object; // XXX don't always allocate onBody strings Handle onBody_val = request->js_object->Get(String::NewSymbol("onBody")); @@ -153,7 +159,7 @@ HttpRequest::~HttpRequest () HandleScope scope; // delete a reference to the respond method - //js_object->Delete(String::New("respond")); + js_object->Delete(String::New("respond")); js_object.Dispose(); } @@ -172,6 +178,68 @@ static void on_path request->path.append(buf, len); } +static void on_uri + ( ebb_request *req + , const char *buf + , size_t len + ) +{ + HttpRequest *request = static_cast (req->data); + request->uri.append(buf, len); +} + +static void on_query_string + ( ebb_request *req + , const char *buf + , size_t len + ) +{ + HttpRequest *request = static_cast (req->data); + request->query_string.append(buf, len); +} + +static void on_fragment + ( ebb_request *req + , const char *buf + , size_t len + ) +{ + HttpRequest *request = static_cast (req->data); + request->fragment.append(buf, len); +} + +static void on_header_field + ( ebb_request *req + , const char *buf + , size_t len + , int header_index + ) +{ + HttpRequest *request = static_cast (req->data); + + if( request->header_fields.size() == header_index - 1) { + request->header_fields.back().append(buf, len); + } else { + request->header_fields.push_back( string(buf, len) ); + } +} + +static void on_header_value + ( ebb_request *req + , const char *buf + , size_t len + , int header_index + ) +{ + HttpRequest *request = static_cast (req->data); + + if( request->header_values.size() == header_index - 1) { + request->header_values.back().append(buf, len); + } else { + request->header_values.push_back( string(buf, len) ); + } +} + static void on_headers_complete ( ebb_request *req ) @@ -203,10 +271,51 @@ static void on_headers_complete , String::New(request->path.c_str(), request->path.length()) ); + result->Set ( String::NewSymbol("uri") + , String::New(request->uri.c_str(), request->uri.length()) + ); + + result->Set ( String::NewSymbol("query_string") + , String::New(request->query_string.c_str(), request->query_string.length()) + ); + + result->Set ( String::NewSymbol("fragment") + , String::New(request->fragment.c_str(), request->fragment.length()) + ); + result->Set ( String::NewSymbol("method") , GetMethodString(request->parser_info.method) ); + char version[10]; + snprintf ( version + , 10 // big enough? :) + , "%d.%d" + , request->parser_info.version_major + , request->parser_info.version_minor + ); + result->Set ( String::NewSymbol("http_version") + , String::New(version) + ); + + + Handle headers = Object::New(); + list::iterator field_iterator = request->header_fields.begin(); + list::iterator value_iterator = request->header_values.begin(); + while( value_iterator != request->header_values.end() ) { + string &f = *field_iterator; + string &v = *value_iterator; + + headers->Set( String::New(f.c_str(), f.length() ) + , String::New(v.c_str(), v.length() ) + ); + + field_iterator++; + value_iterator++; + } + result->Set(String::NewSymbol("headers"), headers); + + request->js_object = Persistent::New(result); // Enter this processor's context so all the remaining operations @@ -260,11 +369,11 @@ static ebb_request * on_request HttpRequest *request = new HttpRequest(*connection); request->parser_info.on_path = on_path; - request->parser_info.on_query_string = NULL; - request->parser_info.on_uri = NULL; - request->parser_info.on_fragment = NULL; - request->parser_info.on_header_field = NULL; - request->parser_info.on_header_value = NULL; + request->parser_info.on_query_string = on_query_string; + request->parser_info.on_uri = on_uri; + request->parser_info.on_fragment = on_fragment; + request->parser_info.on_header_field = on_header_field; + request->parser_info.on_header_value = on_header_value; request->parser_info.on_headers_complete = on_headers_complete; request->parser_info.on_body = on_body; request->parser_info.on_complete = on_request_complete; -- 2.7.4