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:
parent
794f2d121e
commit
87e6939372
|
@ -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
|
||||||
|
|
|
@ -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 *
|
||||||
|
|
|
@ -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/")
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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/")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue