diff options
| author | Ryan Kaskel <dev@ryankaskel.com> | 2013-05-20 20:22:38 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2013-10-04 07:36:39 -0400 |
| commit | 8b0014869f666b44cd20692e38073ec0a0a8cb08 (patch) | |
| tree | 50bb9d1d80c493c8273faa6bda2eadaed7d19866 /django | |
| parent | 36e220f923e0c355c9b0388131f87fbfaf46ac5f (diff) | |
Fixed #19321 -- Allowed redirect middleware HTTP responses to be overridden.
Thanks Melevir for the suggestion.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/redirects/middleware.py | 12 | ||||
| -rw-r--r-- | django/contrib/redirects/tests.py | 30 |
2 files changed, 39 insertions, 3 deletions
diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py index 03c9d97c0d..9053c64a9a 100644 --- a/django/contrib/redirects/middleware.py +++ b/django/contrib/redirects/middleware.py @@ -8,6 +8,11 @@ from django import http class RedirectFallbackMiddleware(object): + + # Defined as class-level attributes to be subclassing-friendly. + response_gone_class = http.HttpResponseGone + response_redirect_class = http.HttpResponsePermanentRedirect + def __init__(self): if 'django.contrib.sites' not in settings.INSTALLED_APPS: raise ImproperlyConfigured( @@ -16,8 +21,9 @@ class RedirectFallbackMiddleware(object): ) def process_response(self, request, response): + # No need to check for a redirect for non-404 responses. if response.status_code != 404: - return response # No need to check for a redirect for non-404 responses. + return response full_path = request.get_full_path() current_site = get_current_site(request) @@ -37,8 +43,8 @@ class RedirectFallbackMiddleware(object): pass if r is not None: if r.new_path == '': - return http.HttpResponseGone() - return http.HttpResponsePermanentRedirect(r.new_path) + return self.response_gone_class() + return self.response_redirect_class(r.new_path) # No redirect was found. Return the response. return response diff --git a/django/contrib/redirects/tests.py b/django/contrib/redirects/tests.py index bdcdf4a9e1..c255caf980 100644 --- a/django/contrib/redirects/tests.py +++ b/django/contrib/redirects/tests.py @@ -1,3 +1,4 @@ +from django import http from django.conf import settings from django.contrib.sites.models import Site from django.core.exceptions import ImproperlyConfigured @@ -61,3 +62,32 @@ class RedirectTests(TestCase): def test_sites_not_installed(self): with self.assertRaises(ImproperlyConfigured): RedirectFallbackMiddleware() + + +class OverriddenRedirectFallbackMiddleware(RedirectFallbackMiddleware): + # Use HTTP responses different from the defaults + response_gone_class = http.HttpResponseForbidden + response_redirect_class = http.HttpResponseRedirect + + +@override_settings( + MIDDLEWARE_CLASSES=list(settings.MIDDLEWARE_CLASSES) + + ['django.contrib.redirects.tests.OverriddenRedirectFallbackMiddleware'], + SITE_ID=1, +) +class OverriddenRedirectMiddlewareTests(TestCase): + + def setUp(self): + self.site = Site.objects.get(pk=settings.SITE_ID) + + def test_response_gone_class(self): + Redirect.objects.create( + site=self.site, old_path='/initial/', new_path='') + response = self.client.get('/initial/') + self.assertEqual(response.status_code, 403) + + def test_response_redirect_class(self): + Redirect.objects.create( + site=self.site, old_path='/initial/', new_path='/new_target/') + response = self.client.get('/initial/') + self.assertEqual(response.status_code, 302) |
