为在 CONNECT 阶段卡住的 Apache HttpClient 5 代理设置超时
为隧道建立设置连接管理器的 socket I/O 超时,同时保留单独的 TCP 连接超时。
代理接受了 TCP,却始终没有完成 CONNECT 应答。网站响应尚未开始;只针对后续响应的超时可能让这一步无限等待。
对于 Apache HttpClient 5.3.1,设置连接管理器的默认值:
var connection = ConnectionConfig.custom()
.setConnectTimeout(Timeout.ofSeconds(5))
.setSocketTimeout(Timeout.ofSeconds(10))
.build();
var manager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultConnectionConfig(connection)
.build();
var client = HttpClients.custom()
.setConnectionManager(manager)
.setProxy(new HttpHost("http", "proxy.example", 8080))
.build();使用 org.apache.hc 下的 Apache HttpComponents 5 类,Timeout 位于 core5 工具包中。保留客户端用于其工作并在之后关闭。对于隔离的公网 HTTP 测试,来自 HTTP 代理列表 的候选即可提供端点;比较超时值时保持目标不变。
| 限制 | 所覆盖的等待 |
|---|---|
| 连接超时 | 连接建立 |
| 套接字超时 | 默认 I/O 空闲,包括 CONNECT 交换 |
| 从连接池获取 / 应用响应 | 其他单独配置的阶段 |
CONNECT 之后,TLS 可能需要通过 HttpClient 5 的 TLS 配置设置自己的建立时限。还要区分空闲与总截止时间:间歇到达的字节或重复的认证交换都可能延长总耗时。使用应用支持的截止或取消策略来管理 整个操作的单一预算.