Skip to content

Commit 6a64314

Browse files
committed
Add lock to all socket.send
1 parent cf487b7 commit 6a64314

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

websocket_server/websocket_server.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ class WebSocketHandler(StreamRequestHandler):
219219

220220
def __init__(self, socket, addr, server):
221221
self.server = server
222+
assert not hasattr(self, "_send_lock"), "_send_lock already exists"
223+
self._send_lock = threading.Lock()
222224
if server.key and server.cert:
223225
try:
224226
socket = ssl.wrap_socket(socket, server_side=True, certfile=server.cert, keyfile=server.key)
@@ -321,7 +323,8 @@ def send_close(self, status=CLOSE_STATUS_NORMAL, reason=DEFAULT_CLOSE_REASON):
321323
# Send CLOSE with status & reason
322324
header.append(FIN | OPCODE_CLOSE_CONN)
323325
header.append(payload_length)
324-
self.request.send(header + payload)
326+
with self._send_lock:
327+
self.request.send(header + payload)
325328

326329
def send_text(self, message, opcode=OPCODE_TEXT):
327330
"""
@@ -364,7 +367,8 @@ def send_text(self, message, opcode=OPCODE_TEXT):
364367
raise Exception("Message is too big. Consider breaking it into chunks.")
365368
return
366369

367-
self.request.send(header + payload)
370+
with self._send_lock:
371+
self.request.send(header + payload)
368372

369373
def read_http_headers(self):
370374
headers = {}
@@ -397,7 +401,8 @@ def handshake(self):
397401
return
398402

399403
response = self.make_handshake_response(key)
400-
self.handshake_done = self.request.send(response.encode())
404+
with self._send_lock:
405+
self.handshake_done = self.request.send(response.encode())
401406
self.valid_client = True
402407
self.server._new_client_(self)
403408

0 commit comments

Comments
 (0)