Browse Source

bpo-29183: Fix double exceptions in wsgiref.handlers.BaseHandler (GH-12914)

pull/13430/head
Berker Peksag 7 years ago
committed by GitHub
parent
commit
7c59362a15
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      Lib/test/test_wsgiref.py
  2. 11
      Lib/wsgiref/handlers.py
  3. 3
      Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst

25
Lib/test/test_wsgiref.py

@ -806,6 +806,31 @@ class HandlerTests(TestCase):
self.assertFalse(stderr.getvalue())
def testDontResetInternalStateOnException(self):
class CustomException(ValueError):
pass
# We are raising CustomException here to trigger an exception
# during the execution of SimpleHandler.finish_response(), so
# we can easily test that the internal state of the handler is
# preserved in case of an exception.
class AbortingWriter:
def write(self, b):
raise CustomException
stderr = StringIO()
environ = {"SERVER_PROTOCOL": "HTTP/1.0"}
h = SimpleHandler(BytesIO(), AbortingWriter(), stderr, environ)
h.run(hello_app)
self.assertIn("CustomException", stderr.getvalue())
# Test that the internal state of the handler is preserved.
self.assertIsNotNone(h.result)
self.assertIsNotNone(h.headers)
self.assertIsNotNone(h.status)
self.assertIsNotNone(h.environ)
if __name__ == "__main__":
unittest.main()

11
Lib/wsgiref/handlers.py

@ -183,7 +183,16 @@ class BaseHandler:
for data in self.result:
self.write(data)
self.finish_content()
finally:
except:
# Call close() on the iterable returned by the WSGI application
# in case of an exception.
if hasattr(self.result, 'close'):
self.result.close()
raise
else:
# We only call close() when no exception is raised, because it
# will set status, result, headers, and environ fields to None.
# See bpo-29183 for more details.
self.close()

3
Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst

@ -0,0 +1,3 @@
Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` by calling
its :meth:`~wsgiref.handlers.BaseHandler.close` method only when no
exception is raised.
Loading…
Cancel
Save