c++ - 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
我是否遗漏了某些东西,或者确实以某种方式提升了价值,使其无法做更便携的事情?
注意:我没有使用野兽,我正在从事的项目无法使用这个包。
解决方案
我终于弄清楚了这个价值是如何产生的。错误来自openssl,如果您查看ERR_reason_error_string
openssl中的函数,他们使用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产生错误的原因。
推荐阅读
- google-apps-script - 根据带有宏/脚本的工作表的位置动态更新 rspreadsheet.getRange() 列
- javascript - 切换到新组件
- javascript - 即使在调用 Await 之后,异步函数也会返回 Promise
- python - 如何在 Redshift 数据库上从 Python 触发更新 SQL
- security - 使用基本凭据提供程序配置 Elasticsearch REST 高级客户端
- oracle - 如何在oracle中查找点是否在多边形内?
- javascript - React Popup 未正确显示
- libreoffice-base - BASIC 运行时错误。参数不是可选的
- autohotkey - AutoHotKey Hot Strings 自动大写 I
- mysql - 在列中使用 CURRENT_TIMESTAMP 时的 Mysql 文件导入问题