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

Changeset 1011

Show
Ignore:
Timestamp:
03/21/06 13:02:26
Author:
fumanchu
Message:

Fix for #493 (connection not being closed properly).

Files:

Legend:

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

    r1000 r1011  
    8181                break 
    8282        else: 
    83             msg = "Not Found" 
    84             proto = self.environ.get("SERVER_PROTOCOL", "HTTP/1.0") 
    85             self.wfile.write("%s 404 %s\r\n" % (proto, msg)) 
    86             self.wfile.write("Content-Length: %s\r\n\r\n" % len(msg)) 
    87             self.wfile.write(msg) 
    88             self.wfile.flush() 
    89             self.ready = False 
     83            self.abort("404 Not Found") 
    9084            return 
    9185         
     
    106100        headers = mimetools.Message(self.rfile) 
    107101        self.environ["CONTENT_TYPE"] = headers.getheader("Content-type", "") 
    108         self.environ["CONTENT_LENGTH"] = headers.getheader("Content-length", "") 
     102        cl = headers.getheader("Content-length") 
     103        if method in ("POST", "PUT") and cl is None: 
     104            # No Content-Length header supplied. This will hang 
     105            # cgi.FieldStorage, since it cannot determine when to 
     106            # stop reading from the socket. Until we handle chunked 
     107            # encoding, always respond with 411 Length Required. 
     108            # See http://www.cherrypy.org/ticket/493. 
     109            self.abort("411 Length Required") 
     110            return 
     111        self.environ["CONTENT_LENGTH"] = cl or "" 
     112         
    109113        for (k, v) in headers.items(): 
    110114            envname = "HTTP_" + k.upper().replace("-","_") 
    111115            self.environ[envname] = v 
    112116        self.ready = True 
     117     
     118    def abort(self, status, msg=""): 
     119        """Write a simple error message back to the client.""" 
     120        proto = self.environ.get("SERVER_PROTOCOL", "HTTP/1.0") 
     121        self.wfile.write("%s %s\r\n" % (proto, status)) 
     122        self.wfile.write("Content-Length: %s\r\n\r\n" % len(msg)) 
     123        if msg: 
     124            self.wfile.write(msg) 
     125        self.wfile.flush() 
     126        self.ready = False 
    113127     
    114128    def start_response(self, status, headers, exc_info = None): 
     
    210224     
    211225    def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, 
    212                  max=-1, request_queue_size=5): 
    213         ''' 
    214         be careful w/ max 
    215         ''' 
     226                 max=-1, request_queue_size=5, timeout=10): 
     227        """Be careful w/ max""" 
    216228        self.requests = Queue.Queue(max) 
    217229         
     
    235247        self.request_queue_size = request_queue_size 
    236248        self._workerThreads = [] 
     249         
     250        self.timeout = timeout 
    237251     
    238252    def start(self): 
     
    310324        try: 
    311325            s, addr = self.socket.accept() 
    312             if hasattr(s, 'setblocking'): 
    313                 s.setblocking(1
     326            if hasattr(s, 'settimeout'): 
     327                s.settimeout(self.timeout
    314328            request = self.RequestHandlerClass(s, addr, self) 
    315329            self.requests.put(request) 

Hosted by WebFaction

Log in as guest/cpguest to create tickets