Ticket #5956: better_header_encoding_error.diff

File better_header_encoding_error.diff, 2.3 KB (added by jvloothuis, 8 years ago)
  • django/http/__init__.py

     
    277277            for key, value in self._headers.values()]) \
    278278            + '\n\n' + self.content
    279279
     280    def _convert_to_ascii(self, *values):
     281        "Convert all values to ascii strings"
     282        for value in values:
     283            if isinstance(value, unicode):
     284                try:
     285                    yield value.encode('us-ascii')
     286                except UnicodeError, e:
     287                    e.reason += ', HTTP response headers must be in US-ASCII format'
     288                    raise
     289            else:
     290                yield str(value)
     291
    280292    def __setitem__(self, header, value):
     293        header, value = self._convert_to_ascii(header, value)
    281294        self._headers[header.lower()] = (header, value)
    282295
    283296    def __delitem__(self, header):
  • tests/regressiontests/httpwrappers/tests.py

     
    391391>>> q.getlist('foo')
    392392[u'bar', u'\ufffd']
    393393
     394
     395######################################
     396# HttpResponse with Unicode headers  #
     397######################################
     398 
     399>>> r = HttpResponse()
     400 
     401If we insert a unicode value it will be converted to an ascii
     402string. This makes sure we comply with the HTTP specifications.
     403 
     404>>> r['value'] = u'test value'
     405>>> isinstance(r['value'], str)
     406True
     407
     408An error is raised When a unicode object with non-ascii is assigned.
     409
     410>>> r['value'] = u't\xebst value' # doctest:+ELLIPSIS
     411Traceback (most recent call last):
     412...
     413UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
     414 
     415The response also converts unicode keys to strings.
     416 
     417>>> r[u'test'] = 'testing key'
     418>>> list(sorted(r.items()))[1]
     419('test', 'testing key')
     420
     421It will also raise errors for keys with non-ascii data.
     422
     423>>> r[u't\xebst'] = 'testing key'  # doctest:+ELLIPSIS
     424Traceback (most recent call last):
     425...
     426UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
     427 
    394428"""
    395429
    396 from django.http import QueryDict
     430from django.http import QueryDict, HttpResponse
    397431
    398432if __name__ == "__main__":
    399433    import doctest
Back to Top