Refs #26428 -- Added support for relative path redirects to the test client.
Thanks iktyrrell for the patch.
This commit is contained in:
parent
ffb1c532ec
commit
2f698cd991
|
@ -26,7 +26,7 @@ from django.utils.encoding import force_bytes, force_str, uri_to_iri
|
||||||
from django.utils.functional import SimpleLazyObject, curry
|
from django.utils.functional import SimpleLazyObject, curry
|
||||||
from django.utils.http import urlencode
|
from django.utils.http import urlencode
|
||||||
from django.utils.itercompat import is_iterable
|
from django.utils.itercompat import is_iterable
|
||||||
from django.utils.six.moves.urllib.parse import urlparse, urlsplit
|
from django.utils.six.moves.urllib.parse import urljoin, urlparse, urlsplit
|
||||||
|
|
||||||
__all__ = ('Client', 'RedirectCycleError', 'RequestFactory', 'encode_file', 'encode_multipart')
|
__all__ = ('Client', 'RedirectCycleError', 'RequestFactory', 'encode_file', 'encode_multipart')
|
||||||
|
|
||||||
|
@ -699,7 +699,12 @@ class Client(RequestFactory):
|
||||||
if url.port:
|
if url.port:
|
||||||
extra['SERVER_PORT'] = str(url.port)
|
extra['SERVER_PORT'] = str(url.port)
|
||||||
|
|
||||||
response = self.get(url.path, QueryDict(url.query), follow=False, **extra)
|
# Prepend the request path to handle relative path redirects
|
||||||
|
path = url.path
|
||||||
|
if not path.startswith('/'):
|
||||||
|
path = urljoin(response.request['PATH_INFO'], path)
|
||||||
|
|
||||||
|
response = self.get(path, QueryDict(url.query), follow=False, **extra)
|
||||||
response.redirect_chain = redirect_chain
|
response.redirect_chain = redirect_chain
|
||||||
|
|
||||||
if redirect_chain[-1] in redirect_chain[:-1]:
|
if redirect_chain[-1] in redirect_chain[:-1]:
|
||||||
|
|
|
@ -9,7 +9,7 @@ Django 1.9.6 fixes several bugs in 1.9.5.
|
||||||
Bugfixes
|
Bugfixes
|
||||||
========
|
========
|
||||||
|
|
||||||
* Added support for relative path redirects to
|
* Added support for relative path redirects to the test client and to
|
||||||
``SimpleTestCase.assertRedirects()`` because Django 1.9 no longer converts
|
``SimpleTestCase.assertRedirects()`` because Django 1.9 no longer converts
|
||||||
redirects to absolute URIs (:ticket:`26428`).
|
redirects to absolute URIs (:ticket:`26428`).
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,18 @@ class ClientTest(TestCase):
|
||||||
self.assertRedirects(response, '/get_view/', status_code=302, target_status_code=200)
|
self.assertRedirects(response, '/get_view/', status_code=302, target_status_code=200)
|
||||||
self.assertEqual(len(response.redirect_chain), 2)
|
self.assertEqual(len(response.redirect_chain), 2)
|
||||||
|
|
||||||
|
def test_follow_relative_redirect(self):
|
||||||
|
"A URL with a relative redirect can be followed."
|
||||||
|
response = self.client.get('/accounts/', follow=True)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response.request['PATH_INFO'], '/accounts/login/')
|
||||||
|
|
||||||
|
def test_follow_relative_redirect_no_trailing_slash(self):
|
||||||
|
"A URL with a relative redirect with no trailing slash can be followed."
|
||||||
|
response = self.client.get('/accounts/no_trailing_slash', follow=True)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response.request['PATH_INFO'], '/accounts/login/')
|
||||||
|
|
||||||
def test_redirect_http(self):
|
def test_redirect_http(self):
|
||||||
"GET a URL that redirects to an http URI"
|
"GET a URL that redirects to an http URI"
|
||||||
response = self.client.get('/http_redirect_view/', follow=True)
|
response = self.client.get('/http_redirect_view/', follow=True)
|
||||||
|
|
Loading…
Reference in New Issue