我有一个标准的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生成错误的原因。