Fixed #5956 -- Added a better error description for non-ASCII HTTP headers. Patch from jvloothuis.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6927 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
1fcb4e4bcd
commit
03f1eb23e5
|
@ -277,7 +277,20 @@ class HttpResponse(object):
|
|||
for key, value in self._headers.values()]) \
|
||||
+ '\n\n' + self.content
|
||||
|
||||
def _convert_to_ascii(self, *values):
|
||||
"Convert all values to ascii strings"
|
||||
for value in values:
|
||||
if isinstance(value, unicode):
|
||||
try:
|
||||
yield value.encode('us-ascii')
|
||||
except UnicodeError, e:
|
||||
e.reason += ', HTTP response headers must be in US-ASCII format'
|
||||
raise
|
||||
else:
|
||||
yield str(value)
|
||||
|
||||
def __setitem__(self, header, value):
|
||||
header, value = self._convert_to_ascii(header, value)
|
||||
self._headers[header.lower()] = (header, value)
|
||||
|
||||
def __delitem__(self, header):
|
||||
|
|
|
@ -391,9 +391,43 @@ u'\ufffd'
|
|||
>>> q.getlist('foo')
|
||||
[u'bar', u'\ufffd']
|
||||
|
||||
|
||||
######################################
|
||||
# HttpResponse with Unicode headers #
|
||||
######################################
|
||||
|
||||
>>> r = HttpResponse()
|
||||
|
||||
If we insert a unicode value it will be converted to an ascii
|
||||
string. This makes sure we comply with the HTTP specifications.
|
||||
|
||||
>>> r['value'] = u'test value'
|
||||
>>> isinstance(r['value'], str)
|
||||
True
|
||||
|
||||
An error is raised When a unicode object with non-ascii is assigned.
|
||||
|
||||
>>> r['value'] = u't\xebst value' # doctest:+ELLIPSIS
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
|
||||
|
||||
The response also converts unicode keys to strings.
|
||||
|
||||
>>> r[u'test'] = 'testing key'
|
||||
>>> list(sorted(r.items()))[1]
|
||||
('test', 'testing key')
|
||||
|
||||
It will also raise errors for keys with non-ascii data.
|
||||
|
||||
>>> r[u't\xebst'] = 'testing key' # doctest:+ELLIPSIS
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
|
||||
|
||||
"""
|
||||
|
||||
from django.http import QueryDict
|
||||
from django.http import QueryDict, HttpResponse
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
|
Loading…
Reference in New Issue