Changeset 1569
- Timestamp:
- 12/28/06 13:53:28
- Files:
-
- branches/cherrypy-2.x/cherrypy/_cphttptools.py (modified) (2 diffs)
- branches/cherrypy-2.x/cherrypy/lib/httptools.py (modified) (4 diffs)
- branches/cherrypy-2.x/cherrypy/test/test.py (modified) (1 diff)
- branches/cherrypy-2.x/cherrypy/test/test_core.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/cherrypy-2.x/cherrypy/_cphttptools.py
r1521 r1569 196 196 # only Konqueror does that), only the last one will remain in headers 197 197 # (but they will be correctly stored in request.simple_cookie). 198 self.headers[name] = value198 self.headers[name] = httptools.decode_TEXT(value) 199 199 200 200 # Handle cookies differently because on Konqueror, multiple … … 427 427 428 428 # Transform our header dict into a sorted list of tuples. 429 self.header_list = self.headers.sorted_list( )429 self.header_list = self.headers.sorted_list(protocol=self.version) 430 430 431 431 cookie = self.simple_cookie.output() branches/cherrypy-2.x/cherrypy/lib/httptools.py
r1489 r1569 17 17 18 18 import cgi 19 from email.Header import Header, decode_header 19 20 import re 20 21 import time … … 262 263 return result 263 264 265 def decode_TEXT(value): 266 """Decode RFC-2047 TEXT (e.g. "=?utf-8?q?f=C3=BCr?=" -> u"f\xfcr").""" 267 atoms = decode_header(value) 268 decodedvalue = "" 269 for atom, charset in atoms: 270 if charset is not None: 271 atom = atom.decode(charset) 272 decodedvalue += atom 273 return decodedvalue 264 274 265 275 def validStatus(status): … … 453 463 order_map[_] = 2 454 464 455 def sorted_list(self ):465 def sorted_list(self, protocol=(1, 0)): 456 466 """Transform self into a sorted list of (name, value) tuples. 457 467 … … 467 477 if not isinstance(valueList, list): 468 478 valueList = [valueList] 469 for value in valueList: 470 header_list.append((order, (key, str(value)))) 479 for v in valueList: 480 481 if isinstance(v, unicode): 482 # HTTP/1.0 says, "Words of *TEXT may contain octets 483 # from character sets other than US-ASCII." and 484 # "Recipients of header field TEXT containing octets 485 # outside the US-ASCII character set may assume that 486 # they represent ISO-8859-1 characters." 487 try: 488 v = v.encode("iso-8859-1") 489 except UnicodeEncodeError: 490 if protocol >= (1, 1): 491 # Encode RFC-2047 TEXT 492 # (e.g. u"\u8200" -> "=?utf-8?b?6IiA?="). 493 v = Header(v, 'utf-8').encode() 494 else: 495 raise 496 else: 497 # This coercion should not take any time at all 498 # if value is already of type "str". 499 v = str(v) 500 501 header_list.append((order, (key, v))) 471 502 header_list.sort() 472 503 return [item[1] for item in header_list] branches/cherrypy-2.x/cherrypy/test/test.py
r1567 r1569 92 92 self.protocol = "HTTP/1.1" 93 93 94 longopts = ['cover', 'profile', 'dumb', '1. 1', 'help',94 longopts = ['cover', 'profile', 'dumb', '1.0', 'help', 95 95 'basedir=', 'port=', 'server='] 96 96 longopts.extend(self.available_tests) branches/cherrypy-2.x/cherrypy/test/test_core.py
r1520 r1569 266 266 267 267 return "double header test" 268 269 268 269 def ifmatch(self): 270 val = cherrypy.request.headers['If-Match'] 271 cherrypy.response.headers['ETag'] = val 272 return repr(val) 273 274 270 275 class HeaderElements(Test): 271 276 … … 773 778 'Expires', 'Location', 'Server']: 774 779 self.assertEqual(hnames.count(key), 1) 780 781 if cherrypy.config.get('server.protocol_version') == "HTTP/1.1": 782 # Test RFC-2047-encoded request and response header values 783 c = "=E2=84=ABngstr=C3=B6m" 784 self.getPage("/headers/ifmatch", [('If-Match', '=?utf-8?q?%s?=' % c)]) 785 self.assertBody("u'\\u212bngstr\\xf6m'") 786 self.assertHeader("ETag", '=?utf-8?b?4oSrbmdzdHLDtm0=?=') 787 788 # Test a *LONG* RFC-2047-encoded request and response header value 789 self.getPage("/headers/ifmatch", 790 [('If-Match', '=?utf-8?q?%s?=' % (c * 10))]) 791 self.assertBody("u'%s'" % ('\\u212bngstr\\xf6m' * 10)) 792 self.assertHeader("ETag", 793 '=?utf-8?b?4oSrbmdzdHLDtm3ihKtuZ3N0csO2beKEq25nc3Ryw7Zt4oSrbmdzdHLDtm0=?=' 794 '=?utf-8?b?4oSrbmdzdHLDtm3ihKtuZ3N0csO2beKEq25nc3Ryw7Zt4oSrbmdzdHLDtm0=?=' 795 '=?utf-8?b?4oSrbmdzdHLDtm3ihKtuZ3N0csO2bQ==?=') 775 796 776 797 def testHTTPMethods(self):

