bpo-27682: Handle client connection terminations in wsgiref (GH-9713)
(cherry picked from commit 3d37ea25dc
)
Co-authored-by: Petter Strandmark <petter.strandmark@gmail.com>
This commit is contained in:
parent
5f5b187bfa
commit
47ffc1a9f6
|
@ -780,6 +780,24 @@ class HandlerTests(TestCase):
|
||||||
b"Hello, world!",
|
b"Hello, world!",
|
||||||
written)
|
written)
|
||||||
|
|
||||||
|
def testClientConnectionTerminations(self):
|
||||||
|
environ = {"SERVER_PROTOCOL": "HTTP/1.0"}
|
||||||
|
for exception in (
|
||||||
|
ConnectionAbortedError,
|
||||||
|
BrokenPipeError,
|
||||||
|
ConnectionResetError,
|
||||||
|
):
|
||||||
|
with self.subTest(exception=exception):
|
||||||
|
class AbortingWriter:
|
||||||
|
def write(self, b):
|
||||||
|
raise exception
|
||||||
|
|
||||||
|
stderr = StringIO()
|
||||||
|
h = SimpleHandler(BytesIO(), AbortingWriter(), stderr, environ)
|
||||||
|
h.run(hello_app)
|
||||||
|
|
||||||
|
self.assertFalse(stderr.getvalue())
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -136,6 +136,10 @@ class BaseHandler:
|
||||||
self.setup_environ()
|
self.setup_environ()
|
||||||
self.result = application(self.environ, self.start_response)
|
self.result = application(self.environ, self.start_response)
|
||||||
self.finish_response()
|
self.finish_response()
|
||||||
|
except (ConnectionAbortedError, BrokenPipeError, ConnectionResetError):
|
||||||
|
# We expect the client to close the connection abruptly from time
|
||||||
|
# to time.
|
||||||
|
return
|
||||||
except:
|
except:
|
||||||
try:
|
try:
|
||||||
self.handle_error()
|
self.handle_error()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:class:`wsgiref.handlers.BaseHandler` now handles abrupt client connection
|
||||||
|
terminations gracefully. Patch by Petter Strandmark.
|
Loading…
Reference in New Issue