Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def close(self) -> None:
self.server.data_received(self.connection.send(CloseConnection(code=1000)))
try:
self.buffer.extend(event)
except FrameTooLarge:
self.write(
self.connection.send(CloseConnection(code=CloseReason.MESSAGE_TOO_BIG))
)
self.app_queue.put_nowait({"type": "websocket.disconnect"})
self.close()
break
if event.message_finished:
self.app_queue.put_nowait(self.buffer.to_message())
self.buffer.clear()
elif isinstance(event, Ping):
self.write(self.connection.send(event.response()))
elif isinstance(event, CloseConnection):
if self.connection.state == ConnectionState.REMOTE_CLOSING:
self.write(self.connection.send(event.response()))
self.app_queue.put_nowait({"type": "websocket.disconnect"})
self.close()
break
raise RuntimeError(msg % message_type)
elif not self.close_sent:
if message_type == "websocket.send":
bytes_data = message.get("bytes")
text_data = message.get("text")
data = text_data if bytes_data is None else bytes_data
output = self.conn.send(wsproto.events.Message(data=data))
if not self.transport.is_closing():
self.transport.write(output)
elif message_type == "websocket.close":
self.close_sent = True
code = message.get("code", 1000)
self.queue.put_nowait({"type": "websocket.disconnect", "code": code})
output = self.conn.send(wsproto.events.CloseConnection(code=code))
if not self.transport.is_closing():
self.transport.write(output)
self.transport.close()
else:
msg = "Expected ASGI message 'websocket.send' or 'websocket.close', but got '%s'."
raise RuntimeError(msg % message_type)
else:
msg = "Unexpected ASGI message '%s', after sending 'websocket.close'."
raise RuntimeError(msg % message_type)
message = "wsproto is great"
print("Sending message: {}".format(message))
net_send(ws.send(Message(data=message)), conn)
net_recv(ws, conn)
handle_events(ws)
# 3) Send ping and display pong
payload = b"table tennis"
print("Sending ping: {!r}".format(payload))
net_send(ws.send(Ping(payload=payload)), conn)
net_recv(ws, conn)
handle_events(ws)
# 4) Negotiate WebSocket closing handshake
print("Closing WebSocket")
net_send(ws.send(CloseConnection(code=1000, reason="sample reason")), conn)
# After sending the closing frame, we won't get any more events. The server
# should send a reply and then close the connection, so we need to receive
# twice:
net_recv(ws, conn)
conn.shutdown(socket.SHUT_WR)
net_recv(ws, conn)
self.connection.receive_data(data)
for event in self.connection.events():
if isinstance(event, Message):
try:
self.buffer.extend(event)
except FrameTooLarge:
await self.asend(CloseConnection(code=CloseReason.MESSAGE_TOO_BIG))
await self.asgi_put({"type": "websocket.disconnect"})
raise MustCloseError()
if event.message_finished:
await self.asgi_put(self.buffer.to_message())
self.buffer.clear()
elif isinstance(event, Ping):
await self.asend(event.response())
elif isinstance(event, CloseConnection):
if self.connection.state == ConnectionState.REMOTE_CLOSING:
await self.asend(event.response())
await self.asgi_put({"type": "websocket.disconnect"})
raise MustCloseError()
async def close(self, code=1000, reason='Closed.'):
await self.outgoing.put(
CloseConnection(code=code, reason=reason))