使用boost通过HTTP代理连接SSL服务器

时间:2017-07-06 04:44:07

标签: c++ http ssl boost proxy

我应该使用传入的webhook将文本消息发送到Slacks等消息传递平台。但我的开发网络与公共网络不同,所以我决定使用我们公司的代理服务器,它可以连接到公共服务器。简言之,将

客户端 - HTTP PROXY - 服务器 (消息传递平台)

1。首先,使用普通的TCP套接字建立C-P连接。

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> m_socket;

boost::asio::ip::tcp::resolver resolver(m_io);
boost::asio::ip::tcp::resolver::query query("www.proxy.dev", "8080");
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

boost::asio::async_connect(m_socket.lowest_layer(), iterator,
    boost::bind(&ClientSocket::HandleHandShake, this,
        boost::asio::placeholders::error, shared_from_this()));

连接后,将连接字符串发送给代理。

m_stringStream << "CONNECT";
m_stringStream << " " << m_domain << ":443";
m_stringStream << " HTTP/1.1\r\n";
m_stringStream << "HOST: " << m_domain << ":443\r\n";
m_stringStream << "Proxy-Connection: keep-alive\r\n";
m_stringStream << "Connection: keep-alive\r\n";

2。从代理接收状态代码。

200 OK

第3。握手

m_socket.set_verify_mode(boost::asio::ssl::verify_none);
m_socket.set_verify_callback([](auto&& preverified, auto&& ctx)
{
    char subject_name[256];
    X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
    X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
    return preverified;
});

m_socket.async_handshake(boost::asio::ssl::stream_base::client,
        boost::bind(&ClientSocket::HandleHandShake, this,
            boost::asio::placeholders::error, shared_from_this()));

4。写HTTP POST,读取状态码。

在第3步,错误代码通知我“短读”,因此我无法进入下一步。

我搜索了很多问题,但一切都不适合我。

如果我跳过握手过程,可能会收到“未初始化”错误。

如果我也跳过'CONNECT'与代理并直接向服务器发送'POST',则会收到“403 badrequest”错误。

连接服务器并不通过代理服务器发送短信是可以的。

感谢您的阅读。

0 个答案:

没有答案