[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. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@13748 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
dc00873da0
commit
4eb78b89ce
|
@ -303,13 +303,16 @@ class HttpResponse(object):
|
||||||
|
|
||||||
def __init__(self, content='', mimetype=None, status=None,
|
def __init__(self, content='', mimetype=None, status=None,
|
||||||
content_type=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
|
self._charset = settings.DEFAULT_CHARSET
|
||||||
if mimetype:
|
if mimetype:
|
||||||
content_type = mimetype # For backwards compatibility
|
content_type = mimetype # For backwards compatibility
|
||||||
if not content_type:
|
if not content_type:
|
||||||
content_type = "%s; charset=%s" % (settings.DEFAULT_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__'):
|
if not isinstance(content, basestring) and hasattr(content, '__iter__'):
|
||||||
self._container = content
|
self._container = content
|
||||||
self._is_string = False
|
self._is_string = False
|
||||||
|
@ -320,10 +323,7 @@ class HttpResponse(object):
|
||||||
if status:
|
if status:
|
||||||
self.status_code = status
|
self.status_code = status
|
||||||
|
|
||||||
# _headers is a mapping of the lower-case name to the original case of
|
self['Content-Type'] = content_type
|
||||||
# the header (required for working with legacy systems) and the header
|
|
||||||
# value.
|
|
||||||
self._headers = {'content-type': ('Content-Type', content_type)}
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
"""Full HTTP message, including headers."""
|
"""Full HTTP message, including headers."""
|
||||||
|
|
|
@ -204,9 +204,18 @@ class HttpResponseTests(unittest.TestCase):
|
||||||
r['value'] = u'test value'
|
r['value'] = u'test value'
|
||||||
self.failUnless(isinstance(r['value'], str))
|
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')
|
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.)
|
# The response also converts unicode keys to strings.)
|
||||||
r[u'test'] = 'testing key'
|
r[u'test'] = 'testing key'
|
||||||
l = list(r.items())
|
l = list(r.items())
|
||||||
|
|
Loading…
Reference in New Issue