From b2d2cb4a314e4d084d7d726752c93afb18c55b4e Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Sat, 11 Sep 2010 01:41:53 +0000 Subject: [PATCH] Improved unicode-type, ASCII-convertible header handling in HttpResponse. Fixed #8765. Thanks to SmileyChris and semenov for working on this one. git-svn-id: http://code.djangoproject.com/svn/django/trunk@13740 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/http/__init__.py | 12 ++++++------ tests/regressiontests/httpwrappers/tests.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/django/http/__init__.py b/django/http/__init__.py index c3917a16b2..e585a713de 100644 --- a/django/http/__init__.py +++ b/django/http/__init__.py @@ -303,13 +303,16 @@ class HttpResponse(object): 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 @@ -320,10 +323,7 @@ class HttpResponse(object): 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.""" diff --git a/tests/regressiontests/httpwrappers/tests.py b/tests/regressiontests/httpwrappers/tests.py index 23aa526a37..d3991aad86 100644 --- a/tests/regressiontests/httpwrappers/tests.py +++ b/tests/regressiontests/httpwrappers/tests.py @@ -204,9 +204,18 @@ class HttpResponseTests(unittest.TestCase): 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())