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

Changeset 1200

Show
Ignore:
Timestamp:
07/10/06 23:31:56
Author:
fumanchu
Message:

Moved RFC 2047 encoding into http.HeaderMap?. Changed HeaderMap?.sorted_list to HeaderMap?.output (which does not sort).

Files:

Legend:

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

    r1193 r1200  
    658658            stream = False 
    659659         
     660        headers = self.headers 
    660661        if stream: 
    661             try: 
    662                 del self.headers['Content-Length'] 
    663             except KeyError: 
    664                 pass 
     662            headers.pop('Content-Length', None) 
    665663        else: 
    666664            # Responses which are not streamed should have a Content-Length, 
    667665            # but allow user code to set Content-Length if desired. 
    668             if self.headers.get('Content-Length') is None: 
     666            if dict.get(headers, 'Content-Length') is None: 
    669667                content = self.collapse_body() 
    670                 self.headers['Content-Length'] = len(content
     668                dict.__setitem__(headers, 'Content-Length', len(content)
    671669         
    672670        # Transform our header dict into a sorted list of tuples. 
    673         h = self.headers.sorted_list(
     671        self.header_list = h = headers.output(self.version
    674672         
    675673        cookie = self.simple_cookie.output() 
     
    678676                name, value = line.split(": ", 1) 
    679677                h.append((name, value)) 
    680          
    681         self.header_list = [] 
    682         for k, v in h: 
    683             if self.version >= (1, 1): 
    684                 v = http.encode_TEXT(v) 
    685             else: 
    686                 v = str(v) 
    687             # If there are any folds, make sure they are indented. 
    688             v = v.replace("\n", "\n ") 
    689             self.header_list.append((k, v)) 
    690  
  • trunk/cherrypy/lib/http.py

    r1199 r1200  
    186186    return result 
    187187 
    188 def encode_TEXT(value): 
    189     """Encode RFC-2047 TEXT (e.g. u"\u8200" -> "=?utf-8?b?6IiA?="). 
    190      
    191     Note that HTTP/1.0 says, "Words of *TEXT may contain octets from 
    192         character sets other than US-ASCII." and "Recipients of header 
    193         field TEXT containing octets outside the US-ASCII character 
    194         set may assume that they represent ISO-8859-1 characters." 
    195         So don't use this function for encoding HTTP/1.0 values. 
    196     """ 
    197      
    198     try: 
    199         value = value.encode("iso-8859-1") 
    200     except UnicodeEncodeError: 
    201         value = value.encode("utf-8") 
    202         value = Header(value, 'utf-8').encode() 
    203     return value 
    204  
    205188def decode_TEXT(value): 
    206189    """Decode RFC-2047 TEXT (e.g. "=?utf-8?q?f=C3=BCr?=" -> u"f\xfcr").""" 
     
    386369        return header_elements(key, h) 
    387370     
    388     general_fields = ["Cache-Control", "Connection", "Date", "Pragma", 
    389                       "Trailer", "Transfer-Encoding", "Upgrade", "Via", 
    390                       "Warning"] 
    391     response_fields = ["Accept-Ranges", "Age", "ETag", "Location", 
    392                        "Proxy-Authenticate", "Retry-After", "Server", 
    393                        "Vary", "WWW-Authenticate"] 
    394     entity_fields = ["Allow", "Content-Encoding", "Content-Language", 
    395                      "Content-Length", "Content-Location", "Content-MD5", 
    396                      "Content-Range", "Content-Type", "Expires", 
    397                      "Last-Modified"] 
    398      
    399     order_map = {} 
    400     for _ in general_fields: 
    401         order_map[_] = 0 
    402     for _ in response_fields: 
    403         order_map[_] = 1 
    404     for _ in entity_fields: 
    405         order_map[_] = 2 
    406      
    407     def sorted_list(self): 
    408         """Transform self into a sorted list of (name, value) tuples. 
    409          
    410         From http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 
    411             '... it is "good practice" to send general-header fields first, 
    412             followed by request-header or response-header fields, and ending 
    413             with the entity-header fields.' 
    414         """ 
    415          
     371    def output(self, version=(1, 1)): 
     372        """Transform self into a list of (name, value) tuples.""" 
    416373        header_list = [] 
    417         for key, valueList in self.iteritems(): 
    418             order = self.order_map.get(key, 3) 
    419             if not isinstance(valueList, list): 
    420                 valueList = [valueList] 
    421             for value in valueList: 
    422                 header_list.append((order, (key, unicode(value)))) 
    423         header_list.sort() 
    424         return [item[1] for item in header_list] 
     374        for key, value in self.iteritems(): 
     375            if not isinstance(value, list): 
     376                value = [value] 
     377            for v in value: 
     378                if isinstance(v, unicode): 
     379                    # Encode RFC-2047 TEXT (e.g. u"\u8200" -> "=?utf-8?b?6IiA?="). 
     380                    try: 
     381                        v = v.encode("iso-8859-1") 
     382                    except UnicodeEncodeError: 
     383                        # HTTP/1.0 says, "Words of *TEXT may contain octets 
     384                        # from character sets other than US-ASCII." and 
     385                        # "Recipients of header field TEXT containing octets 
     386                        # outside the US-ASCII character set may assume that 
     387                        # they represent ISO-8859-1 characters." 
     388                        if version >= (1, 1): 
     389                            v = v.encode("utf-8") 
     390                            v = Header(v, 'utf-8').encode() 
     391                        else: 
     392                            raise 
     393                else: 
     394                    # This coercion should not take any time at all 
     395                    # if value is already of type "str". 
     396                    v = str(v) 
     397                header_list.append((key, v)) 
     398        return header_list 
    425399 
    426400 

Hosted by WebFaction

Log in as guest/cpguest to create tickets