Fixed #31494 -- Preserved query strings when following HTTP 307/308 redirects in test client.
This commit is contained in:
parent
6425fd3124
commit
7c947f0f5a
|
@ -826,8 +826,12 @@ class Client(ClientMixin, RequestFactory):
|
||||||
path = urljoin(response.request['PATH_INFO'], path)
|
path = urljoin(response.request['PATH_INFO'], path)
|
||||||
|
|
||||||
if response.status_code in (HTTPStatus.TEMPORARY_REDIRECT, HTTPStatus.PERMANENT_REDIRECT):
|
if response.status_code in (HTTPStatus.TEMPORARY_REDIRECT, HTTPStatus.PERMANENT_REDIRECT):
|
||||||
# Preserve request method post-redirect for 307/308 responses.
|
# Preserve request method and query string (if needed)
|
||||||
request_method = getattr(self, response.request['REQUEST_METHOD'].lower())
|
# post-redirect for 307/308 responses.
|
||||||
|
request_method = response.request['REQUEST_METHOD'].lower()
|
||||||
|
if request_method not in ('get', 'head'):
|
||||||
|
extra['QUERY_STRING'] = url.query
|
||||||
|
request_method = getattr(self, request_method)
|
||||||
else:
|
else:
|
||||||
request_method = self.get
|
request_method = self.get
|
||||||
data = QueryDict(url.query)
|
data = QueryDict(url.query)
|
||||||
|
|
|
@ -214,6 +214,9 @@ Tests
|
||||||
creating deep copies with :py:func:`copy.deepcopy`. Assigning objects which
|
creating deep copies with :py:func:`copy.deepcopy`. Assigning objects which
|
||||||
don't support ``deepcopy()`` is deprecated and will be removed in Django 4.1.
|
don't support ``deepcopy()`` is deprecated and will be removed in Django 4.1.
|
||||||
|
|
||||||
|
* :class:`~django.test.Client` now preserves the request query string when
|
||||||
|
following 307 and 308 redirects.
|
||||||
|
|
||||||
URLs
|
URLs
|
||||||
~~~~
|
~~~~
|
||||||
|
|
||||||
|
|
|
@ -284,6 +284,20 @@ class ClientTest(TestCase):
|
||||||
self.assertEqual(response.request['PATH_INFO'], '/post_view/')
|
self.assertEqual(response.request['PATH_INFO'], '/post_view/')
|
||||||
self.assertEqual(response.request['REQUEST_METHOD'], method.upper())
|
self.assertEqual(response.request['REQUEST_METHOD'], method.upper())
|
||||||
|
|
||||||
|
def test_follow_307_and_308_preserves_query_string(self):
|
||||||
|
methods = ('post', 'options', 'put', 'patch', 'delete', 'trace')
|
||||||
|
codes = (307, 308)
|
||||||
|
for method, code in itertools.product(methods, codes):
|
||||||
|
with self.subTest(method=method, code=code):
|
||||||
|
req_method = getattr(self.client, method)
|
||||||
|
response = req_method(
|
||||||
|
'/redirect_view_%s_query_string/' % code,
|
||||||
|
data={'value': 'test'},
|
||||||
|
follow=True,
|
||||||
|
)
|
||||||
|
self.assertRedirects(response, '/post_view/?hello=world', status_code=code)
|
||||||
|
self.assertEqual(response.request['QUERY_STRING'], 'hello=world')
|
||||||
|
|
||||||
def test_follow_307_and_308_get_head_query_string(self):
|
def test_follow_307_and_308_get_head_query_string(self):
|
||||||
methods = ('get', 'head')
|
methods = ('get', 'head')
|
||||||
codes = (307, 308)
|
codes = (307, 308)
|
||||||
|
|
Loading…
Reference in New Issue