Commits

mtre...@bcc190cf-cafb-0310-a4f2-bffc1f526a37  committed 84c1709

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

  • Participants
  • Parent commits 1cdb82b

Comments (0)

Files changed (5)

File django/http/__init__.py

             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"
 
     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

File tests/regressiontests/views/tests/__init__.py

+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 *

File tests/regressiontests/views/tests/specials.py

+# 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/")
+

File tests/regressiontests/views/urls.py

+# coding: utf-8
 from os import path
 
 from django.conf.urls.defaults import *
 
     # 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.

File tests/regressiontests/views/views.py

 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
         raise Exception
     except Exception:
         return technical_500_response(request, *sys.exc_info())
+
+def redirect(request):
+    """
+    Forces an HTTP redirect.
+    """
+    return HttpResponseRedirect("target/")
+