summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2013-10-17 18:07:47 +0200
committerClaude Paroz <claude@2xlibre.net>2013-10-17 18:15:56 +0200
commitb2f9c74ed1cd246022ab52d239eeb33f950dcc70 (patch)
tree9f0a0897440b704ec7d45ea1f2b3a0cb695e65c7
parent1241a2cc104d092ff0f03a16a664e9e4ab801dd1 (diff)
[1.6.x] Fixed #21282 -- Made HttpResponse.serialize_headers accept latin-1
Thanks Raphaël Barrois for the report and the initial patch and Aymeric Augustin for the review. Backport of a14f087233 from master.
-rw-r--r--django/http/response.py9
-rw-r--r--tests/httpwrappers/tests.py3
2 files changed, 9 insertions, 3 deletions
diff --git a/django/http/response.py b/django/http/response.py
index f522c0684b..83b01831b5 100644
--- a/django/http/response.py
+++ b/django/http/response.py
@@ -128,8 +128,11 @@ class HttpResponseBase(six.Iterator):
def serialize_headers(self):
"""HTTP headers as a bytestring."""
+ def to_bytes(val, encoding):
+ return val if isinstance(val, bytes) else val.encode(encoding)
+
headers = [
- ('%s: %s' % (key, value)).encode('us-ascii')
+ (b': '.join([to_bytes(key, 'ascii'), to_bytes(value, 'latin-1')]))
for key, value in self._headers.values()
]
return b'\r\n'.join(headers)
@@ -140,7 +143,7 @@ class HttpResponseBase(six.Iterator):
__str__ = serialize_headers
def _convert_to_charset(self, value, charset, mime_encode=False):
- """Converts headers key/value to ascii/latin1 native strings.
+ """Converts headers key/value to ascii/latin-1 native strings.
`charset` must be 'ascii' or 'latin-1'. If `mime_encode` is True and
`value` value can't be represented in the given charset, MIME-encoding
@@ -176,7 +179,7 @@ class HttpResponseBase(six.Iterator):
def __setitem__(self, header, value):
header = self._convert_to_charset(header, 'ascii')
- value = self._convert_to_charset(value, 'latin1', mime_encode=True)
+ value = self._convert_to_charset(value, 'latin-1', mime_encode=True)
self._headers[header.lower()] = (header, value)
def __delitem__(self, header):
diff --git a/tests/httpwrappers/tests.py b/tests/httpwrappers/tests.py
index 7eb11b1dc7..ed32ea0478 100644
--- a/tests/httpwrappers/tests.py
+++ b/tests/httpwrappers/tests.py
@@ -254,6 +254,7 @@ class HttpResponseTests(unittest.TestCase):
r['key'] = 'test'.encode('ascii')
self.assertEqual(r['key'], str('test'))
self.assertIsInstance(r['key'], str)
+ self.assertIn(b'test', r.serialize_headers())
# Latin-1 unicode or bytes values are also converted to native strings.
r['key'] = 'café'
@@ -262,11 +263,13 @@ class HttpResponseTests(unittest.TestCase):
r['key'] = 'café'.encode('latin-1')
self.assertEqual(r['key'], smart_str('café', 'latin-1'))
self.assertIsInstance(r['key'], str)
+ self.assertIn('café'.encode('latin-1'), r.serialize_headers())
# Other unicode values are MIME-encoded (there's no way to pass them as bytes).
r['key'] = '†'
self.assertEqual(r['key'], str('=?utf-8?b?4oCg?='))
self.assertIsInstance(r['key'], str)
+ self.assertIn(b'=?utf-8?b?4oCg?=', r.serialize_headers())
# The response also converts unicode or bytes keys to strings, but requires
# them to contain ASCII