components/python/cherrypy/patches/cp-ticket-847.patch
branchs11u3-sru14-backport
changeset 7281 084dbeea9c92
parent 394 dffc35307ef2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/python/cherrypy/patches/cp-ticket-847.patch	Wed Nov 09 08:50:05 2016 -0800
@@ -0,0 +1,44 @@
+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: