Commits

mtre...@bcc190cf-cafb-0310-a4f2-bffc1f526a37  committed f407b6a

[1.2.X] Improved unicode-type, ASCII-convertible header handling in
HttpResponse.

Fixed #8765. Thanks to SmileyChris and semenov for working on this one.

Backport of r13740 from trunk.

  • Participants
  • Parent commits 626f1ba
  • Branches releases/1.2.X

Comments (0)

Files changed (2)

File django/http/__init__.py

 
     def __init__(self, content='', mimetype=None, status=None,
             content_type=None):
-        from django.conf import settings
+        # _headers is a mapping of the lower-case name to the original case of
+        # the header (required for working with legacy systems) and the header
+        # value.  Both the name of the header and its value are ASCII strings.
+        self._headers = {}
         self._charset = settings.DEFAULT_CHARSET
         if mimetype:
             content_type = mimetype     # For backwards compatibility
         if not content_type:
             content_type = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE,
-                    settings.DEFAULT_CHARSET)
+                    self._charset)
         if not isinstance(content, basestring) and hasattr(content, '__iter__'):
             self._container = content
             self._is_string = False
         if status:
             self.status_code = status
 
-        # _headers is a mapping of the lower-case name to the original case of
-        # the header (required for working with legacy systems) and the header
-        # value.
-        self._headers = {'content-type': ('Content-Type', content_type)}
+        self['Content-Type'] = content_type
 
     def __str__(self):
         """Full HTTP message, including headers."""

File tests/regressiontests/httpwrappers/tests.py

         r['value'] = u'test value'
         self.failUnless(isinstance(r['value'], str))
         
-        # An error is raised When a unicode object with non-ascii is assigned.
+        # An error is raised ~hen a unicode object with non-ascii is assigned.
         self.assertRaises(UnicodeEncodeError, r.__setitem__, 'value', u't\xebst value')
         
+        # An error is raised when  a unicode object with non-ASCII format is
+        # passed as initial mimetype or content_type.
+        self.assertRaises(UnicodeEncodeError, HttpResponse,
+                mimetype=u't\xebst value')
+
+        # HttpResponse headers must be convertible to ASCII.
+        self.assertRaises(UnicodeEncodeError, HttpResponse,
+                content_type=u't\xebst value')
+
         # The response also converts unicode keys to strings.)      
         r[u'test'] = 'testing key'
         l = list(r.items())