diff -r 568312ea04fa Lib/test/test_wsgiref.py --- a/Lib/test/test_wsgiref.py Sun Oct 14 04:17:50 2012 +0200 +++ b/Lib/test/test_wsgiref.py Wed Oct 17 23:29:22 2012 -0700 @@ -602,6 +602,25 @@ "\r\n".encode("iso-8859-1")+MSG)) self.assertIn("AssertionError", h.stderr.getvalue()) + def testCloseOnError(self): + side_effects = {'close_called': False} + MSG = b"Some output has been sent" + def error_app(e,s): + s("200 OK",[])(MSG) + class CrashyIterable(object): + def __iter__(self): + while True: + yield b'blah' + raise AssertionError("This should be caught by handler") + + def close(self): + side_effects['close_called'] = True + return CrashyIterable() + + h = ErrorHandler() + h.run(error_app) + self.assertEqual(side_effects['close_called'], True) + def testHeaderFormats(self): diff -r 568312ea04fa Lib/wsgiref/handlers.py --- a/Lib/wsgiref/handlers.py Sun Oct 14 04:17:50 2012 +0200 +++ b/Lib/wsgiref/handlers.py Wed Oct 17 23:29:22 2012 -0700 @@ -174,11 +174,13 @@ in the event loop to iterate over the data, and to call 'self.close()' once the response is finished. """ - if not self.result_is_file() or not self.sendfile(): - for data in self.result: - self.write(data) - self.finish_content() - self.close() + try: + if not self.result_is_file() or not self.sendfile(): + for data in self.result: + self.write(data) + self.finish_content() + finally: + self.close() def get_scheme(self): diff -r 568312ea04fa Misc/ACKS --- a/Misc/ACKS Sun Oct 14 04:17:50 2012 +0200 +++ b/Misc/ACKS Wed Oct 17 23:29:22 2012 -0700 @@ -1177,6 +1177,7 @@ Matthias Troffaes John Tromp Jason Trowbridge +Brent Tubbs Anthony Tuininga Erno Tukia David Turner