zoukankan      html  css  js  c++  java
  • 【转】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要注意的一点

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

    // 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);
  • 相关阅读:
    第七届湘计算机程序设计竞赛的学生 报道称,数字游戏
    python IDE
    字符串处理
    Ajax得知(两)—— 一个简单的Ajax示例
    九度OJ 1068 球半径和数量 (模拟)
    centos 之7zip
    svnclient本地化和异常处理
    java web.xml listener servlet 和filter加载顺序
    Jquery zTree实例
    探索Android中的Parcel机制(上)
  • 原文地址:https://www.cnblogs.com/wms2017/p/6945363.html
Copyright © 2011-2022 走看看