From 78c076ebb118a8312a2912dddb8a93d3ea80fa99 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 21 Apr 2009 11:14:42 -0700 Subject: HttpParser: set QUERY_STRING for Rack-compliance --- ext/unicorn/http11/http11.c | 4 ++++ lib/unicorn/http_request.rb | 1 - test/unit/test_http_parser.rb | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ext/unicorn/http11/http11.c b/ext/unicorn/http11/http11.c index 42dcf99..fbe2432 100644 --- a/ext/unicorn/http11/http11.c +++ b/ext/unicorn/http11/http11.c @@ -262,6 +262,10 @@ static void header_done(void *data, const char *at, size_t length) VALUE server_port = global_port_80; VALUE temp; + /* rack requires QUERY_STRING */ + if (rb_hash_aref(req, global_query_string) == Qnil) + rb_hash_aset(req, global_query_string, rb_str_new(NULL, 0)); + /* set rack.url_scheme to "https" or "http", no others are allowed by Rack */ if ((temp = rb_hash_aref(req, global_http_x_forwarded_proto)) != Qnil && RSTRING_LEN(temp) == 5 && diff --git a/lib/unicorn/http_request.rb b/lib/unicorn/http_request.rb index 7233008..d170505 100644 --- a/lib/unicorn/http_request.rb +++ b/lib/unicorn/http_request.rb @@ -128,7 +128,6 @@ module Unicorn # that client may be a proxy, gateway, or other intermediary # acting on behalf of the actual source client." @params[Const::REMOTE_ADDR] = socket.unicorn_peeraddr - @params[Const::QUERY_STRING] ||= '' @params[Const::RACK_INPUT] = @body @params.update(DEF_PARAMS) end diff --git a/test/unit/test_http_parser.rb b/test/unit/test_http_parser.rb index 37a539d..1f3c9d2 100644 --- a/test/unit/test_http_parser.rb +++ b/test/unit/test_http_parser.rb @@ -22,7 +22,7 @@ class HttpParserTest < Test::Unit::TestCase assert_equal '/', req['REQUEST_URI'] assert_equal 'GET', req['REQUEST_METHOD'] assert_nil req['FRAGMENT'] - assert_nil req['QUERY_STRING'] + assert_equal '', req['QUERY_STRING'] parser.reset req.clear @@ -40,7 +40,7 @@ class HttpParserTest < Test::Unit::TestCase assert_equal '/hello-world', req['REQUEST_URI'] assert_equal 'GET', req['REQUEST_METHOD'] assert_nil req['FRAGMENT'] - assert_nil req['QUERY_STRING'] + assert_equal '', req['QUERY_STRING'] end def test_parse_strange_headers @@ -100,7 +100,7 @@ class HttpParserTest < Test::Unit::TestCase assert parser.execute(req, http << "\n") assert_equal 'HTTP/1.1', req['SERVER_PROTOCOL'] assert_nil req['FRAGMENT'] - assert_nil req['QUERY_STRING'] + assert_equal '', req['QUERY_STRING'] end def test_absolute_uri -- cgit v1.2.3-24-ge0c7