当前位置: 首页 > 知识库问答 >
问题:

通过http代理的apache commons httpclient 4.3.5

邢昊焜
2023-03-14

大约两天以来,我一直在努力解决一个问题,似乎没有找到解决办法。

为了提高对我们产品中系统代理设置的支持,我写了一个测试应用程序,对一个小型超文本传输协议代理服务器做一些测试,我在docker镜像中运行。

一方面,我与普通URL. openStream()连接...这工作得很好。它可以识别我的开发人员框设置,我将其指向docker run squid或tinyagent,它可以从Web下载文件。

我对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认识到需要有一个代理。但为什么它发送一个请求,这是不理解的两个不同的超文本传输协议代理?

非常感谢您的帮助!

共有1个答案

宗政卓
2023-03-14

最后我想我发现了,我的设置出了什么问题。愚蠢的我,将我的开发者桌面(win7)配置为使用testproxy。但我保留了默认行为,就像对所有可能的连接类型使用这个代理一样。如果我这样做了,我会得到HttpClient的timouets。

只要我为http连接配置代理,只有所有下载方式都能很好地工作,tinyproxy的日志证明,我的连接是通过代理路由的。

 类似资料:
  • 问题内容: 我在使用HTTP代理(仅允许http连接)的网络的笔记本电脑(Ubuntu)上。 当我将svn用作诸如“ http:// .....”之类的url时,一切都很酷(google chrome存储库工作完美),但是现在我需要使用svn:// …从服务器进行svn了。我看到连接被拒绝。 我已经在/ etc / subversion / servers中设置了代理配置,但这没有帮助。 有人有意

  • 问题内容: 我面临着Java6 / 8的奇怪行为。我尝试通过需要基本用户身份验证的代理进行隧道传输。通过标准的Java身份验证器执行此操作。如果我尝试访问https网址作为第一个网址,则会引发异常: java.io.IOException:无法通过代理隧道。代理返回“需要HTTP / 1.1 407代理身份验证” 但是,如果我先访问http URL,然后再访问https URL,则https访问正

  • 我正在用python创建一个基于BaseHTTPServer的代理服务器。它所做的是创建到squid代理的连接,识别浏览器请求(GET、CONNECT、POST等),并向其添加代理授权标头,然后将此请求转发给squid代理。 问题是,据我所知,当我发送连接请求时,我应该将所有相应的流量中继到squid代理。但是,正如我在wireshark中看到的,squid代理没有回复握手的“Client Hel

  • 我正在尝试基于Apache示例和FTPSClient类,使用Apache Commons网络库开发Java FTPS客户端。要运行de代码,我使用Java8,更新45。 当我调用“retrieveFile”方法时,会发生异常。我不确定,但我相信用于传输文件的连接没有使用上面指定的HTTP代理。 使用FileZilla客户端,我可以使用相同的配置传输文件。 我如何解决这个问题? 我的代码: 输出:

  • 我正在尝试在javascript中自定义一个可以通过REST调用访问的endpoint。此终结点处理与不同情况相关的多个条件(基本上它生成一次性密码,然后验证它以检查它是否过期等)。 所以基本上结构是这样的: 我在开始时设置了一个对象,然后映射一个json消息,以便检索具有不同代码/消息响应的正文。因此,当终结点输入这些条件时,它将返回对象,并且 Header 始终为 200(调用成功)。像这样:

  • 问题内容: 在程序中使用用户身份验证的代理的最佳/最简便方法是什么?我目前有这个,但是打开浏览器时我需要输入用户名和密码。 问题答案: 您可以使用Proxy Auto auth插件实现相同的功能 使用以下扩展程序下载扩展程序 https://chrome.google.com/webstore/detail/get- crx/dijpllakibenlejkbajahncialkbdkjc/rel