self._header_callback = stack_context.wrap(self._on_headers)
self.stream.read_until(b"\r\n\r\n", self._header_callback)
self._write_callback = None
+ self._close_callback = None
+
+ def set_close_callback(self, callback):
+ self._close_callback = stack_context.wrap(callback)
+ self.stream.set_close_callback(self._on_connection_close)
+
+ def _on_connection_close(self):
+ callback = self._close_callback
+ self._close_callback = None
+ callback()
+ # Delete any unfinished callbacks to break up reference cycles.
+ self._write_callback = None
def close(self):
self.stream.close()
cb = self._close_callback
self._close_callback = None
self._run_callback(cb)
+ # Delete any unfinished callbacks to break up reference cycles.
+ self._read_callback = self._write_callback = None
def reading(self):
"""Returns true if we are currently reading from the stream."""
self.clear()
# Check since connection is not available in WSGI
if getattr(self.request, "connection", None):
- self.request.connection.stream.set_close_callback(
+ self.request.connection.set_close_callback(
self.on_connection_close)
self.initialize(**kwargs)
* Python 2.5 is no longer supported.
* Installation under Python 3 no longer uses ``2to3``.
* `tornado.util.b` (which was only intended for internal use) is gone.
+* Fixed a memory leak involving ``gen.engine``, `RequestHandler.flush`,
+ and clients closing connections while output is being written.
+* `tornado.httpserver.HTTPConnection` now has a `set_close_callback`
+ method that should be used instead of reaching into its ``stream``
+ attribute.