From 3ad038f529f83b7732ff0161d90a2f330d6cf913 Mon Sep 17 00:00:00 2001 From: Woodie-07 <40068306+Woodie-07@users.noreply.github.com> Date: Tue, 30 May 2023 18:51:32 +0100 Subject: [PATCH 1/3] Update websocket_server.py --- websocket_server/websocket_server.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/websocket_server/websocket_server.py b/websocket_server/websocket_server.py index 083ee17..17862af 100644 --- a/websocket_server/websocket_server.py +++ b/websocket_server/websocket_server.py @@ -65,6 +65,9 @@ def client_left(self, client, server): def message_received(self, client, server, message): pass + def binary_recieved(self, client, server, message): + pass + def set_fn_new_client(self, fn): self.new_client = fn @@ -74,6 +77,9 @@ def set_fn_client_left(self, fn): def set_fn_message_received(self, fn): self.message_received = fn + def set_fn_binary_recieved(self, fn): + self.binary_recieved = fn + def send_message(self, client, msg): self._unicast(client, msg) @@ -162,6 +168,9 @@ def _run_forever(self, threaded): def _message_received_(self, handler, msg): self.message_received(self.handler_to_client(handler), self, msg) + def _binary_recieved_(self, handler, msg): + self.binary_recieved(self.handler_to_client(handler), self, msg) + def _ping_received_(self, handler, msg): handler.send_pong(msg) @@ -315,8 +324,7 @@ def read_next_message(self): logger.warning("Continuation frames are not supported.") return elif opcode == OPCODE_BINARY: - logger.warning("Binary frames are not supported.") - return + opcode_handler = self.server._binary_recieved_ elif opcode == OPCODE_TEXT: opcode_handler = self.server._message_received_ elif opcode == OPCODE_PING: @@ -338,7 +346,7 @@ def read_next_message(self): for message_byte in self.read_bytes(payload_length): message_byte ^= masks[len(message_bytes) % 4] message_bytes.append(message_byte) - opcode_handler(self, message_bytes.decode('utf8')) + opcode_handler(self, message_bytes.decode('utf8') if opcode != OPCODE_BINARY else message_bytes) def send_message(self, message): self.send_text(message) @@ -376,16 +384,15 @@ def send_text(self, message, opcode=OPCODE_TEXT): # Validate message if isinstance(message, bytes): - message = try_decode_UTF8(message) # this is slower but ensures we have UTF-8 - if not message: - logger.warning("Can\'t send message, message is not valid UTF-8") - return False + payload = message + opcode = OPCODE_BINARY elif not isinstance(message, str): logger.warning('Can\'t send message, message has to be a string or bytes. Got %s' % type(message)) return False + else: + payload = encode_to_UTF8(message) header = bytearray() - payload = encode_to_UTF8(message) payload_length = len(payload) # Normal payload From e5e27673cdee861318dfbc5fa559e32ccd7031c9 Mon Sep 17 00:00:00 2001 From: Woodie-07 <40068306+Woodie-07@users.noreply.github.com> Date: Mon, 12 Jun 2023 05:54:12 +0100 Subject: [PATCH 2/3] fix spelling --- websocket_server/websocket_server.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/websocket_server/websocket_server.py b/websocket_server/websocket_server.py index 17862af..c755cf8 100644 --- a/websocket_server/websocket_server.py +++ b/websocket_server/websocket_server.py @@ -65,7 +65,7 @@ def client_left(self, client, server): def message_received(self, client, server, message): pass - def binary_recieved(self, client, server, message): + def binary_received(self, client, server, message): pass def set_fn_new_client(self, fn): @@ -77,8 +77,8 @@ def set_fn_client_left(self, fn): def set_fn_message_received(self, fn): self.message_received = fn - def set_fn_binary_recieved(self, fn): - self.binary_recieved = fn + def set_fn_binary_received(self, fn): + self.binary_received = fn def send_message(self, client, msg): self._unicast(client, msg) @@ -168,8 +168,8 @@ def _run_forever(self, threaded): def _message_received_(self, handler, msg): self.message_received(self.handler_to_client(handler), self, msg) - def _binary_recieved_(self, handler, msg): - self.binary_recieved(self.handler_to_client(handler), self, msg) + def _binary_received_(self, handler, msg): + self.binary_received(self.handler_to_client(handler), self, msg) def _ping_received_(self, handler, msg): handler.send_pong(msg) @@ -324,7 +324,7 @@ def read_next_message(self): logger.warning("Continuation frames are not supported.") return elif opcode == OPCODE_BINARY: - opcode_handler = self.server._binary_recieved_ + opcode_handler = self.server._binary_received_ elif opcode == OPCODE_TEXT: opcode_handler = self.server._message_received_ elif opcode == OPCODE_PING: From 13d33d49286484c4f052377e2a4214a8574b62f8 Mon Sep 17 00:00:00 2001 From: Woodie-07 <40068306+Woodie-07@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:54:30 +0100 Subject: [PATCH 3/3] add specific client disconnect --- websocket_server/websocket_server.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/websocket_server/websocket_server.py b/websocket_server/websocket_server.py index c755cf8..b9568e3 100644 --- a/websocket_server/websocket_server.py +++ b/websocket_server/websocket_server.py @@ -98,6 +98,9 @@ def shutdown_gracefully(self, status=CLOSE_STATUS_NORMAL, reason=DEFAULT_CLOSE_R def shutdown_abruptly(self): self._shutdown_abruptly() + def disconnect_client(self, client, status=CLOSE_STATUS_NORMAL, reason=DEFAULT_CLOSE_REASON): + self._disconnect_client(client, status, reason) + def disconnect_clients_gracefully(self, status=CLOSE_STATUS_NORMAL, reason=DEFAULT_CLOSE_REASON): self._disconnect_clients_gracefully(status, reason) @@ -242,6 +245,13 @@ def _shutdown_abruptly(self): self.server_close() self.shutdown() + def _disconnect_client(self, client, status=CLOSE_STATUS_NORMAL, reason=DEFAULT_CLOSE_REASON): + """ + Terminate a client gracefully without shutting down the server + """ + client["handler"].send_close(status, reason) + self._terminate_client_handler(client["handler"]) + def _disconnect_clients_gracefully(self, status=CLOSE_STATUS_NORMAL, reason=DEFAULT_CLOSE_REASON): """ Terminate clients gracefully without shutting down the server