c++ - 如何避免boost的野兽中的body_limit错误并正确处理大消息
问题描述
我有一些情况下,有一个对野兽来说太大的分块响应,我想在我到达野兽之前停下来body_limit
,并使用普通的 boost::asio 继续处理从那一点开始的消息。请注意,这(显然)意味着我已经收到了标题和正文的大部分。
我将它用于反向代理,所以基本上我想做的是以某种方式将不完整的响应发送到 http 客户端,同时继续使用 boost::asio 中继剩余的响应数据。
我猜我需要以某种方式序列化不完整的响应,也许使用operator<<
to std::stringstream
,使用 boost::asio 将其发送给客户端,然后从那里继续通信。
这行得通吗?这是这样做的正确方法,还是有更好的方法,甚至可能使用野兽 api?是否有另一种方法来处理即将超出body_limit
野兽 api 的分块消息?
在此先感谢大卫。
更新
我终于放弃了回退到提升 asio 的想法,现在正试图以固定大小的缓冲区接收 http 消息(分块或常规),这样我就不会达到正文限制。我刚刚浏览完 Receive/parse the message body 一次一大块 · Issue #154 · boostorg/beast,看来这正是我所需要的。我也在尝试实现反向代理。我尝试使用增量读取 - 1.70.0但Reference to non-static member function must be called
在尝试编译此行时出错:
ctx->response.get().body().data = response_buffer;
也许增量读取示例页面未使用最新语法更新?您是否有与我正在尝试编写的反向代理相关的示例?
在此先感谢,大卫
解决方案
默认情况下,Beast 的解析器将请求正文的大小限制为 1MB,响应限制为 8MB。这是为了防止琐碎的资源耗尽攻击。您始终可以通过调用来增加限制或完全消除限制(通过将其设置为最大的 uint64_t)parser::body_limit
:
https ://www.boost.org/doc/libs/1_71_0/libs/beast/doc/html/beast/ref /boost__beast__http__parser/body_limit.html
推荐阅读
- sql - 联合嵌套选择中的排序依据
- configuration - 配置 SonarQube (Node.JS) 以从内部服务器下载二进制文件
- powershell - Powershell 按值传递复杂对象,而不是按引用
- elixir - Elixir - 动态设置 stripity_stripe 库的请求标头
- ios - 在自定义对象类型的核心数据中保存带有子项的类别
- reactjs - 无法使用 Formik 设置“isSubmitting”
- docker - 使用 Karate-Chrome 运行测试(连接被拒绝异常)
- java - Java Stream#map 显然不再工作了
- r - 如何在R中的给定位置生成给定变量字符的所有可能字符串?
- scala - 凿子中的 != 和 =/= 有什么区别?