Browse Source

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

See https://bugs.python.org/issue27682 and
https://github.com/python/cpython/pull/9713
Petter Strandmark 4 years ago
parent
commit
772eca0b02
3 changed files with 25 additions and 13 deletions
  1. 1 0
      AUTHORS
  2. 5 1
      django/core/servers/basehttp.py
  3. 19 12
      tests/servers/test_basehttp.py

+ 1 - 0
AUTHORS

@@ -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

+ 5 - 1
django/core/servers/basehttp.py

@@ -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):

+ 19 - 12
tests/servers/test_basehttp.py

@@ -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()