Fixed #32240 -- Made runserver suppress ConnectionAbortedError/ConnectionResetError errors.

See https://bugs.python.org/issue27682 and
https://github.com/python/cpython/pull/9713
This commit is contained in:
Petter Strandmark 2020-12-03 08:46:03 +01:00 committed by Mariusz Felisiak
parent 28124e7bdf
commit 772eca0b02
3 changed files with 25 additions and 13 deletions

View File

@ -736,6 +736,7 @@ answer newbie questions, and generally made Django that much better:
Peter Zsoldos <http://zsoldosp.eu>
Pete Shinners <pete@shinners.org>
Petr Marhoun <petr.marhoun@gmail.com>
Petter Strandmark
pgross@thoughtworks.com
phaedo <http://phaedo.cx/>
phil.h.smith@gmail.com

View File

@ -52,7 +52,11 @@ def get_internal_wsgi_application():
def is_broken_pipe_error():
exc_type, _, _ = sys.exc_info()
return issubclass(exc_type, BrokenPipeError)
return issubclass(exc_type, (
BrokenPipeError,
ConnectionAbortedError,
ConnectionResetError,
))
class WSGIServer(simple_server.WSGIServer):

View File

@ -113,15 +113,22 @@ class WSGIServerTestCase(SimpleTestCase):
request = WSGIRequest(self.request_factory.get('/').environ)
client_address = ('192.168.2.0', 8080)
msg = f'- Broken pipe from {client_address}\n'
try:
server = WSGIServer(('localhost', 0), WSGIRequestHandler)
try:
raise BrokenPipeError()
except Exception:
with captured_stderr() as err:
with self.assertLogs('django.server', 'INFO') as cm:
server.handle_error(request, client_address)
self.assertEqual(err.getvalue(), '')
self.assertEqual(cm.records[0].getMessage(), msg)
finally:
server.server_close()
tests = [
BrokenPipeError,
ConnectionAbortedError,
ConnectionResetError,
]
for exception in tests:
with self.subTest(exception=exception):
try:
server = WSGIServer(('localhost', 0), WSGIRequestHandler)
try:
raise exception()
except Exception:
with captured_stderr() as err:
with self.assertLogs('django.server', 'INFO') as cm:
server.handle_error(request, client_address)
self.assertEqual(err.getvalue(), '')
self.assertEqual(cm.records[0].getMessage(), msg)
finally:
server.server_close()