Node socket 的 connect 事件只说明 TCP 已经到达代理,并不说明代理已经向目标打开了连接。

SOCKS5 服务器在应用流量之前需要方法协商、可能选定的认证以及目标请求。如果立刻发送 HTTP 请求,服务器可能关闭连接,之后的写入便可能产生 EPIPE。

单凭 EPIPE 无法证明缺少握手。它表示向一个对端已不再接受该通信的连接执行了写入。请阅读之前的事件与协议回复,弄清对端为何关闭。

请使用实现了完整 SOCKS 交换的连接器。对于 Node 的核心 HTTPS 客户端,支持 SOCKS 的 agent 可以在目标 TLS 之前完成该协商。如果自行实现交换,请按协议的字段长度累积数据。一次 data 事件不保证包含一个完整回复,返回的绑定地址也不一定与某一固定字节串一致。

在操作可能失败之前注册错误处理,在错误报告中保留连接所处的阶段,并且只有在协商成功后才发送目标协议。捕获错误只能避免未处理事件,并不能修复非法的交换。

相关文章