Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #14939: Don't strip ;-parameters from URLs in the test client.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15027 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit f117b91b4129b769032518d2b565e33eb0810da6 1 parent f9fba51
@andrewgodwin andrewgodwin authored
Showing with 20 additions and 6 deletions.
  1. +13 −6 django/test/client.py
  2. +7 −0 tests/modeltests/test_client/models.py
View
19 django/test/client.py
@@ -203,13 +203,20 @@ def request(self, **request):
"Construct a generic request object."
return WSGIRequest(self._base_environ(**request))
+ def _get_path(self, parsed):
+ # If there are parameters, add them
+ if parsed[3]:
+ return urllib.unquote(parsed[2] + ";" + parsed[3])
+ else:
+ return urllib.unquote(parsed[2])
+
def get(self, path, data={}, **extra):
"Construct a GET request"
parsed = urlparse(path)
r = {
'CONTENT_TYPE': 'text/html; charset=utf-8',
- 'PATH_INFO': urllib.unquote(parsed[2]),
+ 'PATH_INFO': self._get_path(parsed),
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
'REQUEST_METHOD': 'GET',
'wsgi.input': FakePayload('')
@@ -236,7 +243,7 @@ def post(self, path, data={}, content_type=MULTIPART_CONTENT,
r = {
'CONTENT_LENGTH': len(post_data),
'CONTENT_TYPE': content_type,
- 'PATH_INFO': urllib.unquote(parsed[2]),
+ 'PATH_INFO': self._get_path(parsed),
'QUERY_STRING': parsed[4],
'REQUEST_METHOD': 'POST',
'wsgi.input': FakePayload(post_data),
@@ -250,7 +257,7 @@ def head(self, path, data={}, **extra):
parsed = urlparse(path)
r = {
'CONTENT_TYPE': 'text/html; charset=utf-8',
- 'PATH_INFO': urllib.unquote(parsed[2]),
+ 'PATH_INFO': self._get_path(parsed),
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
'REQUEST_METHOD': 'HEAD',
'wsgi.input': FakePayload('')
@@ -263,7 +270,7 @@ def options(self, path, data={}, **extra):
parsed = urlparse(path)
r = {
- 'PATH_INFO': urllib.unquote(parsed[2]),
+ 'PATH_INFO': self._get_path(parsed),
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
'REQUEST_METHOD': 'OPTIONS',
'wsgi.input': FakePayload('')
@@ -290,7 +297,7 @@ def put(self, path, data={}, content_type=MULTIPART_CONTENT,
r = {
'CONTENT_LENGTH': len(post_data),
'CONTENT_TYPE': content_type,
- 'PATH_INFO': urllib.unquote(parsed[2]),
+ 'PATH_INFO': self._get_path(parsed),
'QUERY_STRING': query_string or parsed[4],
'REQUEST_METHOD': 'PUT',
'wsgi.input': FakePayload(post_data),
@@ -303,7 +310,7 @@ def delete(self, path, data={}, **extra):
parsed = urlparse(path)
r = {
- 'PATH_INFO': urllib.unquote(parsed[2]),
+ 'PATH_INFO': self._get_path(parsed),
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
'REQUEST_METHOD': 'DELETE',
'wsgi.input': FakePayload('')
View
7 tests/modeltests/test_client/models.py
@@ -269,6 +269,13 @@ def test_unknown_page(self):
# Check that the response was a 404
self.assertEqual(response.status_code, 404)
+ def test_url_parameters(self):
+ "Make sure that URL ;-parameters are not stripped."
+ response = self.client.get('/test_client/unknown_view/;some-parameter')
+
+ # Check that the path in the response includes it (ignore that it's a 404)
+ self.assertEqual(response.request['PATH_INFO'], '/test_client/unknown_view/;some-parameter')
+
def test_view_with_login(self):
"Request a page that is protected with @login_required"
Please sign in to comment.
Something went wrong with that request. Please try again.