c++ 获取boost/beast中请求的协议

9fkzdhlc  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(239)

我在boost beast网络服务器中获取请求的协议(HTTP或HTTPS)时遇到麻烦。
我可以使用以下命令获取主机:

req[http::field::host]

但协议没这么好。

req[http::field::protocol]

是空的。

sauutmhj

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

fnvucqvd

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";
}

相关问题