diff --git a/README.rst b/README.rst index 8302765..d5c8bb3 100644 --- a/README.rst +++ b/README.rst @@ -206,7 +206,8 @@ ChangeLog - v0.19.0 - -suppress close event message(#107) + - suppress close event message(#107) + - detect socket connection state(#109) - v0.18.0 diff --git a/tests/test_websocket.py b/tests/test_websocket.py index 26dd59c..0d0b250 100644 --- a/tests/test_websocket.py +++ b/tests/test_websocket.py @@ -29,7 +29,6 @@ from websocket._core import _parse_url, _create_sec_websocket_key # Skip test to access the internet. TEST_WITH_INTERNET = False -# TEST_WITH_INTERNET = True # Skip Secure WebSocket test. TEST_SECURE_WS = False @@ -62,6 +61,9 @@ class SockMock(object): self.sent.append(data) return len(data) + def close(self): + pass + class HeaderSockMock(SockMock): @@ -287,6 +289,20 @@ class WebSocketTest(unittest.TestCase): with self.assertRaises(ws.WebSocketConnectionClosedException): sock.recv() + def testClose(self): + sock = ws.WebSocket() + sock.sock = SockMock() + sock.connected = True + sock.close() + self.assertEqual(sock.connected, False) + + sock = ws.WebSocket() + s = sock.sock = SockMock() + sock.connected = True + s.add_packet(six.b('\x88\x80\x17\x98p\x84')) + sock.recv() + self.assertEqual(sock.connected, False) + def testRecvContFragmentation(self): sock = ws.WebSocket() s = sock.sock = SockMock() diff --git a/websocket/_core.py b/websocket/_core.py index e7c125f..c9d0e39 100644 --- a/websocket/_core.py +++ b/websocket/_core.py @@ -787,6 +787,7 @@ class WebSocket(object): """ if status < 0 or status >= ABNF.LENGTH_16: raise ValueError("code is invalid range") + self.connected = False self.send(struct.pack('!H', status) + reason, ABNF.OPCODE_CLOSE) def close(self, status=STATUS_NORMAL, reason=six.b("")):