在 RequestConfig 和 SocketConfig 中设置套接字超时对于 HTTP 和 HTTPS 的工作方式不同

Dhr*_*uva 2 java https apache-httpclient-4.x

我已设置套接字超时SocketConfig并将 SocketConfig 设置为连接管理器

connManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(soTimeout).build())
Run Code Online (Sandbox Code Playgroud)

RequestConfig并通过将其设置为覆盖单个请求的套接字超时值

httpRequest.setConfig(RequestConfig.copy(defaultRequestConfig).setSocketTimeout(timeout).build())  
Run Code Online (Sandbox Code Playgroud)

参考链接

对于所有 http 请求,使用 RequestConfig 设置的新值将按预期覆盖旧值。但对于 https 请求,它始终考虑 SocketConfig 中设置的旧值。

在得知这可能是 4.3.1 参考链接中的问题后,我还将 httpclient 从 4.3.1 升级到 4.3.6 。但即使这样也没有帮助我解决问题。
我错过了什么吗?关于如何解决这个问题有什么想法吗?

ok2*_*k2c 5

这只是部分正确。RequestConfig代表请求级别设置,SocketConfig代表连接级别设置。安全连接需要进行 SSL/TLS 握手并建立安全会话,然后才能用于执行请求。因此,RequestConfig只有在完全建立 HTTPS 连接后才能联合设置。在此之前仅SocketConfig适用。

  • 听起来像是一个设计缺陷 - 如果不设置默认套接字配置,客户端可能会永远挂起,尽管开发人员已经关心了例如。延长特定请求的默认超时期限。恕我直言,请求配置(如果至少是来自客户端上下文的配置)应适用于 SLL 握手!)赞成从 HTTP 层分离 SSL。 (2认同)
  • @Antoniossss:确实如此。在 SSL 握手时,如果连接超时是有限的并且套接字超时未定义(无限),则连接超时适用 https://github.com/apache/httpclient/blob/4.5.x/httpclient/src/main/java/ org/apache/http/conn/ssl/SSLConnectionSocketFactory.java#L331 (2认同)