• 【转】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);
  • 相关阅读:
    o gdb
    net -t struct ifreq
    file -x stat()-fstat()-lstat()
    I/O -x fcntl()
    I/O -x dup() dup2()
    14条---注意点
    user -x userid
    err -x perror() strerror()
    苹果电脑挂载NTFS移动硬盘
    ASP.NET Core之EF Core学习笔记
  • 原文地址:https://www.cnblogs.com/wms2017/p/6945363.html
Copyright © 2020-2023  润新知