Fixed #31114 -- Fixed HttpRequest.build_absolute_uri() crash with reverse_lazy() locations.

This commit is contained in:
Jon Dufresne 2019-12-23 05:34:36 -05:00 committed by Mariusz Felisiak
parent 5660267e5b
commit e42b68debf
2 changed files with 14 additions and 1 deletions

View File

@ -191,6 +191,9 @@ class HttpRequest:
# Make it an absolute url (but schemeless and domainless) for the # Make it an absolute url (but schemeless and domainless) for the
# edge case that the path starts with '//'. # edge case that the path starts with '//'.
location = '//%s' % self.get_full_path() location = '//%s' % self.get_full_path()
else:
# Coerce lazy locations.
location = str(location)
bits = urlsplit(location) bits = urlsplit(location)
if not (bits.scheme and bits.netloc): if not (bits.scheme and bits.netloc):
# Handle the simple, most common case. If the location is absolute # Handle the simple, most common case. If the location is absolute

View File

@ -13,7 +13,9 @@ from django.http import (
HttpRequest, HttpResponsePermanentRedirect, HttpResponseRedirect, HttpRequest, HttpResponsePermanentRedirect, HttpResponseRedirect,
) )
from django.shortcuts import redirect from django.shortcuts import redirect
from django.test import SimpleTestCase, TestCase, override_settings from django.test import (
RequestFactory, SimpleTestCase, TestCase, override_settings,
)
from django.test.utils import override_script_prefix from django.test.utils import override_script_prefix
from django.urls import ( from django.urls import (
NoReverseMatch, Resolver404, ResolverMatch, URLPattern, URLResolver, NoReverseMatch, Resolver404, ResolverMatch, URLPattern, URLResolver,
@ -529,6 +531,14 @@ class ReverseLazyTest(TestCase):
'Some URL: /login/' 'Some URL: /login/'
) )
def test_build_absolute_uri(self):
factory = RequestFactory()
request = factory.get('/')
self.assertEqual(
request.build_absolute_uri(reverse_lazy('some-login-page')),
'http://testserver/login/',
)
class ReverseLazySettingsTest(AdminScriptTestCase): class ReverseLazySettingsTest(AdminScriptTestCase):
""" """