Apache Http组件-如何使对代理的CONNECT请求超时?

时间:2019-06-22 11:46:47

标签: proxy apache-httpcomponents

不使用代理的超时

我从本地启动netcat的方法如下,该方法基本上侦听端口9090上的连接:

netcat -l -p 9090

然后使用Apache HttpComponents创建一个连接,连接超时为4秒。

RequestConfig requestConfig = RequestConfig.custom()
        .setSocketTimeout(4000)
        .setConnectTimeout(4000)
        .setConnectionRequestTimeout(4000)
        .build();

HttpGet httpget = new HttpGet("http://127.0.0.1:9090");
httpget.setConfig(requestConfig);

try (CloseableHttpResponse response = HttpClients.createDefault().execute(httpget)) {}

在终端中(我正在运行netcat),我看到了:

??]?D???;#???9?Mۡ?NR?w?{)?V?$?(=?&?*kj?
?5??98?#?'<?%?)g@?  ?/??32?,?+?0??.?2???/??-?1???D

<!-- 4 seconds later -->
read(net): Connection reset by peer

在客户端,我看到的是:

Exception in thread "main" org.apache.http.conn.ConnectTimeoutException: 
Connect to 127.0.0.1:9090 [/127.0.0.1] failed: Read timed out

这都是预期的。

使用代理超时

我会根据文档here略微更改客户端代码并配置代理。

RequestConfig requestConfig = RequestConfig.custom()
         .setSocketTimeout(4000)
         .setConnectTimeout(4000)
         .setConnectionRequestTimeout(4000)
         .build();

HttpHost proxy = new HttpHost("127.0.0.1", 9090);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
        .setRoutePlanner(routePlanner)
        .build();

HttpGet httpget = new HttpGet("https://127.0.0.1:9090");
httpget.setConfig(requestConfig);

try (CloseableHttpResponse response = httpclient.execute(httpget)) {}

再次启动netcat,这次是在服务器端

CONNECT 127.0.0.1:9090 HTTP/1.1
Host: 127.0.0.1:9090
User-Agent: Apache-HttpClient/4.4.1 (Java/1.8.0_212)

但是CONNECT超时不起作用。我只是永远地等待..

如何将httpclient配置为超时4秒钟,就像我描述的第一种情况一样?

2 个答案:

答案 0 :(得分:0)

一种可能性:

Initialized new generator.
1
2
3
4
None
Initialized new generator.
1
2
3
4
None

但是我愿意接受其他建议。

答案 1 :(得分:0)

RequestConfig仅在通过特定路由与目标的连接完全建立后才生效。它们不适用于SSL握手或在交换主消息之前发生的任何CONNECT请求。

ConnectionManager级别配置套接字超时,以确保在一段时间不活动后连接级别的操作超时。