2017-08-10 82 views
0

所以我有这样的代码就好了使用boost ::工作ASIO使用SSL连接:c + +的boost :: ASIO HTTPS通过代理

开辟了小提琴手,但我没有看到在所有这些连接。 从我读过的内容中我收集到的信息是,我必须通过代理传递请求。 所以我尝试了所有的例子和答案,我可以找到,但我无法使它的工作。

我得到的最好的结果是握手永远不会触发回调。

我错过了什么?

void performHTTPRequest(std::string host, std::string path) { 
    std::ostream request_stream(&mRequest); 
    request_stream << "GET " << path << " HTTP/1.1\r\n"; 
    request_stream << "Host: " << host << "\r\n"; 
    request_stream << "Accept: */*\r\n"; 
    request_stream << "Connection: close\r\n\r\n"; 
    tcp::resolver::query query(host, "https"); 
    mResolver.async_resolve(query, 
     boost::bind(handle_resolve, 
     this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::iterator)); 
} 

void handle_resolve(const boost::system::error_code& err, 
     tcp::resolver::iterator endpoint_iterator) 
{ 
    if (!err) 
    { 
     boost::asio::async_connect(mSocket.lowest_layer(), 
      endpoint_iterator, 
      boost::bind(&handle_connect, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
} 

void handle_connect(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     mSocket.async_handshake(
      boost::asio::ssl::stream_base::handshake_type::client, 
      boost::bind(&handle_handshake, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
} 


void handle_handshake(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     boost::asio::async_write(mSocket, mRequest, 
      boost::bind(&handle_write_request, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
} 

void handle_write_request(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     boost::asio::async_read_until(mSocket, mResponse, "\r\n", 
      boost::bind(&handle_read_status_line, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
} 

void handle_read_status_line(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     std::istream response_stream(&mResponse); 
     std::string http_version; 
     response_stream >> http_version; 
     unsigned int status_code; 
     response_stream >> status_code; 
     std::string status_message; 
     std::getline(response_stream, status_message); 
     if (!response_stream || http_version.substr(0, 5) != "HTTP/") 
     { 
      return; 
     } 
     if (status_code != 200) 
     { 
      return; 
     } 
    } 
    else 
    { 
     delete this; 
    } 
} 
+1

你是否在任何时候调用ioservice :: run()?只是问,因为这是一个常见的错误。 –

+0

在每个处理程序中放入一些调试消息,并让我们知道您得到了多少,特别是主机解决的端点或IP地址。但既然你说小提琴手什么都不显示,我的猜测就是连线失败了。另外,从等式中移除Fiddler并使用Wireshark/tcpdump代替测试。 –

回答

0

看来,只是改变这一行:

tcp::resolver::query query(host, "https"); 

有了这个:

tcp::resolver::query query(proxyUrl, proxyPort); 

的伎俩。

问题在于代理配置不允许HTTPS通信。