fix(webui): suppress restart handshake noise

This commit is contained in:
Xubin Ren
2026-06-02 16:18:57 +08:00
parent 21c60b0c97
commit 8bc4a80035
2 changed files with 74 additions and 0 deletions
+43
View File
@@ -7,6 +7,7 @@ import email.utils
import hmac
import http
import json
import logging
import mimetypes
import re
import secrets
@@ -116,6 +117,45 @@ def _host_for_url(host: str, port: int) -> str:
return f"{host}:{port}"
_OPENING_HANDSHAKE_FAILED_MESSAGE = "opening handshake failed"
def _exception_chain_has_disconnect(exc: BaseException | None) -> bool:
seen: set[int] = set()
while exc is not None:
ident = id(exc)
if ident in seen:
return False
seen.add(ident)
if isinstance(exc, (
BrokenPipeError,
ConnectionAbortedError,
ConnectionResetError,
ConnectionClosed,
)):
return True
exc = exc.__cause__ or exc.__context__
return False
class _WebSocketHandshakeNoiseFilter(logging.Filter):
"""Suppress noisy restart-time handshakes where the client already disconnected."""
def filter(self, record: logging.LogRecord) -> bool:
if record.getMessage() != _OPENING_HANDSHAKE_FAILED_MESSAGE:
return True
exc_info = record.exc_info
exc = exc_info[1] if isinstance(exc_info, tuple) and len(exc_info) >= 2 else None
return not _exception_chain_has_disconnect(exc)
def _websockets_server_logger() -> logging.Logger:
ws_logger = logging.getLogger("websockets.server")
if not any(isinstance(f, _WebSocketHandshakeNoiseFilter) for f in ws_logger.filters):
ws_logger.addFilter(_WebSocketHandshakeNoiseFilter())
return ws_logger
class WebSocketConfig(Base):
"""WebSocket server channel configuration.
@@ -1239,6 +1279,7 @@ class WebSocketChannel(BaseChannel):
from nanobot.utils.logging_bridge import redirect_lib_logging
redirect_lib_logging("websockets", level="WARNING")
ws_logger = _websockets_server_logger()
self._running = True
self._stop_event = asyncio.Event()
@@ -1290,6 +1331,7 @@ class WebSocketChannel(BaseChannel):
max_size=self.config.max_message_bytes,
ping_interval=self.config.ping_interval_s,
ping_timeout=self.config.ping_timeout_s,
logger=ws_logger,
)
with suppress(OSError):
path_obj.chmod(0o600)
@@ -1303,6 +1345,7 @@ class WebSocketChannel(BaseChannel):
ping_interval=self.config.ping_interval_s,
ping_timeout=self.config.ping_timeout_s,
ssl=ssl_context,
logger=ws_logger,
)
try:
assert self._stop_event is not None