From 2f81a0ca6543f4f7b59bf6cd9aeb8ae87f1e968e Mon Sep 17 00:00:00 2001 From: Julien Phalip Date: Sun, 31 Mar 2013 00:54:52 -0700 Subject: [PATCH] Fixed #20169 -- Ensured that the WSGI request's path is correctly based on the `SCRIPT_NAME` environment parameter or the `FORCE_SCRIPT_NAME` setting, regardless of whether or not those have a trailing slash. Thanks to bmispelon for the review. --- django/core/handlers/wsgi.py | 2 +- tests/requests/tests.py | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py index 78bf101e203..3c88aeac6d1 100644 --- a/django/core/handlers/wsgi.py +++ b/django/core/handlers/wsgi.py @@ -137,7 +137,7 @@ class WSGIRequest(http.HttpRequest): path_info = '/' self.environ = environ self.path_info = path_info - self.path = '%s%s' % (script_name, path_info) + self.path = '%s/%s' % (script_name.rstrip('/'), path_info.lstrip('/')) self.META = environ self.META['PATH_INFO'] = path_info self.META['SCRIPT_NAME'] = script_name diff --git a/tests/requests/tests.py b/tests/requests/tests.py index 2803d7995b6..e1767754494 100644 --- a/tests/requests/tests.py +++ b/tests/requests/tests.py @@ -50,6 +50,44 @@ class RequestsTests(unittest.TestCase): self.assertEqual(request.META['REQUEST_METHOD'], 'bogus') self.assertEqual(request.META['SCRIPT_NAME'], '') + def test_wsgirequest_with_script_name(self): + """ + Ensure that the request's path is correctly assembled, regardless of + whether or not the SCRIPT_NAME has a trailing slash. + Refs #20169. + """ + # With trailing slash + request = WSGIRequest({'PATH_INFO': '/somepath/', 'SCRIPT_NAME': '/PREFIX/', 'REQUEST_METHOD': 'get', 'wsgi.input': BytesIO(b'')}) + self.assertEqual(request.path, '/PREFIX/somepath/') + # Without trailing slash + request = WSGIRequest({'PATH_INFO': '/somepath/', 'SCRIPT_NAME': '/PREFIX', 'REQUEST_METHOD': 'get', 'wsgi.input': BytesIO(b'')}) + self.assertEqual(request.path, '/PREFIX/somepath/') + + def test_wsgirequest_with_force_script_name(self): + """ + Ensure that the FORCE_SCRIPT_NAME setting takes precedence over the + request's SCRIPT_NAME environment parameter. + Refs #20169. + """ + with override_settings(FORCE_SCRIPT_NAME='/FORCED_PREFIX/'): + request = WSGIRequest({'PATH_INFO': '/somepath/', 'SCRIPT_NAME': '/PREFIX/', 'REQUEST_METHOD': 'get', 'wsgi.input': BytesIO(b'')}) + self.assertEqual(request.path, '/FORCED_PREFIX/somepath/') + + def test_wsgirequest_path_with_force_script_name_trailing_slash(self): + """ + Ensure that the request's path is correctly assembled, regardless of + whether or not the FORCE_SCRIPT_NAME setting has a trailing slash. + Refs #20169. + """ + # With trailing slash + with override_settings(FORCE_SCRIPT_NAME='/FORCED_PREFIX/'): + request = WSGIRequest({'PATH_INFO': '/somepath/', 'REQUEST_METHOD': 'get', 'wsgi.input': BytesIO(b'')}) + self.assertEqual(request.path, '/FORCED_PREFIX/somepath/') + # Without trailing slash + with override_settings(FORCE_SCRIPT_NAME='/FORCED_PREFIX'): + request = WSGIRequest({'PATH_INFO': '/somepath/', 'REQUEST_METHOD': 'get', 'wsgi.input': BytesIO(b'')}) + self.assertEqual(request.path, '/FORCED_PREFIX/somepath/') + def test_wsgirequest_repr(self): request = WSGIRequest({'PATH_INFO': '/somepath/', 'REQUEST_METHOD': 'get', 'wsgi.input': BytesIO(b'')}) request.GET = {'get-key': 'get-value'}