1. 程式人生 > >【轉】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要註意的一點

【轉】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要註意的一點

方法 xxx and aid csdn 代理 ref cpp logs

Poco 1.4.2 HTTPClientSession/HTTPClientSession 在使用代理的時候,request的URI不能包含協議和主機。否則會出錯。

不使用代理的時候,以下代碼能正常工作。

// no error handling ...  
string strURI = "http://www.baidu.com/query?r=xxx";  
Poco::URI uri(strURI);  
  
Poco::Net::HTTPClientSession session;  
session.setHost(uri.getHost());  
session.setPort(uri.getPort());  
  
// Proxy switch: // session.setProxy(<proxyHost>, <proxyPort>); Poco::Net::HTTPRequest req("HTTP/1.1"); req.setURI(strURI); session.sendRequest(req);

蛋是如果啟用Proxy(取消掉對上面setProxy那句代碼的註釋),則上面的代碼會報錯。

抓包發現它發出去的HTTP請求成了:

GET http://www.baidu.com:80http://www.baidu.com/query?r=xxx


跟到Poco源代碼中,發現原因為:

// in poco/net/HTTPClientSession.cpp  
//  
 if (!_proxyHost.empty())  
{  
     request.setURI(proxyRequestPrefix() + <strong>request.getURI()</strong>);  
     proxyAuthenticate(request);  
}  

解決的方法,

1) 修改 poco/net/HTTPClientSession.cpp

request.setURI(proxyRequestPrefix() + Poco:URI(request.getURI()).getPathEtc());  


或者,2)

使用的時候,給HTTPRequest傳入URI的時候不包含schema, host, port

如下:

// no error handling ...  
string strURI = "http://www.baidu.com/query?r=xxx";  
Poco::URI uri(strURI);  
Poco::Net::HTTPClientSession session;  
session.setHost(uri.getHost());  
session.setPort(uri.getPort());  
// Proxy switch: on  
session.setProxy(<proxyHost>, <proxyPort>);  
Poco::Net::HTTPRequest req("HTTP/1.1");  
req.setURI(<strong>uri.getPathEtc()</strong>);    
session.sendRequest(req);

  

from:http://blog.csdn.net/easyvcr/article/details/6855176

【轉】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要註意的一點