@@ -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