From: Ben Darnell Date: Sun, 3 Mar 2019 18:51:15 +0000 (-0500) Subject: websocket: Fix set_nodelay X-Git-Tag: v6.1.0b1~82^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4677c54cc18bbfbdf0f4dadf11610fab6203fd63;p=thirdparty%2Ftornado.git websocket: Fix set_nodelay This method was untested and broken in 6.0.0. Fixes #2611 --- diff --git a/tornado/test/websocket_test.py b/tornado/test/websocket_test.py index 715ecf1e1..d4b7a7412 100644 --- a/tornado/test/websocket_test.py +++ b/tornado/test/websocket_test.py @@ -198,6 +198,12 @@ class ErrorInAsyncOpenHandler(TestWebSocketHandler): raise Exception("boom") +class NoDelayHandler(TestWebSocketHandler): + def open(self): + self.set_nodelay(True) + self.write_message("hello") + + class WebSocketBaseTestCase(AsyncHTTPTestCase): @gen.coroutine def ws_connect(self, path, **kwargs): @@ -258,6 +264,7 @@ class WebSocketTest(WebSocketBaseTestCase): ), ("/error_in_open", ErrorInOpenHandler), ("/error_in_async_open", ErrorInAsyncOpenHandler), + ("/nodelay", NoDelayHandler), ], template_loader=DictLoader({"message.html": "{{ message }}"}), ) @@ -562,6 +569,12 @@ class WebSocketTest(WebSocketBaseTestCase): res = yield ws.read_message() self.assertIsNone(res) + @gen_test + def test_nodelay(self): + ws = yield self.ws_connect("/nodelay") + res = yield ws.read_message() + self.assertEqual(res, "hello") + class NativeCoroutineOnMessageHandler(TestWebSocketHandler): def initialize(self, **kwargs): diff --git a/tornado/websocket.py b/tornado/websocket.py index 00d08bab2..d991fee51 100644 --- a/tornado/websocket.py +++ b/tornado/websocket.py @@ -558,8 +558,8 @@ class WebSocketHandler(tornado.web.RequestHandler): .. versionadded:: 3.1 """ - assert self.stream is not None - self.stream.set_nodelay(value) + assert self.ws_connection is not None + self.ws_connection.set_nodelay(value) def on_connection_close(self) -> None: if self.ws_connection: @@ -714,6 +714,10 @@ class WebSocketProtocol(abc.ABC): async def _receive_frame_loop(self) -> None: raise NotImplementedError() + @abc.abstractmethod + def set_nodelay(self, x: bool) -> None: + raise NotImplementedError() + class _PerMessageDeflateCompressor(object): def __init__( @@ -1345,6 +1349,9 @@ class WebSocketProtocol13(WebSocketProtocol): self.write_ping(b"") self.last_ping = now + def set_nodelay(self, x: bool) -> None: + self.stream.set_nodelay(x) + class WebSocketClientConnection(simple_httpclient._HTTPConnection): """WebSocket client connection.