Skip to content

Commit

Permalink
Merge pull request #4833 from rtfd/humitos/redirects/avoid-infinite
Browse files Browse the repository at this point in the history
Avoid infinite redirection
  • Loading branch information
humitos authored Nov 1, 2018
2 parents cb215c2 + 00fe39a commit cac4fcc
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
10 changes: 9 additions & 1 deletion readthedocs/core/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions readthedocs/rtd_tests/tests/test_redirects.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,34 @@ def setUp(self):
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(
Expand Down

0 comments on commit cac4fcc

Please sign in to comment.