Boost.Asio SSL 错误在 HTTP 请求上,错误消息"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

我是错过了什么,还是提升了价值,让我无法做更便携的东西?

注意:我没有使用beast,我正在进行的项目无法使用此包。

我终于弄清楚了这个值是如何生成的。错误来自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从无符号长中获取函数值。SSL_R_HTTP_REQUEST是openssl生成错误的原因。

相关内容

最新更新