]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix close_callback handling when the Future read interface is used.
authorBen Darnell <ben@bendarnell.com>
Sun, 23 Feb 2014 20:30:47 +0000 (15:30 -0500)
committerBen Darnell <ben@bendarnell.com>
Sun, 23 Feb 2014 20:30:47 +0000 (15:30 -0500)
tornado/iostream.py
tornado/test/iostream_test.py

index faf657a4c6e44a830b621f7897bff17b8d480212..113ee094d8ce1dea0438dc17a2dd5e3858e9b9f7 100644 (file)
@@ -449,6 +449,10 @@ class BaseIOStream(object):
             callback = self._read_callback
             self._read_callback = None
             self._run_callback(callback, data)
+        else:
+            # If we scheduled a callback, we will add the error listener
+            # afterwards.  If we didn't, we have to do it now.
+            self._maybe_add_error_listener()
 
     def _try_inline_read(self):
         """Attempt to complete the current read operation from buffered data.
index 35a4bd857dcce35813e6d2a281f772cf37adccc4..24b37b81c8c81ac3064be7e65f86c5917f66ccf9 100644 (file)
@@ -511,6 +511,28 @@ class TestIOStreamMixin(object):
             server.close()
             client.close()
 
+    def test_future_close_callback(self):
+        # Regression test for interaction between the Future read interfaces
+        # and IOStream._maybe_add_error_listener.
+        server, client = self.make_iostream_pair()
+        closed = [False]
+        def close_callback():
+            closed[0] = True
+            self.stop()
+        server.set_close_callback(close_callback)
+        try:
+            client.write(b'a')
+            future = server.read_bytes(1)
+            self.io_loop.add_future(future, self.stop)
+            self.assertEqual(self.wait().result(), b'a')
+            self.assertFalse(closed[0])
+            client.close()
+            self.wait()
+            self.assertTrue(closed[0])
+        finally:
+            server.close()
+            client.close()
+
 
 class TestIOStreamWebHTTP(TestIOStreamWebMixin, AsyncHTTPTestCase):
     def _make_client_iostream(self):