Commit 9390da7f authored by ieatkittens's avatar ieatkittens Committed by Tim Graham
Browse files

Fixed #26293 -- Fixed CommonMiddleware to process PREPEND_WWW and APPEND_SLASH independently.

parent 107165c4
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -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 we also need to append a slash so we can do it all
            # with a single redirect.
        # 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()

            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):
        """
+3 −0
Original line number Diff line number Diff line
@@ -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`).
+1 −6
Original line number Diff line number Diff line
@@ -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):