корректная обработка ошибки, когда чат занят другим клиентом
This commit is contained in:
parent
649834beae
commit
ee98eb09d9
1 changed files with 26 additions and 1 deletions
|
|
@ -4,6 +4,8 @@ import aiohttp
|
||||||
import asyncio
|
import asyncio
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
|
from aiohttp import WSServerHandshakeError
|
||||||
|
|
||||||
from lambda_agent_api.server import *
|
from lambda_agent_api.server import *
|
||||||
from lambda_agent_api.client import *
|
from lambda_agent_api.client import *
|
||||||
|
|
||||||
|
|
@ -46,7 +48,11 @@ class AgentApi:
|
||||||
self._listen_task: asyncio.Task | None = None
|
self._listen_task: asyncio.Task | None = None
|
||||||
|
|
||||||
async def connect(self):
|
async def connect(self):
|
||||||
"""Явное подключение к агенту."""
|
"""Явное подключение к агенту.
|
||||||
|
|
||||||
|
:raise AgentBusyException: Чат занят другим клиентом.
|
||||||
|
:raise AgentException: Непредвиденная ошибка протокола, см. code и details
|
||||||
|
"""
|
||||||
self._session = aiohttp.ClientSession()
|
self._session = aiohttp.ClientSession()
|
||||||
try:
|
try:
|
||||||
self._ws = await self._session.ws_connect(self.url, heartbeat=30)
|
self._ws = await self._session.ws_connect(self.url, heartbeat=30)
|
||||||
|
|
@ -88,6 +94,25 @@ class AgentApi:
|
||||||
await self._session.close()
|
await self._session.close()
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
except WSServerHandshakeError as e: # если при открытии подключения сервер вернул какую-то ошибку
|
||||||
|
if self._session and not self._session.closed:
|
||||||
|
await self._session.close()
|
||||||
|
|
||||||
|
# во-первых, aiohttp зачем-то приводит WS коды ошибок к HTTP.
|
||||||
|
# во-вторых, делает он это некорректно. Любой неизвестный код WS ошибки становится 403 HTTP
|
||||||
|
# в-третьих, он не передает оригинальное сообщение об ошибке.
|
||||||
|
# Т. е. какое бы сообщение сервер не отправлял, тут всегда будет "Invalid response status"
|
||||||
|
# см. site-packages\aiohttp\client.py, line 1104, in _ws_connect
|
||||||
|
# итого понять реальную причину ошибки почти невозможно. Нужно менять библиотеку
|
||||||
|
# сейчас сервер специально кидает только ошибку с WS кодом 1008 Policy Violation, когда внутри ловит ChatBusyError
|
||||||
|
# поэтому скорее всего, если мы получили WSServerHandshakeError с 403, то это внутренний ChatBusyError
|
||||||
|
if e.status != 403:
|
||||||
|
# обрабатываем как обычную ошибку WS по примеру except блока ниже
|
||||||
|
raise AgentException(code="CONNECTION_ERROR",
|
||||||
|
details=f"Failed to connect agent {self.id}: {e}") from e
|
||||||
|
|
||||||
|
raise AgentBusyException(f"Chat {self.chat_id} is already in use by other client")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Обработка всех остальных ошибок (например, aiohttp.ClientConnectionError)
|
# Обработка всех остальных ошибок (например, aiohttp.ClientConnectionError)
|
||||||
if self._ws and not self._ws.closed:
|
if self._ws and not self._ws.closed:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue