Fixed #10267 -- Correctly handle IRIs in HttpResponse.build_absolute_uri().

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10539 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2009-04-12 03:50:47 +00:00
parent 794f2d121e
commit 87e6939372
5 changed files with 37 additions and 9 deletions

View File

@ -72,7 +72,7 @@ class HttpRequest(object):
current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http', current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
self.get_host(), self.path) self.get_host(), self.path)
location = urljoin(current_uri, location) location = urljoin(current_uri, location)
return location return iri_to_uri(location)
def is_secure(self): def is_secure(self):
return os.environ.get("HTTPS") == "on" return os.environ.get("HTTPS") == "on"
@ -398,14 +398,14 @@ class HttpResponseRedirect(HttpResponse):
def __init__(self, redirect_to): def __init__(self, redirect_to):
HttpResponse.__init__(self) HttpResponse.__init__(self)
self['Location'] = iri_to_uri(redirect_to) self['Location'] = redirect_to
class HttpResponsePermanentRedirect(HttpResponse): class HttpResponsePermanentRedirect(HttpResponse):
status_code = 301 status_code = 301
def __init__(self, redirect_to): def __init__(self, redirect_to):
HttpResponse.__init__(self) HttpResponse.__init__(self)
self['Location'] = iri_to_uri(redirect_to) self['Location'] = redirect_to
class HttpResponseNotModified(HttpResponse): class HttpResponseNotModified(HttpResponse):
status_code = 304 status_code = 304

View File

@ -1,6 +1,7 @@
from defaults import *
from i18n import *
from static import *
from generic.date_based import *
from generic.create_update import *
from debug import * 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 *

View File

@ -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 File

@ -1,3 +1,4 @@
# coding: utf-8
from os import path from os import path
from django.conf.urls.defaults import * from django.conf.urls.defaults import *
@ -38,6 +39,10 @@ urlpatterns = patterns('',
# Static views # Static views
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': media_dir}), (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. # Date-based generic views.

View File

@ -1,6 +1,6 @@
import sys import sys
from django.http import HttpResponse from django.http import HttpResponse, HttpResponseRedirect
from django import forms from django import forms
from django.views.debug import technical_500_response from django.views.debug import technical_500_response
from django.views.generic.create_update import create_object from django.views.generic.create_update import create_object
@ -36,3 +36,10 @@ def raises(request):
raise Exception raise Exception
except Exception: except Exception:
return technical_500_response(request, *sys.exc_info()) return technical_500_response(request, *sys.exc_info())
def redirect(request):
"""
Forces an HTTP redirect.
"""
return HttpResponseRedirect("target/")