我通过代理服务器发送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 :(得分:0)
我需要基本的想法而不是具体的实现
嗯,这个想法是基于一个事实,即java库在幕后执行所有低级别的东西。在使用代理连接的情况下,HTTPS请求的典型工作流程可以是:
200 Connection established
,然后通过SSL传输客户端和目标之间的所有流量工作流的第二部分由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");