我创建了一个简单的HTTP请求,其中我向服务器发送GET,POST和PUT请求。接下来我想使用boost asio库切换到HTTPS连接,我该怎么办?
我有一个解析并连接到服务器的Executor类和一个创建请求的RequestCreator类。
答案 0 :(得分:7)
我碰巧在评论中发布了这样的内容(...):
You just connect over ssl. @Milind coliru.stacked-crooked.com/a/9546326fd1def416
所以也许对你有帮助。
<强> Live On Coliru 强>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <iostream>
int main() {
boost::system::error_code ec;
using namespace boost::asio;
// what we need
io_service svc;
ssl::context ctx(svc, ssl::context::method::sslv23_client);
ssl::stream<ip::tcp::socket> ssock(svc, ctx);
ssock.lowest_layer().connect({ {}, 8087 }); // http://localhost:8087 for test
ssock.handshake(ssl::stream_base::handshake_type::client);
// send request
std::string request("GET /newGame?name=david HTTP/1.1\r\n\r\n");
boost::asio::write(ssock, buffer(request));
// read response
std::string response;
do {
char buf[1024];
size_t bytes_transferred = ssock.read_some(buffer(buf), ec);
if (!ec) response.append(buf, buf + bytes_transferred);
} while (!ec);
// print and exit
std::cout << "Response received: '" << response << "'\n";
}
为了模拟服务器以进行演示,我一直在使用Asio示例中的证书和参数(https://stackoverflow.com/a/31201907/85371)。
更新这是一个使用解析程序解析端点的版本(Coliru不允许我们这样做,但它可以在非限制机器上运行)。
<强> Live On Coliru 强>
ip::tcp::resolver resolver(svc);
auto it = resolver.resolve({"localhost", "8087"}); // http://localhost:8087 for test
boost::asio::connect(ssock.lowest_layer(), it);
// and the rest unaltered
ssock.handshake(ssl::stream_base::handshake_type::client);