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

How to get proxy response in java http request?

我通过代理服务器发送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 并且它 returns 仅来自目标服务器的响应。缺少代理响应。

我需要的是基本思想而不是具体实现,因为我也必须为 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);

How can I get the same output in Java?

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

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

然而,这并不容易......而且我真的不明白这一点。如果您只是为了调试目的而试图查看发送和接收的内容,那么更简单的方法是使用 Apache HttpClient 日志记录,如下所述:

您甚至可以让 Apache 运行一切 "over the wire"。

I need the basic idea rather than concrete implementation

好吧,这个想法是基于这样一个事实,即 java 库在幕后执行所有低级内容。如果使用代理连接,HTTPS 请求的典型工作流程可以是:

  1. 客户端连接到代理机器
  2. 代理机器建立与目标服务器的连接 returns 200 Connection established 然后通过 SSL
  3. 传输客户端和目标之间的所有流量
  4. 客户端使用 public 密钥加密请求,之后一切如常

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