@@ -65,6 +65,9 @@ def client_left(self, client, server):
6565 def message_received (self , client , server , message ):
6666 pass
6767
68+ def binary_recieved (self , client , server , message ):
69+ pass
70+
6871 def set_fn_new_client (self , fn ):
6972 self .new_client = fn
7073
@@ -74,6 +77,9 @@ def set_fn_client_left(self, fn):
7477 def set_fn_message_received (self , fn ):
7578 self .message_received = fn
7679
80+ def set_fn_binary_recieved (self , fn ):
81+ self .binary_recieved = fn
82+
7783 def send_message (self , client , msg ):
7884 self ._unicast (client , msg )
7985
@@ -162,6 +168,9 @@ def _run_forever(self, threaded):
162168 def _message_received_ (self , handler , msg ):
163169 self .message_received (self .handler_to_client (handler ), self , msg )
164170
171+ def _binary_recieved_ (self , handler , msg ):
172+ self .binary_recieved (self .handler_to_client (handler ), self , msg )
173+
165174 def _ping_received_ (self , handler , msg ):
166175 handler .send_pong (msg )
167176
@@ -315,8 +324,7 @@ def read_next_message(self):
315324 logger .warning ("Continuation frames are not supported." )
316325 return
317326 elif opcode == OPCODE_BINARY :
318- logger .warning ("Binary frames are not supported." )
319- return
327+ opcode_handler = self .server ._binary_recieved_
320328 elif opcode == OPCODE_TEXT :
321329 opcode_handler = self .server ._message_received_
322330 elif opcode == OPCODE_PING :
@@ -338,7 +346,7 @@ def read_next_message(self):
338346 for message_byte in self .read_bytes (payload_length ):
339347 message_byte ^= masks [len (message_bytes ) % 4 ]
340348 message_bytes .append (message_byte )
341- opcode_handler (self , message_bytes .decode ('utf8' ))
349+ opcode_handler (self , message_bytes .decode ('utf8' ) if opcode != OPCODE_BINARY else message_bytes )
342350
343351 def send_message (self , message ):
344352 self .send_text (message )
@@ -376,16 +384,15 @@ def send_text(self, message, opcode=OPCODE_TEXT):
376384
377385 # Validate message
378386 if isinstance (message , bytes ):
379- message = try_decode_UTF8 (message ) # this is slower but ensures we have UTF-8
380- if not message :
381- logger .warning ("Can\' t send message, message is not valid UTF-8" )
382- return False
387+ payload = message
388+ opcode = OPCODE_BINARY
383389 elif not isinstance (message , str ):
384390 logger .warning ('Can\' t send message, message has to be a string or bytes. Got %s' % type (message ))
385391 return False
392+ else :
393+ payload = encode_to_UTF8 (message )
386394
387395 header = bytearray ()
388- payload = encode_to_UTF8 (message )
389396 payload_length = len (payload )
390397
391398 # Normal payload
0 commit comments