如何在java http请求中获取代理响应?

时间:2016-03-01 08:49:26

标签: java http curl proxy apache-httpclient-4.x

我通过代理服务器发送http请求。

当我使用curl时,我得到了响应的两部分:来自代理服务器和目标服务器:

curl -i --proxy proxy.com:8080 --proxy-user user:1234 https://target.com

HTTP/1.1 200 Connection established
X-Proxy-Header: Header-Value: connected established

HTTP/1.1 200 OK
Server: target.com
other headers
http response

如何在Java中获得相同的输出?我使用apache HttpClient,它只返回目标服务器的响应。缺少代理响应。

我需要基本的想法而不是具体的实现,因为我也必须将它重用于Netty库。无论如何,示例代码从:

开始
HttpHost myProxy = new HttpHost("proxy.com", 8080);
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(myProxy), new UsernamePasswordCredentials("user", "1234"));
HttpClient client = HttpClients.custom()
                .setConnectionManager(new BasicHttpClientConnectionManager())
                .setProxy(myProxy)
                .setDefaultCredentialsProvider(credentialsProvider)                    
                .build();
HttpGet request = new HttpGet(url);
HttpResponse = client.execute(response);

1 个答案:

答案 0 :(得分:0)

  

我需要基本的想法而不是具体的实现

嗯,这个想法是基于一个事实,即java库在幕后执行所有低级别的东西。在使用代理连接的情况下,HTTPS请求的典型工作流程可以是:

  1. 客户端连接到代理计算机
  2. 代理计算机建立与目标服务器的连接并返回200 Connection established,然后通过SSL传输客户端和目标之间的所有流量
  3. 客户端使用公钥加密请求,之后的事情照常开始
  4. 工作流的第二部分由java库以及所有其他东西处理。

    对于netty库,代理从4.1开始用ProxyHandler处理。可以使用handleResponse方法中的自定义代理处理程序或通过向管道添加其他入站处理程序来处理代理响应。

    我没有搜索Apache HttpClient的解决方案,但是如果将日志记录设置为调试级别,则至少可以看到所有流量。它可以通过以下方式实现:

    System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.SimpleLog");
    System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
    System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.wire", "DEBUG");