[Python] Asyncio.ws_connect not receiving a connection closure message

Discussão em 'Python' iniciado por Stack, Setembro 16, 2024.

  1. Stack

    Stack Membro Participativo

    async def _connect_session(self):
    websocket_url, headers, cookies = self._get_connect_data()
    try:
    async with aiohttp.ClientSession(cookies=cookies) as session:
    logger.debug(
    f"Connecting to WebSocket using proxy {self._api.get_proxy().url}"
    )
    async with session.ws_connect(
    websocket_url,
    headers=headers,
    proxy=self._api.get_proxy().url,
    verify_ssl=False,
    ) as connection:
    self.status = True
    self._connection = connection
    self._wait_connect_task.cancel()
    self._matches_controller_task = asyncio.create_task(self._matches_controller())
    logger.debug("Connected to websocket")
    self.ping_task = asyncio.create_task(self._ping(connection))
    await self._listen(connection)
    logger.error(f"WsApp closed {self}")
    self._destruct(WsClosed())
    except Exception as e:
    logger.exception(f"Exception in WsApp.connect {self}")
    self._destruct(e)


    async def _ping(self, connection: ClientWebSocketResponse):
    while True:
    try:
    await asyncio.sleep(19)
    await connection.send_str("2")
    except Exception as e:
    self._destruct(e)

    async def _listen(self, connection: ClientWebSocketResponse):
    while True:
    msg = await connection.receive()
    if msg.type == WSMsgType.TEXT:
    data: str = msg.data
    self._message_processor(data)
    elif msg.type in (
    WSMsgType.CLOSE,
    WSMsgType.CLOSED,
    WSMsgType.CLOSING,
    WSMsgType.ERROR,
    ):
    raise WsClosed()

    def _destruct(self, err: BaseException):
    self._callbacks.error_callback(self, err)
    if self._run_task is not None:
    self._run_task.cancel()

    if self._matches_controller_task is not None:
    self._matches_controller_task.cancel()


    if self.ping_task is not None:
    self.ping_task.cancel()


    `

    I have this code and my connection keeps closing when I try to send a message with a ping. Why doesn't _listen receive a connection close message? In the logger I only see trace errors from _ping, with no messages or errors from _listen

    Traceback (most recent call last):
    File "/opt/adapter/tipsport/tipsport_adapter/pipeline/single_match/data_providers/ws_provider/ws_app.py", line 139, in _ping
    await connection.send_str("2")
    File "/opt/adapter/.venv/lib/python3.11/site-packages/aiohttp/client_ws.py", line 225, in send_str
    await self._writer.send(data, binary=False, compress=compress)
    File "/opt/adapter/.venv/lib/python3.11/site-packages/aiohttp/http_websocket.py", line 726, in send
    await self._send_frame(message, WSMsgType.TEXT, compress)
    File "/opt/adapter/.venv/lib/python3.11/site-packages/aiohttp/http_websocket.py", line 626, in _send_frame
    raise ConnectionResetError("Cannot write to closing transport")
    ConnectionResetError: Cannot write to closing transport
    `

    Continue reading...

Compartilhe esta Página