2017-08-10 6 views
0

経由だから私はうまくSSLで接続するために、ブースト:: ASIOを使用して動作します。このコードを持っている:Cは後押し++ :: 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通信を許可しなかったプロキシ設定に問題がありました。

関連する問題