From 9390da7fb6e251eaa9a785692f987296cb14523f Mon Sep 17 00:00:00 2001 From: ieatkittens Date: Fri, 18 Mar 2016 15:21:41 -0400 Subject: [PATCH] Fixed #26293 -- Fixed CommonMiddleware to process PREPEND_WWW and APPEND_SLASH independently. --- django/middleware/common.py | 21 +++++++++++---------- docs/releases/1.9.5.txt | 3 +++ tests/middleware/tests.py | 7 +------ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/django/middleware/common.py b/django/middleware/common.py index 70d8c57f7e..2135702062 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -54,18 +54,19 @@ class CommonMiddleware(object): # Check for a redirect based on settings.PREPEND_WWW host = request.get_host() + must_prepend = settings.PREPEND_WWW and host and not host.startswith('www.') + redirect_url = ('%s://www.%s' % (request.scheme, host)) if must_prepend else '' - if settings.PREPEND_WWW and host and not host.startswith('www.'): - host = 'www.' + host + # Check if a slash should be appended + if self.should_redirect_with_slash(request): + path = self.get_full_path_with_slash(request) + else: + path = request.get_full_path() - # Check if we also need to append a slash so we can do it all - # with a single redirect. - if self.should_redirect_with_slash(request): - path = self.get_full_path_with_slash(request) - else: - path = request.get_full_path() - - return self.response_redirect_class('%s://%s%s' % (request.scheme, host, path)) + # Return a redirect if necessary + if redirect_url or path != request.get_full_path(): + redirect_url += path + return self.response_redirect_class(redirect_url) def should_redirect_with_slash(self, request): """ diff --git a/docs/releases/1.9.5.txt b/docs/releases/1.9.5.txt index 37157b3e56..c88e92031f 100644 --- a/docs/releases/1.9.5.txt +++ b/docs/releases/1.9.5.txt @@ -34,3 +34,6 @@ Bugfixes * Fixed a crash when using a reverse lookup with a subquery when a ``ForeignKey`` has a ``to_field`` set to something other than the primary key (:ticket:`26373`). + +* Fixed a regression in ``CommonMiddleware`` that caused spurious warnings in + logs on requests missing a trailing slash (:ticket:`26293`). diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py index dd26d68056..d0e4cf349e 100644 --- a/tests/middleware/tests.py +++ b/tests/middleware/tests.py @@ -67,10 +67,8 @@ class CommonMiddlewareTest(SimpleTestCase): APPEND_SLASH should redirect slashless URLs to a valid pattern. """ request = self.rf.get('/slash') - response = HttpResponseNotFound() - r = CommonMiddleware().process_response(request, response) + r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) - self.assertEqual(r.url, '/slash/') @override_settings(APPEND_SLASH=True) def test_append_slash_redirect_querystring(self): @@ -301,9 +299,6 @@ class CommonMiddlewareTest(SimpleTestCase): request = self.rf.get('/slash') request.META['QUERY_STRING'] = force_str('drink=café') r = CommonMiddleware().process_request(request) - self.assertIsNone(r) - response = HttpResponseNotFound() - r = CommonMiddleware().process_response(request, response) self.assertEqual(r.status_code, 301) def test_response_redirect_class(self):