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

Changeset 1554

Show
Ignore:
Timestamp:
12/22/06 03:23:47
Author:
fumanchu
Message:

wsgiserver optimization: no need for mimetools' subclass of rfc822.Message. Also inlined header transform into a single pass.

Files:

Legend:

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

    r1553 r1554  
    3939 
    4040import base64 
    41 import mimetools # todo: use email 
    4241import Queue 
    4342import os 
     
    7675socket_errors_to_ignore.append("timed out") 
    7776 
    78 # These are lowercase because mimetools.Message uses lowercase keys. 
    79 comma_separated_headers = [ 
    80     'accept', 'accept-charset', 'accept-encoding', 'accept-language', 
    81     'accept-ranges', 'allow', 'cache-control', 'connection', 'content-encoding', 
    82     'content-language', 'expect', 'if-match', 'if-none-match', 'pragma', 
    83     'proxy-authenticate', 'te', 'trailer', 'transfer-encoding', 'upgrade', 
    84     'vary', 'via', 'warning', 'www-authenticate', 
    85     ] 
    86  
     77comma_separated_headers = ['ACCEPT', 'ACCEPT-CHARSET', 'ACCEPT-ENCODING', 
     78    'ACCEPT-LANGUAGE', 'ACCEPT-RANGES', 'ALLOW', 'CACHE-CONTROL', 
     79    'CONNECTION', 'CONTENT-ENCODING', 'CONTENT-LANGUAGE', 'EXPECT', 
     80    'IF-MATCH', 'IF-NONE-MATCH', 'PRAGMA', 'PROXY-AUTHENTICATE', 'TE', 
     81    'TRAILER', 'TRANSFER-ENCODING', 'UPGRADE', 'VARY', 'VIA', 'WARNING', 
     82    'WWW-AUTHENTICATE'] 
    8783 
    8884class HTTPRequest(object): 
     
    224220         
    225221        # then all the http headers 
    226         headers = mimetools.Message(self.rfile) 
     222        headers = rfc822.Message(self.rfile) 
    227223        self.environ.update(self.parse_headers(headers)) 
    228224         
     
    294290        """Parse the given HTTP request message-headers.""" 
    295291        environ = {} 
    296         ct = headers.getheader("Content-type", "") 
     292        ct = headers.dict.get("content-type") 
    297293        if ct: 
    298294            environ["CONTENT_TYPE"] = ct 
    299         cl = headers.getheader("Content-length") or "" 
     295        cl = headers.dict.get("content-length") 
    300296        if cl: 
    301297            environ["CONTENT_LENGTH"] = cl 
    302298         
    303         # Must use keys() here for Python 2.3 (rfc822.Message had no __iter__). 
    304         for k in headers.keys(): 
    305             if k in ('transfer-encoding', 'content-type', 'content-length'): 
    306                 continue 
     299        for line in headers.headers: 
     300            if line[:1].isspace(): 
     301                v = line.strip() 
     302            else: 
     303                k, v = line.split(":", 1) 
     304                k, v = k.strip().upper(), v.strip() 
     305                envname = "HTTP_" + k.replace("-", "_") 
    307306             
    308             envname = "HTTP_" + k.upper().replace("-", "_") 
    309307            if k in comma_separated_headers: 
    310308                existing = environ.get(envname) 
    311309                if existing: 
    312                     environ[envname] = ", ".join([existing] + headers.getheaders(k)) 
    313                 else: 
    314                     environ[envname] = ", ".join(headers.getheaders(k)) 
    315             else: 
    316                 environ[envname] = headers[k] 
     310                    v = ", ".join((existing, v)) 
     311            environ[envname] = v 
     312         
    317313        return environ 
    318314     
     
    337333         
    338334        # Grab any trailer headers 
    339         headers = mimetools.Message(self.rfile) 
     335        headers = rfc822.Message(self.rfile) 
    340336        self.environ.update(self.parse_headers(headers)) 
    341337         

Hosted by WebFaction

Log in as guest/cpguest to create tickets