mirror of
https://github.com/python/cpython.git
synced 2025-09-01 14:38:00 +00:00
bpo-27682: Handle client connection terminations in wsgiref (GH-9713)
This commit is contained in:
parent
18029d80bd
commit
3d37ea25dc
3 changed files with 24 additions and 0 deletions
|
@ -788,6 +788,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…
Add table
Add a link
Reference in a new issue