mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #18916 -- Allowed non-ASCII headers.
Thanks Malcolm Tredinnick for the review.
This commit is contained in:
@@ -11,6 +11,7 @@ from django.http import (QueryDict, HttpResponse, HttpResponseRedirect,
|
||||
SimpleCookie, BadHeaderError,
|
||||
parse_cookie)
|
||||
from django.test import TestCase
|
||||
from django.utils.encoding import smart_str
|
||||
from django.utils import six
|
||||
from django.utils import unittest
|
||||
|
||||
@@ -228,33 +229,52 @@ class QueryDictTests(unittest.TestCase):
|
||||
self.assertEqual(copy.deepcopy(q).encoding, 'iso-8859-15')
|
||||
|
||||
class HttpResponseTests(unittest.TestCase):
|
||||
def test_unicode_headers(self):
|
||||
|
||||
def test_headers_type(self):
|
||||
r = HttpResponse()
|
||||
|
||||
# If we insert a unicode value it will be converted to an ascii
|
||||
r['value'] = 'test value'
|
||||
self.assertTrue(isinstance(r['value'], str))
|
||||
# The following tests explicitly test types in addition to values
|
||||
# because in Python 2 u'foo' == b'foo'.
|
||||
|
||||
# An error is raised when a unicode object with non-ascii is assigned.
|
||||
self.assertRaises(UnicodeEncodeError, r.__setitem__, 'value', 't\xebst value')
|
||||
# ASCII unicode or bytes values are converted to native strings.
|
||||
r['key'] = 'test'
|
||||
self.assertEqual(r['key'], str('test'))
|
||||
self.assertIsInstance(r['key'], str)
|
||||
r['key'] = 'test'.encode('ascii')
|
||||
self.assertEqual(r['key'], str('test'))
|
||||
self.assertIsInstance(r['key'], str)
|
||||
|
||||
# An error is raised when a unicode object with non-ASCII format is
|
||||
# passed as initial mimetype or content_type.
|
||||
self.assertRaises(UnicodeEncodeError, HttpResponse,
|
||||
content_type='t\xebst value')
|
||||
# Latin-1 unicode or bytes values are also converted to native strings.
|
||||
r['key'] = 'café'
|
||||
self.assertEqual(r['key'], smart_str('café', 'latin-1'))
|
||||
self.assertIsInstance(r['key'], str)
|
||||
r['key'] = 'café'.encode('latin-1')
|
||||
self.assertEqual(r['key'], smart_str('café', 'latin-1'))
|
||||
self.assertIsInstance(r['key'], str)
|
||||
|
||||
# HttpResponse headers must be convertible to ASCII.
|
||||
self.assertRaises(UnicodeEncodeError, HttpResponse,
|
||||
content_type='t\xebst value')
|
||||
# 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)
|
||||
|
||||
# The response also converts unicode keys to strings.)
|
||||
r['test'] = 'testing key'
|
||||
# The response also converts unicode or bytes keys to strings, but requires
|
||||
# them to contain ASCII
|
||||
r = HttpResponse()
|
||||
r['foo'] = 'bar'
|
||||
l = list(r.items())
|
||||
l.sort()
|
||||
self.assertEqual(l[1], ('test', 'testing key'))
|
||||
self.assertEqual(l[0], ('foo', 'bar'))
|
||||
self.assertIsInstance(l[0][0], str)
|
||||
|
||||
r = HttpResponse()
|
||||
r[b'foo'] = 'bar'
|
||||
l = list(r.items())
|
||||
self.assertEqual(l[0], ('foo', 'bar'))
|
||||
self.assertIsInstance(l[0][0], str)
|
||||
|
||||
r = HttpResponse()
|
||||
self.assertRaises(UnicodeError, r.__setitem__, 'føø', 'bar')
|
||||
self.assertRaises(UnicodeError, r.__setitem__, 'føø'.encode('utf-8'), 'bar')
|
||||
|
||||
# It will also raise errors for keys with non-ascii data.
|
||||
self.assertRaises(UnicodeEncodeError, r.__setitem__, 't\xebst key', 'value')
|
||||
|
||||
def test_newlines_in_headers(self):
|
||||
# Bug #10188: Do not allow newlines in headers (CR or LF)
|
||||
|
||||
Reference in New Issue
Block a user