首页 > 解决方案 > 如何避免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.0Reference to non-static member function must be called在尝试编译此行时出错:

ctx->response.get().body().data = response_buffer;

也许增量读取示例页面未使用最新语法更新?您是否有与我正在尝试编写的反向代理相关的示例?

在此先感谢,大卫

标签: c++httpboostboost-asioboost-beast

解决方案


默认情况下,Beast 的解析器将请求正文的大小限制为 1MB,响应限制为 8MB。这是为了防止琐碎的资源耗尽攻击。您始终可以通过调用来增加限制或完全消除限制(通过将其设置为最大的 uint64_t)parser::body_limithttps ://www.boost.org/doc/libs/1_71_0/libs/beast/doc/html/beast/ref /boost__beast__http__parser/body_limit.html


推荐阅读