首页 > 解决方案 > HTTP 请求上的 Boost.Asio SSL 错误,错误消息为“http request”

问题描述

我有一个标准的 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

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

注意:我没有使用野兽,我正在从事的项目无法使用这个包。

标签: c++boostboost-asio

解决方案


我终于弄清楚了这个价值是如何产生的。错误来自openssl,如果您查看ERR_reason_error_stringopenssl中的函数,他们使用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产生错误的原因。


推荐阅读