Commit d2338bae authored by Tim Graham's avatar Tim Graham
Browse files

[1.9.x] Refs #26428 -- Added support for relative path redirects to the test client.

Thanks iktyrrell for the patch.

Backport of 2f698cd9 from master
parent 2d78b46d
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ from django.utils.encoding import force_bytes, force_str, uri_to_iri
from django.utils.functional import SimpleLazyObject, curry
from django.utils.http import urlencode
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')

@@ -678,7 +678,12 @@ class Client(RequestFactory):
            if 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

            if redirect_chain[-1] in redirect_chain[:-1]:
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ Django 1.9.6 fixes several bugs in 1.9.5.
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
  redirects to absolute URIs (:ticket:`26428`).

+12 −0
Original line number Diff line number Diff line
@@ -217,6 +217,18 @@ class ClientTest(TestCase):
        self.assertRedirects(response, '/get_view/', status_code=302, target_status_code=200)
        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):
        "GET a URL that redirects to an http URI"
        response = self.client.get('/http_redirect_view/', follow=True)