Merge pull request #4833 from rtfd/humitos/redirects/avoid-infinite
Avoid infinite redirectionadd-modified-date-importedfile
commit
cac4fccaf2
|
@ -116,7 +116,15 @@ def server_error_404(request, exception=None, template_name='404.html'): # pyli
|
|||
Marking exception as optional to make /404/ testing page to work.
|
||||
"""
|
||||
response = get_redirect_response(request, path=request.get_full_path())
|
||||
|
||||
if response:
|
||||
if response.url == request.build_absolute_uri():
|
||||
# check that we do have a response and avoid infinite redirect
|
||||
log.warning(
|
||||
'Infinite Redirect: FROM URL is the same than TO URL. url=%s',
|
||||
response.url,
|
||||
)
|
||||
else:
|
||||
return response
|
||||
r = render(request, template_name)
|
||||
r.status_code = 404
|
||||
|
|
|
@ -127,6 +127,34 @@ class RedirectAppTests(TestCase):
|
|||
self.pip = Project.objects.get(slug='pip')
|
||||
self.pip.versions.create_latest()
|
||||
|
||||
@override_settings(USE_SUBDOMAIN=True)
|
||||
def test_redirect_prefix_infinite(self):
|
||||
"""
|
||||
Avoid infinite redirects.
|
||||
|
||||
If the URL hit is the same that the URL returned for redirection, we
|
||||
return a 404.
|
||||
|
||||
These examples comes from this issue:
|
||||
* https://github.com/rtfd/readthedocs.org/issues/4673
|
||||
"""
|
||||
Redirect.objects.create(
|
||||
project=self.pip, redirect_type='prefix',
|
||||
from_url='/',
|
||||
)
|
||||
r = self.client.get('/redirect', HTTP_HOST='pip.readthedocs.org')
|
||||
self.assertEqual(r.status_code, 302)
|
||||
self.assertEqual(
|
||||
r['Location'], 'http://pip.readthedocs.org/en/latest/redirect.html')
|
||||
|
||||
r = self.client.get('/redirect/', HTTP_HOST='pip.readthedocs.org')
|
||||
self.assertEqual(r.status_code, 302)
|
||||
self.assertEqual(
|
||||
r['Location'], 'http://pip.readthedocs.org/en/latest/redirect/')
|
||||
|
||||
r = self.client.get('/en/latest/redirect/', HTTP_HOST='pip.readthedocs.org')
|
||||
self.assertEqual(r.status_code, 404)
|
||||
|
||||
@override_settings(USE_SUBDOMAIN=True)
|
||||
def test_redirect_root(self):
|
||||
Redirect.objects.create(
|
||||
|
|
Loading…
Reference in New Issue