components/python/cherrypy/patches/cp-ticket-847.patch
author pkidd <patrick.kidd@oracle.com>
Wed, 09 Nov 2016 08:50:05 -0800
branchs11u3-sru14-backport
changeset 7281 084dbeea9c92
parent 394 dffc35307ef2
permissions -rw-r--r--
25065852 23093717/22067764 need to be backed out of the Userland gate: causes 25064383

Index: cherrypy/wsgiserver/__init__.py
===================================================================
--- cherrypy/wsgiserver/__init__.py	(revision 2459)
+++ cherrypy/wsgiserver/__init__.py	(working copy)
@@ -291,6 +291,7 @@
         self.wsgi_app = wsgi_app
         
         self.ready = False
+        self.started_request = False
         self.started_response = False
         self.status = ""
         self.outheaders = []
@@ -318,6 +319,9 @@
         # (although your TCP stack might suffer for it: cf Apache's history
         # with FIN_WAIT_2).
         request_line = self.rfile.readline()
+        # Set started_request to True so communicate() knows to send 408
+        # from here on out.
+        self.started_request = True
         if not request_line:
             # Force self.ready = False so the connection will close.
             self.ready = False
@@ -1169,6 +1173,9 @@
                 # This order of operations should guarantee correct pipelining.
                 req.parse_request()
                 if not req.ready:
+                    # Something went wrong in the parsing (and the server has
+                    # probably already made a simple response). Return and
+                    # let the conn close.
                     return
                 
                 req.respond()
@@ -1178,7 +1185,10 @@
         except socket.error, e:
             errnum = e.args[0]
             if errnum == 'timed out':
-                if req and not req.sent_headers:
+                # Don't send a 408 if there is no oustanding request; only
+                # if we're in the middle of a request.
+                # See http://www.cherrypy.org/ticket/853
+                if req and req.started_request and not req.sent_headers:
                     req.simple_response("408 Request Timeout")
             elif errnum not in socket_errors_to_ignore:
                 if req and not req.sent_headers: