Changeset 1166
- Timestamp:
- 06/27/06 21:40:37
- Files:
-
- trunk/cherrypy/_cprequest.py (modified) (2 diffs)
- trunk/cherrypy/lib/http.py (modified) (4 diffs)
- trunk/cherrypy/test/test_core.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/_cprequest.py
r1157 r1166 275 275 for name, value in self.header_list: 276 276 value = value.strip() 277 277 278 # Warning: if there is more than one header entry for cookies (AFAIK, 278 279 # only Konqueror does that), only the last one will remain in headers 279 280 # (but they will be correctly stored in request.simple_cookie). 280 self.headers[name] = value281 self.headers[name] = http.decode_TEXT(value) 281 282 282 283 # Handle cookies differently because on Konqueror, multiple … … 688 689 name, value = line.split(": ", 1) 689 690 self.header_list.append((name, value)) 691 692 self.header_list = [(k, http.encode_TEXT(v)) for k, v in self.header_list] trunk/cherrypy/lib/http.py
r1164 r1166 21 21 22 22 import cgi 23 from email.Header import Header, decode_header 23 24 import re 24 25 import rfc822 … … 97 98 self.params = params 98 99 100 def __unicode__(self): 101 p = [";%s=%s" % (k, v) for k, v in self.params.iteritems()] 102 return u"%s%s" % (self.value, "".join(p)) 103 99 104 def __str__(self): 100 p = [";%s=%s" % (k, v) for k, v in self.params.iteritems()] 101 return "%s%s" % (self.value, "".join(p)) 105 return str(self.__unicode__()) 102 106 103 107 def parse(elementstr): … … 180 184 return result 181 185 186 def encode_TEXT(value): 187 """Encode RFC-2047 TEXT (e.g. u"\u8200" -> "=?utf-8?b?6IiA?=").""" 188 try: 189 value = value.encode("iso-8859-1") 190 except UnicodeEncodeError: 191 value = value.encode("utf-8") 192 value = Header(value, 'utf-8').encode() 193 return value 194 195 def decode_TEXT(value): 196 """Decode RFC-2047 TEXT (e.g. "=?utf-8?q?f=C3=BCr?=" -> u"f\xfcr").""" 197 atoms = decode_header(value) 198 decodedvalue = "" 199 for atom, charset in atoms: 200 if charset is not None: 201 atom = atom.decode(charset) 202 decodedvalue += atom 203 return decodedvalue 182 204 183 205 def validStatus(status): … … 382 404 valueList = [valueList] 383 405 for value in valueList: 384 header_list.append((order, (key, str(value))))406 header_list.append((order, (key, unicode(value)))) 385 407 header_list.sort() 386 408 return [item[1] for item in header_list] trunk/cherrypy/test/test_core.py
r1156 r1166 277 277 278 278 return "double header test" 279 280 279 280 def ifmatch(self): 281 val = cherrypy.request.headers['If-Match'] 282 cherrypy.response.headers['ETag'] = val 283 return repr(val) 284 285 281 286 class HeaderElements(Test): 282 287 283 288 def get_elements(self, headername): 284 289 e = cherrypy.request.headers.elements(headername) 285 return "\n".join([ str(x) for x in e])290 return "\n".join([unicode(x) for x in e]) 286 291 287 292 … … 743 748 'Expires', 'Location', 'Server']: 744 749 self.assertEqual(hnames.count(key), 1) 750 751 # Test RFC-2047-encoded request and response header values 752 self.getPage("/headers/ifmatch", 753 [('If-Match', '=?utf-8?q?=E2=84=ABngstr=C3=B6m?=')]) 754 self.assertHeader("ETag", '=?utf-8?b?4oSrbmdzdHLDtm0=?=') 755 self.assertBody("u'\\u212bngstr\\xf6m'") 745 756 746 757 def testHTTPMethods(self):

