Skip to content

fix(websocket): 修复代理配置加载竞态条件导致的连接超时问题#183

Merged
chenyme merged 1 commit intochenyme:mainfrom
adamhj:proxy_fix
Feb 19, 2026
Merged

fix(websocket): 修复代理配置加载竞态条件导致的连接超时问题#183
chenyme merged 1 commit intochenyme:mainfrom
adamhj:proxy_fix

Conversation

@adamhj
Copy link
Contributor

@adamhj adamhj commented Feb 17, 2026

📝 问题背景

在受限网络环境下,用户反馈图片生成(Imagine WebSocket)接口频繁报错:
WebSocket connect failed: Cannot connect to host grok.com:443 [The semaphore timeout period has expired]
该错误表明应用在尝试直接连接 grok.com 时超时,未能正确使用用户配置的代理服务器。

🔍 原因分析

经过排查,发现项目中存在配置加载竞态条件

  1. 初始化过早ImagineWebSocketReverse 服务在应用启动的模块导入阶段(import)即被实例化。
  2. 配置未就绪:此时 FastAPI 的 lifespan 尚未运行,异步配置加载 await config.load() 还没有执行,因此 get_config("proxy.base_proxy_url") 返回的是默认的空字符串。
  3. 配置锁定WebSocketClient__init__ 中锁定了这个空值,导致后续所有连接都绕过了代理进行直连。

✨ 修复方案

  1. 动态配置解析:修改 WebSocketClient 类,将代理地址的读取逻辑从 __init__ 移动到 connect 异步方法中。确保在实际发起网络请求时,能够读取到已经加载完成的 data/config.toml 配置。
  2. 增强诊断日志:在 app/services/reverse/utils/websocket.py 中增加了调试日志,记录每次连接时解析出的代理 URL 和 Connector 类型,方便排查网络问题。
  3. 类型提示修复:修复了 aiohttp.ws_connect 在传递 **extra_kwargs 时的类型提示错误,提升了代码的健壮性。

🛠️ 影响范围

  • 修复了图片生成接口在启动初期的代理失效问题。
  • 自动优化了所有基于 WebSocketClient 的底层连接(包括实时语音 LiveKit 接口)。

✅ 验证建议

重启应用后观察日志,确认出现以下调试信息:
DEBUG | WebSocket connect: proxy_url=http://127.0.0.1:1080, resolved_proxy=http://127.0.0.1:1080, connector=TCPConnector

- Fix an issue where WebSocket connections (e.g., for image generation) failed with "semaphore timeout" because proxy settings were not applied.
- Root cause: WebSocketClient was fetching proxy config during module-level instantiation, which occurred before config.load() finished.
- Modified WebSocketClient to dynamically resolve proxy settings at connection time.
- Added debug logging for proxy resolution and connector types.
@chenyme chenyme merged commit d3fcefc into chenyme:main Feb 19, 2026
3 of 4 checks passed
This was referenced Feb 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Comments