From 725c03e8ff0f4374a02a672619d09955180c0e8c Mon Sep 17 00:00:00 2001 From: Benoit Chesneau Date: Fri, 3 Apr 2026 23:53:03 +0200 Subject: [PATCH] Fix WebSocket binary send when text key is None ASGI allows websocket.send messages to contain both text and bytes keys where one is None. Check for truthy values instead of key existence. --- gunicorn/asgi/websocket.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gunicorn/asgi/websocket.py b/gunicorn/asgi/websocket.py index 0ff695bd..3fb10983 100644 --- a/gunicorn/asgi/websocket.py +++ b/gunicorn/asgi/websocket.py @@ -145,10 +145,13 @@ class WebSocketProtocol: if self.closed: raise RuntimeError("WebSocket closed") - if "text" in message: - await self._send_frame(OPCODE_TEXT, message["text"].encode("utf-8")) - elif "bytes" in message: - await self._send_frame(OPCODE_BINARY, message["bytes"]) + # Check for truthy values since both keys may be present with None + text = message.get("text") + bytes_data = message.get("bytes") + if text is not None: + await self._send_frame(OPCODE_TEXT, text.encode("utf-8")) + elif bytes_data is not None: + await self._send_frame(OPCODE_BINARY, bytes_data) elif msg_type == "websocket.close": code = message.get("code", CLOSE_NORMAL)