我应该使用传入的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”错误。
连接服务器并不通过代理服务器发送短信是可以的。
感谢您的阅读。