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

Changeset 875

Show
Ignore:
Timestamp:
12/16/05 23:44:25
Author:
fumanchu
Message:

New decoding_filter.default_encoding config entry, and better guessing/retry of form encoding.

Files:

Legend:

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

    r856 r875  
    66     
    77    def before_main(self): 
    8         if not cherrypy.config.get('decoding_filter.on', False): 
     8        conf = cherrypy.config.get 
     9         
     10        if not conf('decoding_filter.on', False): 
    911            return 
    1012         
    11         enc = cherrypy.config.get('decoding_filter.encoding', 'utf-8') 
     13        enc = conf('decoding_filter.encoding', None) 
     14        if not enc: 
     15            ct = cherrypy.request.headers.elements("Content-Type") 
     16            if ct is not None: 
     17                ct = ct[0] 
     18                enc = ct.params.get("charset", None) 
     19                if (not enc) and ct.value.lower().startswith("text/"): 
     20                    # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1 
     21                    # When no explicit charset parameter is provided by the 
     22                    # sender, media subtypes of the "text" type are defined 
     23                    # to have a default charset value of "ISO-8859-1" when 
     24                    # received via HTTP. 
     25                    enc = "ISO-8859-1" 
     26             
     27            if not enc: 
     28                enc = conf('decoding_filter.default_encoding', "utf-8") 
     29         
     30        try: 
     31            self.decode(enc) 
     32        except UnicodeDecodeError: 
     33            # IE and Firefox don't supply a charset when submitting form 
     34            # params with a CT of application/x-www-form-urlencoded. 
     35            # So after all our guessing, it could *still* be wrong. 
     36            # Start over with ISO-8859-1, since that seems to be preferred. 
     37            self.decode("ISO-8859-1") 
     38     
     39    def decode(self, enc): 
     40        decodedParams = {} 
    1241        for key, value in cherrypy.request.params.items(): 
    1342            if hasattr(value, 'file'): 
    1443                # This is a file being uploaded: skip it 
    15                 continue 
     44                decodedParams[key] = value 
    1645            if isinstance(value, list): 
    1746                # value is a list: decode each element 
    18                 newValue = [v.decode(enc) for v in value] 
     47                decodedParams[key] = [v.decode(enc) for v in value] 
    1948            else: 
    2049                # value is a regular string: decode it 
    21                 newValue = value.decode(enc) 
    22             cherrypy.request.params[key] = newValue 
     50                decodedParams[key] = value.decode(enc) 
     51         
     52        # Decode all or nothing, so we can try again on error. 
     53        cherrypy.request.params = decodedParams 
    2354 

Hosted by WebFaction

Log in as guest/cpguest to create tickets