From 7df55d87d5e9e0aaf42ce6db45609e8ce0e8bf26 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Sun, 27 Nov 2022 17:42:09 +0100 Subject: [PATCH] Add compatibility with websockets 11.0. See https://github.com/aaugustin/websockets/pull/1269. --- sanic/server/protocols/websocket_protocol.py | 18 ++++++++++++------ sanic/server/websockets/impl.py | 13 ++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/sanic/server/protocols/websocket_protocol.py b/sanic/server/protocols/websocket_protocol.py index e55ebdd610..106c677244 100644 --- a/sanic/server/protocols/websocket_protocol.py +++ b/sanic/server/protocols/websocket_protocol.py @@ -1,7 +1,13 @@ from typing import TYPE_CHECKING, Optional, Sequence, cast -from websockets.connection import CLOSED, CLOSING, OPEN -from websockets.server import ServerConnection + +try: # websockets < 11.0 + from websockets.connection import CLOSED, CLOSING, OPEN + from websockets.server import ServerConnection as ServerProtocol +except ImportError: # websockets >= 11.0 + from websockets.protocol import CLOSED, CLOSING, OPEN + from websockets.server import ServerProtocol + from websockets.typing import Subprotocol from sanic.exceptions import ServerError @@ -90,7 +96,7 @@ async def websocket_handshake( try: if subprotocols is not None: # subprotocols can be a set or frozenset, - # but ServerConnection needs a list + # but ServerProtocol needs a list subprotocols = cast( Optional[Sequence[Subprotocol]], list( @@ -100,13 +106,13 @@ async def websocket_handshake( ] ), ) - ws_conn = ServerConnection( + ws_proto = ServerProtocol( max_size=self.websocket_max_size, subprotocols=subprotocols, state=OPEN, logger=logger, ) - resp: "http11.Response" = ws_conn.accept(request) + resp: "http11.Response" = ws_proto.accept(request) except Exception: msg = ( "Failed to open a WebSocket connection.\n" @@ -129,7 +135,7 @@ async def websocket_handshake( else: raise ServerError(resp.body, resp.status_code) self.websocket = WebsocketImplProtocol( - ws_conn, + ws_proto, ping_interval=self.websocket_ping_interval, ping_timeout=self.websocket_ping_timeout, close_timeout=self.websocket_timeout, diff --git a/sanic/server/websockets/impl.py b/sanic/server/websockets/impl.py index 6104c1f06b..ff9c55eea4 100644 --- a/sanic/server/websockets/impl.py +++ b/sanic/server/websockets/impl.py @@ -12,14 +12,21 @@ Union, ) -from websockets.connection import CLOSED, CLOSING, OPEN, Event from websockets.exceptions import ( ConnectionClosed, ConnectionClosedError, ConnectionClosedOK, ) from websockets.frames import Frame, Opcode -from websockets.server import ServerConnection + + +try: # websockets < 11.0 + from websockets.connection import CLOSED, CLOSING, OPEN, Event + from websockets.server import ServerConnection as ServerProtocol +except ImportError: # websockets >= 11.0 + from websockets.protocol import CLOSED, CLOSING, OPEN, Event + from websockets.server import ServerProtocol + from websockets.typing import Data from sanic.log import error_logger, logger @@ -30,7 +37,7 @@ class WebsocketImplProtocol: - connection: ServerConnection + connection: ServerProtocol io_proto: Optional[SanicProtocol] loop: Optional[asyncio.AbstractEventLoop] max_queue: int