Skip to content

Commit

Permalink
Fixed #10267 -- Correctly handle IRIs in HttpResponse.build_absolute_…
Browse files Browse the repository at this point in the history
…uri().

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10539 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Apr 12, 2009
1 parent 794f2d1 commit 87e6939
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 7 deletions.
6 changes: 3 additions & 3 deletions django/http/__init__.py
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down
7 changes: 4 additions & 3 deletions tests/regressiontests/views/tests/__init__.py
@@ -1,6 +1,7 @@
from debug import *
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 *
from debug import *
15 changes: 15 additions & 0 deletions 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/")

5 changes: 5 additions & 0 deletions tests/regressiontests/views/urls.py
@@ -1,3 +1,4 @@
# coding: utf-8
from os import path

from django.conf.urls.defaults import *
Expand Down Expand Up @@ -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.
Expand Down
9 changes: 8 additions & 1 deletion tests/regressiontests/views/views.py
@@ -1,6 +1,6 @@
import sys

from django.http import HttpResponse
from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from django.views.debug import technical_500_response
from django.views.generic.create_update import create_object
Expand Down Expand Up @@ -36,3 +36,10 @@ def raises(request):
raise Exception
except Exception:
return technical_500_response(request, *sys.exc_info())

def redirect(request):
"""
Forces an HTTP redirect.
"""
return HttpResponseRedirect("target/")

0 comments on commit 87e6939

Please sign in to comment.