]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Use 'future_add_done_callback' to add callback. 2549/head
authorgarenchan <1412950785@qq.com>
Mon, 10 Dec 2018 11:16:38 +0000 (19:16 +0800)
committergarenchan <1412950785@qq.com>
Mon, 10 Dec 2018 11:39:12 +0000 (19:39 +0800)
The PR #2449 was incomplete, it omited consideration of another
branch of the 'flush' method. In short, the future returned by
'RequestHandler.finish()' may also be the return value of
'HTTP1Connection.write()'. So we should make the same change to
'HTTP1Connection.write()'.

Fix #2448.

tornado/http1connection.py
tornado/test/web_test.py

index 10402b4bf29cb553252df519133f1ad56d551fc1..0413fd9a6a1b8c737889334f91096fcf92bb87d3 100644 (file)
@@ -492,7 +492,7 @@ class HTTP1Connection(httputil.HTTPConnection):
         else:
             future = self._write_future = Future()
             self._pending_write = self.stream.write(self._format_chunk(chunk))
-            self._pending_write.add_done_callback(self._on_write_complete)
+            future_add_done_callback(self._pending_write, self._on_write_complete)
         return future
 
     def finish(self) -> None:
index a6f5d1bd0ec8d5a2b43fd1de1fc8f78bfe94fe6b..d43d46bcfd461119e9dea2edb426880fc73e773a 100644 (file)
@@ -224,6 +224,13 @@ class FinalReturnTest(WebTestCase):
                 test.final_return = self.finish()
                 yield test.final_return
 
+            @gen.coroutine
+            def post(self):
+                self.write("hello,")
+                yield self.flush()
+                test.final_return = self.finish("world")
+                yield test.final_return
+
         class RenderHandler(RequestHandler):
             def create_template_loader(self, path):
                 return DictLoader({"foo.html": "hi"})
@@ -243,6 +250,11 @@ class FinalReturnTest(WebTestCase):
         self.assertIsInstance(self.final_return, Future)
         self.assertTrue(self.final_return.done())
 
+        response = self.fetch(self.get_url("/finish"), method="POST", body=b"")
+        self.assertEqual(response.code, 200)
+        self.assertIsInstance(self.final_return, Future)
+        self.assertTrue(self.final_return.done())
+
     def test_render_method_return_future(self):
         response = self.fetch(self.get_url("/render"))
         self.assertEqual(response.code, 200)