Commit fe38be96 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #21579 -- Made LocaleMiddleware respect script prefix.

Thanks buettgenbach at datacollect.com for the report and patch.
parent cf79b57a
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
"This is the locale selecting middleware that will look at accept headers"

from django.conf import settings
from django.core.urlresolvers import (is_valid_path, get_resolver,
from django.core.urlresolvers import (is_valid_path, get_resolver, get_script_prefix,
                                      LocaleRegexURLResolver)
from django.http import HttpResponseRedirect
from django.utils.cache import patch_vary_headers
@@ -45,9 +45,18 @@ class LocaleMiddleware(object):
                path_valid = is_valid_path("%s/" % language_path, urlconf)

            if path_valid:
                language_url = "%s://%s/%s%s" % (
                    request.scheme, request.get_host(), language,
                    request.get_full_path())
                script_prefix = get_script_prefix()
                language_url = "%s://%s%s" % (
                    request.scheme,
                    request.get_host(),
                    # insert language after the script prefix and before the
                    # rest of the URL
                    request.get_full_path().replace(
                        script_prefix,
                        '%s%s/' % (script_prefix, language),
                        1
                    )
                )
                return self.response_redirect_class(language_url)

        if not (self.is_language_prefix_patterns_used()
+20 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ from __future__ import unicode_literals
import os

from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse, clear_url_caches
from django.core.urlresolvers import reverse, clear_url_caches, set_script_prefix
from django.http import HttpResponsePermanentRedirect
from django.middleware.locale import LocaleMiddleware
from django.test import TestCase, override_settings
@@ -290,6 +290,25 @@ class URLResponseTests(URLTestCaseBase):
        self.assertEqual(response.context['LANGUAGE_CODE'], 'pt-br')


class URLRedirectWithScriptAliasTests(URLTestCaseBase):
    """
    #21579 - LocaleMiddleware should respect the script prefix.
    """
    def setUp(self):
        super(URLRedirectWithScriptAliasTests, self).setUp()
        self.script_prefix = '/script_prefix'
        set_script_prefix(self.script_prefix)

    def tearDown(self):
        super(URLRedirectWithScriptAliasTests, self).tearDown()
        # reset script prefix
        set_script_prefix('')

    def test_language_prefix_with_script_prefix(self):
        response = self.client.get('/prefixed/', HTTP_ACCEPT_LANGUAGE='en', SCRIPT_NAME=self.script_prefix)
        self.assertRedirects(response, '%s/en/prefixed/' % self.script_prefix, target_status_code=404)


class URLTagTests(URLTestCaseBase):
    """
    Test if the language tag works.