2016-03-01 118 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

相關問題