From: Ben Darnell Date: Wed, 6 May 2015 05:14:05 +0000 (-0700) Subject: Echo the received websocket close code. X-Git-Tag: v4.2.0b1~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62ecb8026d51a373c655af74e617b8546b5d2a6d;p=thirdparty%2Ftornado.git Echo the received websocket close code. Fixes #1377. --- diff --git a/tornado/test/websocket_test.py b/tornado/test/websocket_test.py index 6b182d076..23a4324ce 100644 --- a/tornado/test/websocket_test.py +++ b/tornado/test/websocket_test.py @@ -224,7 +224,11 @@ class WebSocketTest(WebSocketBaseTestCase): 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 + code, reason = yield self.close_future + # The client echoed the close code it received to the server, + # so the server's close code (returned via close_future) is + # the same. + self.assertEqual(code, 1001) @gen_test def test_client_close_reason(self): diff --git a/tornado/websocket.py b/tornado/websocket.py index adf238bea..2f57b9909 100644 --- a/tornado/websocket.py +++ b/tornado/websocket.py @@ -835,7 +835,8 @@ class WebSocketProtocol13(WebSocketProtocol): self.handler.close_code = struct.unpack('>H', data[:2])[0] if len(data) > 2: self.handler.close_reason = to_unicode(data[2:]) - self.close() + # Echo the received close code, if any (RFC 6455 section 5.5.1). + self.close(self.handler.close_code) elif opcode == 0x9: # Ping self._write_frame(True, 0xA, data) @@ -886,6 +887,7 @@ class WebSocketClientConnection(simple_httpclient._HTTPConnection): self.read_queue = collections.deque() self.key = base64.b64encode(os.urandom(16)) self._on_message_callback = on_message_callback + self.close_code = self.close_reason = None scheme, sep, rest = request.url.partition(':') scheme = {'ws': 'http', 'wss': 'https'}[scheme]