我在boost beast网络服务器中获取请求的协议(HTTP或HTTPS)时遇到麻烦。我可以使用以下命令获取主机:
req[http::field::host]
但协议没这么好。
req[http::field::protocol]
是空的。
sauutmhj1#
HTTPS没有http::字段。对于使用HTTPS,基本上您要执行以下操作(示例):1.创建io上下文和ssl上下文
boost::asio::io_context ioc; boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12_client)
2.从io_context和ssl::context创建ssl流
boost::beast::ssl_stream<boost::beast::tcp_stream> stream(ioc, ctx)
3.使用最低层创建tcp连接
beast::get_lowest_layer(stream).connect(...endpoints iterator from query resolver..)
4.do SSL握手
stream.handshake(ssl::stream_base::client);
5.now ,您可以像往常一样请求写入流:
http::request<http::string_body> req{http::verb::get, target, version}; req.set(http::field::host, host); req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING); // Send the HTTP request to the remote host http::write(stream, req);
查看官方助力怪兽examples。
fnvucqvd2#
考虑到您位于nginx服务器之后,Beast无法解决您的问题。但是nginx将发送到您的服务器的附加头可以解决问题。你可以依赖HTTP_X_FORWARDED_PROTO or HTTP_X_FORWARDED_SSL的头文件,下面是我在an answer之后提出的类似问题:
using namespace boost::beast; using namespace std; string find_scheme(const http::request<http::string_body>& request) { http::request<http::string_body>::const_iterator header; header = request.find("HTTP_X_FORWARDED_PROTO"); if (header != request.end()) return header->value().data(); else { header = request.find("HTTP_X_FORWARDED_SSL"); if (header != request.end()) return header->value() == "on" ? "https" : "http"; } return "http"; }
2条答案
按热度按时间sauutmhj1#
HTTPS没有http::字段。
对于使用HTTPS,基本上您要执行以下操作(示例):
1.创建io上下文和ssl上下文
2.从io_context和ssl::context创建ssl流
3.使用最低层创建tcp连接
4.do SSL握手
5.now ,您可以像往常一样请求写入流:
查看官方助力怪兽examples。
fnvucqvd2#
考虑到您位于nginx服务器之后,Beast无法解决您的问题。但是nginx将发送到您的服务器的附加头可以解决问题。
你可以依赖HTTP_X_FORWARDED_PROTO or HTTP_X_FORWARDED_SSL的头文件,下面是我在an answer之后提出的类似问题: