代理接受了 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 配置设置自己的建立时限。还要区分空闲与总截止时间:间歇到达的字节或重复的认证交换都可能延长总耗时。使用应用支持的截止或取消策略来管理 整个操作的单一预算.

相关文章