Merge pull request #4833 from rtfd/humitos/redirects/avoid-infinite

Avoid infinite redirection
add-modified-date-importedfile
Manuel Kaufmann 2018-11-01 14:50:24 +01:00 committed by GitHub
commit cac4fccaf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 1 deletions

View File

@ -116,8 +116,16 @@ 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:
return 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
return r

View File

@ -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(