Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 1166

Show
Ignore:
Timestamp:
06/27/06 21:40:37
Author:
fumanchu
Message:

Added support for RFC 2047 encoding and decoding of header values.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/_cprequest.py

    r1157 r1166  
    275275        for name, value in self.header_list: 
    276276            value = value.strip() 
     277             
    277278            # Warning: if there is more than one header entry for cookies (AFAIK, 
    278279            # only Konqueror does that), only the last one will remain in headers 
    279280            # (but they will be correctly stored in request.simple_cookie). 
    280             self.headers[name] = value 
     281            self.headers[name] = http.decode_TEXT(value) 
    281282             
    282283            # Handle cookies differently because on Konqueror, multiple 
     
    688689                name, value = line.split(": ", 1) 
    689690                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  
    2121 
    2222import cgi 
     23from email.Header import Header, decode_header 
    2324import re 
    2425import rfc822 
     
    9798        self.params = params 
    9899     
     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     
    99104    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__()) 
    102106     
    103107    def parse(elementstr): 
     
    180184    return result 
    181185 
     186def 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 
     195def 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 
    182204 
    183205def validStatus(status): 
     
    382404                valueList = [valueList] 
    383405            for value in valueList: 
    384                 header_list.append((order, (key, str(value)))) 
     406                header_list.append((order, (key, unicode(value)))) 
    385407        header_list.sort() 
    386408        return [item[1] for item in header_list] 
  • trunk/cherrypy/test/test_core.py

    r1156 r1166  
    277277             
    278278            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     
    281286    class HeaderElements(Test): 
    282287         
    283288        def get_elements(self, headername): 
    284289            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]) 
    286291     
    287292     
     
    743748                    'Expires', 'Location', 'Server']: 
    744749            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'") 
    745756     
    746757    def testHTTPMethods(self): 

Hosted by WebFaction

Log in as guest/cpguest to create tickets