大约两天以来,我一直在努力解决一个问题,但似乎找不到解决方案。
为了改进我们产品中对系统代理设置的支持,我编写了一个测试应用程序,对小型 http 代理服务器进行一些测试,我在 docker 镜像中运行。
一方面,我使用普通的 URL.openStream()... 进行连接,效果非常好。它识别我的开发者盒子设置,我指向 docker run squid 或 tinyproxy,它可以从网络下载文件。
我用 httpclient 3.X 和 4.X 做了同样的测试。连接到两个代理时,两者都因超时错误而失败。 由于两者具有相同的行为,我只选择我的 httpclient 4.x 配置来显示:
public void testDownloadWithHTTPClient4() throws ClientProtocolException, IOException {
System.out.println("DOWNLOADTEST httpclient 4.x");
RequestConfig config = RequestConfig.custom().setSocketTimeout(TIMEOUT * 1000)
.setConnectTimeout(TIMEOUT * 1000).setConnectionRequestTimeout(TIMEOUT * 1000).build();
CloseableHttpClient httpclient = HttpClientBuilder.create()
.setRoutePlanner(new SystemDefaultRoutePlanner(ProxySelector.getDefault()))
.setDefaultRequestConfig(config).build();
try {
HttpGet httpget = new HttpGet(DOWNLOADURL);
System.out.println("Executing request " + httpget.getRequestLine());
ResponseHandler<Boolean> resStreamHandler = new ResponseHandler<Boolean>() {
@Override
public Boolean handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
String currentDirectory = new java.io.File(".").getCanonicalPath();
File destinationFile = new File(currentDirectory, myfile.war");
FileUtils.copyInputStreamToFile(entity.getContent(), destinationFile);
return true;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
}
};
httpclient.execute(httpget, resStreamHandler);
} finally {
httpclient.close();
}
}
我也打过电话
public void prepareProxysettings() {
// try to get system preferences for proxy-settings
Properties props = System.getProperties();
props.setProperty("java.net.useSystemProxies", "true");
}
结果是,客户端似乎认识到要使用代理,但随后失败并出现以下异常:
org.apache.http.conn.ConnectTimeoutException: Connect to 172.16.7.48:6666 [/172.16.7.48] failed: Connect timed out
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:132)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:371)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
[...]
Caused by: java.net.SocketTimeoutException: Connect timed out
at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:125)
现在我被困住了,不知道该怎么办。显然代理设置并没有错,因为我使用 URL 的普通下载有效。 httpclient 也认识到需要代理。但为什么它会发送一个请求,而这两个不同的 http 代理都无法理解?
非常感谢任何帮助!
最佳答案
最后我想我发现了我的设置出了什么问题。 愚蠢的我,将我的开发人员桌面(win7)配置为使用我的测试代理。但我保留了默认行为,就像对所有可能类型的连接使用此代理一样。如果我这样做,我会通过 httpclients 获得描述的 timouets。
只要我为 http 连接配置代理,只有所有下载方式都能正常工作,而且 tinyproxy 的日志证明,我的连接是通过代理路由的。
关于java - apache commons httpclient 4.3.5 通过 http 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807789/