summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJannis Leidel <jannis@leidel.info>2012-03-02 11:07:36 +0000
committerJannis Leidel <jannis@leidel.info>2012-03-02 11:07:36 +0000
commit746987f916bfb24a0671429d9993ad727dc7c8bc (patch)
tree337b7241f5290b1ee934115c381b9338b7748b8d /django
parenta255d3933828ea5ab5173bc41336a64f446057bb (diff)
Fixed #17734 -- Made sure to only redirect translated URLs if they can actually be resolved to prevent unwanted redirects. Many thanks to Orne Brocaar and Anssi Kääriäinen for input.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17621 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/core/urlresolvers.py14
-rw-r--r--django/middleware/common.py19
-rw-r--r--django/middleware/locale.py17
3 files changed, 28 insertions, 22 deletions
diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index b634b56685..1497d43e91 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -518,3 +518,17 @@ def get_urlconf(default=None):
changed from the default one.
"""
return getattr(_urlconfs, "value", default)
+
+def is_valid_path(path, urlconf=None):
+ """
+ Returns True if the given path resolves against the default URL resolver,
+ False otherwise.
+
+ This is a convenience method to make working with "is this a match?" cases
+ easier, avoiding unnecessarily indented try...except blocks.
+ """
+ try:
+ resolve(path, urlconf)
+ return True
+ except Resolver404:
+ return False
diff --git a/django/middleware/common.py b/django/middleware/common.py
index aaa094d15a..d894ec832f 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -64,8 +64,8 @@ class CommonMiddleware(object):
# trailing slash and there is no pattern for the current path
if settings.APPEND_SLASH and (not old_url[1].endswith('/')):
urlconf = getattr(request, 'urlconf', None)
- if (not _is_valid_path(request.path_info, urlconf) and
- _is_valid_path("%s/" % request.path_info, urlconf)):
+ if (not urlresolvers.is_valid_path(request.path_info, urlconf) and
+ urlresolvers.is_valid_path("%s/" % request.path_info, urlconf)):
new_url[1] = new_url[1] + '/'
if settings.DEBUG and request.method == 'POST':
raise RuntimeError((""
@@ -151,18 +151,3 @@ def _is_internal_request(domain, referer):
"""
# Different subdomains are treated as different domains.
return referer is not None and re.match("^https?://%s/" % re.escape(domain), referer)
-
-def _is_valid_path(path, urlconf=None):
- """
- Returns True if the given path resolves against the default URL resolver,
- False otherwise.
-
- This is a convenience method to make working with "is this a match?" cases
- easier, avoiding unnecessarily indented try...except blocks.
- """
- try:
- urlresolvers.resolve(path, urlconf)
- return True
- except urlresolvers.Resolver404:
- return False
-
diff --git a/django/middleware/locale.py b/django/middleware/locale.py
index 2a71f3d150..77113e2987 100644
--- a/django/middleware/locale.py
+++ b/django/middleware/locale.py
@@ -1,10 +1,13 @@
"This is the locale selecting middleware that will look at accept headers"
-from django.core.urlresolvers import get_resolver, LocaleRegexURLResolver
+from django.conf import settings
+from django.core.urlresolvers import (is_valid_path, get_resolver,
+ LocaleRegexURLResolver)
from django.http import HttpResponseRedirect
from django.utils.cache import patch_vary_headers
from django.utils import translation
+
class LocaleMiddleware(object):
"""
This is a very simple middleware that parses a request
@@ -23,13 +26,17 @@ class LocaleMiddleware(object):
def process_response(self, request, response):
language = translation.get_language()
- translation.deactivate()
-
if (response.status_code == 404 and
not translation.get_language_from_path(request.path_info)
and self.is_language_prefix_patterns_used()):
- return HttpResponseRedirect(
- '/%s%s' % (language, request.get_full_path()))
+ urlconf = getattr(request, 'urlconf', None)
+ language_path = '/%s%s' % (language, request.path_info)
+ if settings.APPEND_SLASH and not language_path.endswith('/'):
+ language_path = language_path + '/'
+ if is_valid_path(language_path, urlconf):
+ return HttpResponseRedirect(
+ '/%s%s' % (language, request.get_full_path()))
+ translation.deactivate()
patch_vary_headers(response, ('Accept-Language',))
if 'Content-Language' not in response: