From: Ben Darnell Date: Mon, 19 Jan 2015 01:40:09 +0000 (-0500) Subject: Call the WebSocketHandler.on_close method regardless of which side closed. X-Git-Tag: v4.1.0b1~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05c3073ce363a9030257ab344746adb8b1fc7fa1;p=thirdparty%2Ftornado.git Call the WebSocketHandler.on_close method regardless of which side closed. Closes #1173. --- diff --git a/tornado/test/websocket_test.py b/tornado/test/websocket_test.py index e1e3ea700..443ad8758 100644 --- a/tornado/test/websocket_test.py +++ b/tornado/test/websocket_test.py @@ -75,6 +75,7 @@ class NonWebSocketHandler(RequestHandler): class CloseReasonHandler(TestWebSocketHandler): def open(self): + self.on_close_called = False self.close(1001, "goodbye") @@ -221,6 +222,8 @@ class WebSocketTest(WebSocketBaseTestCase): self.assertIs(msg, None) self.assertEqual(ws.close_code, 1001) self.assertEqual(ws.close_reason, "goodbye") + # The on_close callback is called no matter which side closed. + yield self.close_future @gen_test def test_client_close_reason(self): diff --git a/tornado/websocket.py b/tornado/websocket.py index f11880887..5c1bab4e3 100644 --- a/tornado/websocket.py +++ b/tornado/websocket.py @@ -129,6 +129,7 @@ class WebSocketHandler(tornado.web.RequestHandler): self.close_code = None self.close_reason = None self.stream = None + self._on_close_called = False @tornado.web.asynchronous def get(self, *args, **kwargs): @@ -350,6 +351,8 @@ class WebSocketHandler(tornado.web.RequestHandler): if self.ws_connection: self.ws_connection.on_connection_close() self.ws_connection = None + if not self._on_close_called: + self._on_close_called self.on_close() def send_error(self, *args, **kwargs):