Skip to content

fix: prevent Dashboard crash on proxy TLS handshake disconnect - #60

Merged
wicm84266964 merged 1 commit into
wicm84266964:mainfrom
taxa-ant:fix/proxy-tls-error-lifecycle
Sep 17, 2026
Merged

wicm84266964 merged 1 commit into
wicm84266964:mainfrom
taxa-ant:fix/proxy-tls-error-lifecycle

Conversation

@taxa-ant

Copy link
Copy Markdown
Contributor

Change

修复内置 HTTPS 代理联网请求在 TLS 握手期间断开连接时,未处理的 socket error 事件导致整个 Dashboard 退出的问题。请求失败后继续监听 socket 错误,直到 close 才清理;网络失败仍会正常返回给调用方。

发现和复现过程

  1. Windows 上将源码同步到远端 main(131800c,版本 2.0.14),安装依赖并重新关联全局命令。Node.js 为 v24.13.0。
  2. 用户运行 ant-code dashboard,服务成功启动,但聊天过程中进程退出,报 Unhandled 'error' event,错误对象为 ECONNRESET,消息为 Client network socket disconnected before secure TLS connection was established,发出事件的是 TLSSocket。用户当时开启了代理。
  3. 检查内置联网实现,发现 proxyHttpsRequest() 建立 CONNECT 隧道后使用 tls.connect(),由 collectRawHttpResponse() 接收响应。该收集函数在请求完成或失败时会立即移除 error 和 close 监听器。
  4. 新增完全本地的回归测试:TCP 服务接受连接后立即结束,客户端在这条连接上启动 TLS 握手,再调用响应收集函数。修复前复现相同的未处理 TLS ECONNRESET;修复后测试通过。

没有当时完整的请求日志,因此不能断言具体目标网址、工具调用或断线方。测试验证的是收集函数的事件生命周期缺陷,不是完整代理 CONNECT 端到端复现,也不能据此认定代理软件有故障。

根因与修复理由

TLS 握手未完成时连接结束,可能先触发 end,再触发 TLS error。原代码在 end 中解析不完整响应失败后调用 cleanup(),删除了错误监听器;后续错误因此成为未处理事件并终止 Node 进程。Promise 已经 reject 并不能自动处理 EventEmitter 后续的错误。

  • 请求结算时只移除 data 和 end 监听器,保留错误和关闭监听。
  • 将 once("error") 改为 on("error"),覆盖关闭前可能出现的后续错误。
  • 在 close 中移除错误监听器,避免生命周期结束后仍保留该监听。
  • 沿用现有 settled 保护,保持 Promise 只结算一次,后续事件不会覆盖原结果。
  • 回归测试同时验证请求返回失败、连接正常关闭以及关闭后错误监听已清理。

本变更不添加全局 uncaughtException 处理,不禁用 TLS 证书校验,也不改变代理选择、重试或网络策略。

Validation

  • node --test tests/unit/web-proxy-tls.test.ts tests/unit/tools.test.ts:106 passed,0 failed。

  • npm run check:types:0 diagnostics。

  • npm run check:syntax:349 个文件通过。

  • npm run check:dependencies:15 个外部依赖检查通过。

  • git diff --check:通过。

  • 修复前新增回归用例出现未处理 TLS ECONNRESET;修复后通过。

  • 未运行完整测试套件和浏览器测试,以上为本次相关检查。

  • I ran the repository's documented local checks (focused checks listed above).

  • I did not add credentials, private data, runtime output, or model artifacts.

  • I reviewed the changed-file list.

  • I will wait for every required CI check before merging.

  • I did not create or move a release tag in this pull request.

@wicm84266964
wicm84266964 merged commit bee7a5f into wicm84266964:main Sep 17, 2026
1 check passed
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