From: Ben Darnell Date: Mon, 10 Sep 2012 04:04:58 +0000 (-0700) Subject: Keep empty arguments in WSGI mode too. X-Git-Tag: v3.0.0~272^2~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=070e08a28cfad00c8b0a3acbd0127770022992b3;p=thirdparty%2Ftornado.git Keep empty arguments in WSGI mode too. Add another test and release notes. --- diff --git a/tornado/test/web_test.py b/tornado/test/web_test.py index 845fb2897..3ce700f64 100644 --- a/tornado/test/web_test.py +++ b/tornado/test/web_test.py @@ -451,6 +451,11 @@ class HeaderInjectionHandler(RequestHandler): raise +class GetArgumentHandler(RequestHandler): + def get(self): + self.write(self.get_argument("foo", "default")) + + # This test is shared with wsgi_test.py class WSGISafeWebTest(AsyncHTTPTestCase): COOKIE_SECRET = "WebTest.COOKIE_SECRET" @@ -487,6 +492,7 @@ class WSGISafeWebTest(AsyncHTTPTestCase): url("/multi_header", MultiHeaderHandler), url("/redirect", RedirectHandler), url("/header_injection", HeaderInjectionHandler), + url("/get_argument", GetArgumentHandler), ] return urls @@ -591,6 +597,14 @@ js_embed() response = self.fetch("/header_injection") self.assertEqual(response.body, b("ok")) + def test_get_argument(self): + response = self.fetch("/get_argument?foo=bar") + self.assertEqual(response.body, b("bar")) + response = self.fetch("/get_argument?foo=") + self.assertEqual(response.body, b("")) + response = self.fetch("/get_argument") + self.assertEqual(response.body, b("default")) + class NonWSGIWebTests(AsyncHTTPTestCase): def get_app(self): diff --git a/tornado/wsgi.py b/tornado/wsgi.py index dd2488e85..98422f56d 100644 --- a/tornado/wsgi.py +++ b/tornado/wsgi.py @@ -137,11 +137,8 @@ class HTTPRequest(object): self.query = environ.get("QUERY_STRING", "") if self.query: self.uri += "?" + self.query - arguments = parse_qs_bytes(native_str(self.query)) - for name, values in arguments.iteritems(): - values = [v for v in values if v] - if values: - self.arguments[name] = values + self.arguments = parse_qs_bytes(native_str(self.query), + keep_blank_values=True) self.version = "HTTP/1.1" self.headers = httputil.HTTPHeaders() if environ.get("CONTENT_TYPE"): diff --git a/website/sphinx/releases/next.rst b/website/sphinx/releases/next.rst index 35d110acb..f4bd8cc09 100644 --- a/website/sphinx/releases/next.rst +++ b/website/sphinx/releases/next.rst @@ -27,3 +27,6 @@ In progress * The command-line interface to `tornado.testing.main` now supports additional arguments from the underlying `unittest` module: ``verbose``, ``quiet``, ``failfast``, ``catch``, ``buffer``. +* Empty HTTP request arguments are no longer ignored. This applies to + ``HTTPRequest.arguments`` and ``RequestHandler.get_argument[s]`` + in WSGI and non-WSGI modes.