def test_webframe_to_bytes_non_fragmented_with_mask(self): # generating a mask is usually random which is not good for testing WebSocketFrame.generate_mask = Mock(return_value=525161) f = WebSocketFrame(message="TEST DATA", headers=WebSocketFrameHeaders( mask=WebSocketFrame.generate_mask(), mask_flag=1)) self.assertEqual(f.to_bytes(), b'\x81\x89\x00\x08\x03iTMP= LB=A')
def observe(self, message, *args, connection=None, server=None, **kwargs): headers = WebSocketFrameHeaders(payload_length=len(message.message)) server_message = WebSocketFrame(headers=headers, message=message.message) for server_connection in server.connections: if server_connection != connection: self.send_frame(server_connection, server_message)
def test_webframe_from_bytes_non_fragmented_with_mask(self): bstr = b'\x81\x89\x13}\xfd\xb7G8\xae\xe339\xbc\xe3R' reader = self._get_mock_bytes_reader(bytes=bstr) f = WebSocketFrame.from_bytes_reader(reader) self.assertEqual(f.headers.mask, 327024055) self.assertEqual(f.headers.payload_length, 9) self.assertEqual(f.message, "TEST DATA")
def test_webframe_from_bytes_non_fragmented_no_mask(self): bstr = b'\x81\tTEST DATA' reader = self._get_mock_bytes_reader(bytes=bstr) f = WebSocketFrame.from_bytes_reader(reader) self.assertEqual(f.message, "TEST DATA") self.assertEqual(f.headers.payload_length, 9) self.assertIsNone(f.headers.mask)
def test_webframe_from_bytes_non_fragmented(self): data = b'\x81\x89I\x96k\xa8\x1d\xd38\xfci\xd2*\xfc\x08' reader = self._get_mock_bytes_reader(bytes=data) f = WebSocketFrame.from_bytes_reader(reader) self.assertEqual(f.message, "TEST DATA") self.assertEqual(f.headers.payload_length, 9) self.assertEqual(f.headers.opcode, 1) self.assertEqual(f.headers.mask_flag, 1) self.assertEqual(f.headers.mask, bits_value("01001001100101100110101110101000"))
def connection_handler(self, conn): bytes_reader = SocketBytesReader(conn) self.logger.debug("Websocket server handling incoming data") try: frame = WebSocketFrame.from_bytes_reader(bytes_reader) except (SocketException, ConnectionResetError): self.logger.warning( "Connection closed prematurely, marking for closing") conn.mark_for_closing() return None return frame
def observe(self, message, *args, connection=None, **kwargs): msg = WebSocketFrame.get_pong_frame(message=message) self.send_frame(connection, msg)
def close_connection(self, connection, message=None): # as soon as we know a CLOSE frame is received, send no other messages and close connection connection.clear_messages() msg = WebSocketFrame.get_close_frame(message) self.send_frame(connection, msg, flush_immediately=True) connection.close()
def observe(self, message, *args, connection=None, server=None, **kwargs): message = f"SteveSockets WebSocketServer has received your message of '{message.message}'!" connection.queue_message( WebSocketFrame.get_text_frame(message).to_bytes())
def test_webframe_to_bytes_non_fragmented_no_mask(self): f = WebSocketFrame(message="TEST DATA") bts = f.to_bytes() self.assertEqual(bts, b'\x81\tTEST DATA')
def test_webframe_premature_ending(self): bstr = b'\x819' reader = self._get_mock_bytes_reader(bytes=bstr) with self.assertRaises(StopIteration): WebSocketFrame.from_bytes_reader(reader)