2016-03-01 75 views
0

我通过代理服务器发送http请求。如何获取java 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); 

回答

0

我所需要的基本概念,而不是具体的实施

嗯,这个想法是基于一个事实,Java库的引擎盖下完成所有低层次的东西。万一与代理连接,对HTTPS请求的典型工作流程可以是:

  1. 客户端连接到代理机
  2. 代理机建立到目的地服务器的连接,并返回200 Connection established,然后用客户机和目的地之间传输的所有通信SSL
  3. 客户端请求加密与公共密钥和后来事情像往常一样

工作流程的第二部分是由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"); 
1

我怎样才能在Java中相同的输出?

一种方法是使用HTTPClientConnection对象自己执行代理。

另一种方法是实现您自己的HttpClientConnectionManager API版本,以捕获并保存代理响应。

然而,这并不容易......我并不真正了解这一点。如果你只是想看看正在发送和调试的目的得到的话,更简单的方法是使用Apache的HttpClient这里描述记录:

你甚至可以得到阿帕奇去做一切“通过电线”。

+0

是的,这看起来太复杂了。其实我需要X-Proxy-Header的价值。记录对我来说是不够的,但我猜测日志记录对侦听器/拦截器起作用。我会尝试找出是否有可能附加到他们。 – AdamSkywalker

相关问题