C++ 使用boost通过HTTP代理连接SSL服务器
我应该使用传入的webhook向消息平台发送文本消息,就像Slacks一样。但我正在开发的网络与公共网络不同,所以我决定使用我们公司的代理服务器,它可以连接到公共网络。简而言之 客户端-HTTP代理-服务器(消息传递平台) 1。首先,使用普通TCP套接字建立C-P连接。C++ 使用boost通过HTTP代理连接SSL服务器,c++,http,ssl,boost,proxy,C++,Http,Ssl,Boost,Proxy,我应该使用传入的webhook向消息平台发送文本消息,就像Slacks一样。但我正在开发的网络与公共网络不同,所以我决定使用我们公司的代理服务器,它可以连接到公共网络。简而言之 客户端-HTTP代理-服务器(消息传递平台) 1。首先,使用普通TCP套接字建立C-P连接。 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> m_socket; boost::asio::ip::tcp::resolver resolver(m_
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()));
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步中,错误代码通知我“短读”,因此我无法进行下一步
我搜索了很多问题,但并非所有问题都适合我
如果我跳过握手过程,可能会收到“未初始化”错误
若我也跳过“连接”代理并直接向服务器发送“POST”,则可能会收到“403 BADDREQUEST”错误
可以连接服务器,而不是通过代理服务器发送文本消息
感谢阅读。为什么要编写原始https握手?为什么不使用libs,比如
curl
?@我在构建程序时使用的Boost库首先支持https握手功能,所以我就使用它。谢谢你的建议。我将尝试原始https握手过程。为什么要编写原始https握手?为什么不使用libs,比如curl
?@我在构建程序时使用的Boost库首先支持https握手功能,所以我就使用它。谢谢你的建议。我将尝试原始https握手过程。
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()));