Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.0.X] Fixed #10267 -- Correctly handle IRIs in HttpResponse.build_a…

…bsolute_uri().

Backport of r10539 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10540 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 6771f4e348926608a86bc5152defd90a82fa3624 1 parent 18baad0
@malcolmt malcolmt authored
View
6 django/http/__init__.py
@@ -72,7 +72,7 @@ def build_absolute_uri(self, location=None):
current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
self.get_host(), self.path)
location = urljoin(current_uri, location)
- return location
+ return iri_to_uri(location)
def is_secure(self):
return os.environ.get("HTTPS") == "on"
@@ -398,14 +398,14 @@ class HttpResponseRedirect(HttpResponse):
def __init__(self, redirect_to):
HttpResponse.__init__(self)
- self['Location'] = iri_to_uri(redirect_to)
+ self['Location'] = redirect_to
class HttpResponsePermanentRedirect(HttpResponse):
status_code = 301
def __init__(self, redirect_to):
HttpResponse.__init__(self)
- self['Location'] = iri_to_uri(redirect_to)
+ self['Location'] = redirect_to
class HttpResponseNotModified(HttpResponse):
status_code = 304
View
6 tests/regressiontests/views/tests/__init__.py
@@ -1,5 +1,7 @@
from defaults import *
+from generic.create_update import *
+from generic.date_based import *
from i18n import *
+from specials import *
from static import *
-from generic.date_based import *
-from generic.create_update import *
+
View
15 tests/regressiontests/views/tests/specials.py
@@ -0,0 +1,15 @@
+# coding: utf-8
+from django.test import TestCase
+
+class URLHandling(TestCase):
+ """
+ Tests for URL handling in views and responses.
+ """
+ def test_iri_redirect(self):
+ """
+ Tests that redirecting to an IRI, requiring encoding before we use it
+ in an HTTP response, is handled correctly.
+ """
+ response = self.client.get(u'/views/中文/')
+ self.assertRedirects(response, "/views/%E4%B8%AD%E6%96%87/target/")
+
View
5 tests/regressiontests/views/urls.py
@@ -1,3 +1,4 @@
+# coding: utf-8
from os import path
from django.conf.urls.defaults import *
@@ -38,6 +39,10 @@
# Static views
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': media_dir}),
+
+ # Special URLs for particular regression cases.
+ url(u'^中文/$', 'regressiontests.views.views.redirect'),
+ url(u'^中文/target/$', 'regressiontests.views.views.index_page'),
)
# Date-based generic views.
View
9 tests/regressiontests/views/views.py
@@ -1,4 +1,4 @@
-from django.http import HttpResponse
+from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from django.views.generic.create_update import create_object
@@ -27,3 +27,10 @@ def save(self, *args, **kwargs):
return create_object(request,
post_save_redirect='/views/create_update/view/article/%(slug)s/',
form_class=SlugChangingArticleForm)
+
+def redirect(request):
+ """
+ Forces an HTTP redirect.
+ """
+ return HttpResponseRedirect("target/")
+
Please sign in to comment.
Something went wrong with that request. Please try again.