Django

Code

Changeset 6927

Show
Ignore:
Timestamp:
12/17/07 02:05:51 (7 months ago)
Author:
mtredinnick
Message:

Fixed #5956 -- Added a better error description for non-ASCII HTTP headers. Patch from jvloothuis.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/http/__init__.py

    r6895 r6927  
    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 
  • django/trunk/tests/regressiontests/httpwrappers/tests.py

    r6396 r6927  
    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__":