From 9bc3dced6c1f582dde0496961d25170b448ad8d7 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Mon, 30 Jun 2025 18:32:21 +0100 Subject: [PATCH] Handle partial reads in WebSocket class (Fixes #294) --- src/microdot/websocket.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/microdot/websocket.py b/src/microdot/websocket.py index 0fb6f7c..63087e1 100644 --- a/src/microdot/websocket.py +++ b/src/microdot/websocket.py @@ -149,18 +149,18 @@ class WebSocket: raise WebSocketError('Websocket connection closed') fin, opcode, has_mask, length = self._parse_frame_header(header) if length == -2: - length = await self.request.sock[0].read(2) + length = await self.request.sock[0].readexactly(2) length = int.from_bytes(length, 'big') elif length == -8: - length = await self.request.sock[0].read(8) + length = await self.request.sock[0].readexactly(8) length = int.from_bytes(length, 'big') max_allowed_length = Request.max_body_length \ if self.max_message_length == -1 else self.max_message_length if length > max_allowed_length: raise WebSocketError('Message too large') if has_mask: # pragma: no cover - mask = await self.request.sock[0].read(4) - payload = await self.request.sock[0].read(length) + mask = await self.request.sock[0].readexactly(4) + payload = await self.request.sock[0].readexactly(length) if has_mask: # pragma: no cover payload = bytes(x ^ mask[i % 4] for i, x in enumerate(payload)) return opcode, payload