【问题标题】:How to get proxy response in java http request?java - 如何在java http请求中获取代理响应?
【发布时间】:2016-03-01 08:49:25
【问题描述】:

我通过代理服务器发送 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);

【问题讨论】:

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


    【解决方案1】:

    如何在 Java 中获得相同的输出?

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

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

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

    您甚至可以让 Apache 完成所有“通过网络”进行的操作。

    【讨论】:

    • 是的,这看起来太复杂了。实际上我需要 X-Proxy-Header 的值。日志记录对我来说还不够,但我猜日志记录适用于侦听器/拦截器。我会尝试查找是否可以附加到它们。
    【解决方案2】:

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

    嗯,这个想法是基于这样一个事实,即 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"); 
    

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2020-06-28
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多