Issue #16220: wsgiref now always calls close() on an iterable response.

Patch by Brent Tubbs.
This commit is contained in:
Antoine Pitrou 2012-10-21 14:09:05 +02:00
parent 2778d0d147
commit ae247a5ff6
4 changed files with 29 additions and 36 deletions

View File

@ -656,40 +656,27 @@ class HandlerTests(TestCase):
b"data",
h.stdout.getvalue())
# This epilogue is needed for compatibility with the Python 2.5 regrtest module
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 test_main():
support.run_unittest(__name__)
if __name__ == "__main__":
test_main()
# the above lines intentionally left blank

View File

@ -174,11 +174,13 @@ class BaseHandler:
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):

View File

@ -1067,6 +1067,7 @@ Richard Townsend
Laurence Tratt
John Tromp
Jason Trowbridge
Brent Tubbs
Anthony Tuininga
Erno Tukia
David Turner

View File

@ -132,6 +132,9 @@ Core and Builtins
Library
-------
- Issue #16220: wsgiref now always calls close() on an iterable response.
Patch by Brent Tubbs.
- Issue #16270: urllib may hang when used for retrieving files via FTP by using
a context manager. Patch by Giampaolo Rodola'.