HTTP 请求上的 Boost.Asio SSL 错误,错误消息为“http request”

Posted

技术标签:

【中文标题】HTTP 请求上的 Boost.Asio SSL 错误,错误消息为“http request”【英文标题】:Boost.Asio SSL error on HTTP request with error message "http request" 【发布时间】:2021-03-30 22:15:24 【问题描述】:

我有一个标准的 boost.asio http(s) 服务器。如果我尝试向该服务器发送一个 http 请求,async_handshake 方法总是报告错误代码值336130204 和错误消息http request。这很棒,因为它允许我切换到 http。我的问题是我似乎无法找到生成错误代码值的位置/方式。我基本上试图避免做类似的事情:

if (ec.value() == 336130204)
  // Do http
else
  // Do https

而是有一些更便携的东西,比如:

if (ec.value() == boost::asio::ssl::error::http_request)
  // Do http
else
  // Do https

我是否遗漏了某些东西,或者确实以某种方式提升了价值,从而无法做更便携的事情?

注意:我没有使用 beast,我正在做的项目无法使用这个包。

【问题讨论】:

如果事情看起来“有些混乱”,那么 99% 的时间你在其他地方都有 Undefined Behaviour。如果您分享一个独立的示例,那么我们可以告诉您可能出了什么问题。 我知道你不使用野兽,但也许关于“检测 SSL”的文档仍然可以帮助你boost.org/doc/libs/1_75_0/libs/beast/doc/html/beast/using_io/… 【参考方案1】:

我终于弄清楚了这个价值是如何产生的。错误来自openssl,如果您查看openssl 中的ERR_reason_error_string 函数,他们使用ERR_GET_LIB(value)ERR_GET_REASON(value) 来重建没有函数部分的值。因此,要正确比较响应是否为 http 请求,您可以执行以下操作:

stream_.async_handshake(boost::asio::ssl::stream_base::server,
      [this, self=shared_from_this()](const boost::system::error_code& ec) 
      if (ERR_PACK(ERR_LIB_SSL, ERR_GET_FUNC(ec.value()), SSL_R_HTTP_REQUEST) == ec.value())
      
        // do http work
      
      else
      
        // handle error as usual
      
);

ERR_PACK 似乎将库、函数和原因打包成一个无符号长整数。 ERR_GET_FUNC 从 unsigned long 中获取函数值。 SSL_R_HTTP_REQUEST是openssl产生错误的原因。

【讨论】:

以上是关于HTTP 请求上的 Boost.Asio SSL 错误,错误消息为“http request”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Boost.Asio SSL 请求返​​回 405 Not Allowed?

在 Boost.Asio 中同时使用 SSL 套接字和非 SSL 套接字?

boost::asio::ssl::context 可以在多个 SSL 流之间共享吗?

使用 Fiddler 拦截 Boost.Asio HTTP/S 请求

boost/asio/ssl 抛出“未定义的引用”错误

如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数