如何避免 boost 的 beast 中的 body_limit 错误并正确处理大消息

How do I avoid body_limit error in boost's beast and correctly handle large messages

我遇到过分块响应对 beast 来说太大的情况,我想在到达 beast 的 body_limit 之前停下来,然后使用普通 [=38] 从那一点开始继续处理消息=].请注意,这(显然)意味着我已经收到 header 和大部分 body.

我将它用于反向代理,所以基本上我想做的是以某种方式将不完整的响应发送到 http 客户端,同时使用 boost::asio.[=18 继续中继剩余的响应数据=]

我猜我需要以某种方式序列化不完整的响应,可能使用 operator<<std::stringstream,使用 boost::asio 将其发送给客户端,然后继续通信从那里开始。

这行得通吗?这是这样做的正确方法,还是有更好的方法,甚至可以使用 beast api?在 beast 的 api 中是否有另一种方法来处理即将超过 body_limit 的分块消息?

提前致谢, 大卫.

更新

我最终放弃了回退到 boost asio 的想法,现在我正在尝试接收具有固定大小缓冲区的块中的 http 消息(分块或常规),这样我就不会到达 body 限制。我刚刚浏览完 Receive/parse the message body one chunk at a time · Issue #154 · boostorg/beast, and it seems that it's exactly what I need. I'm trying to implement a reverse proxy as well.. I tried to use Incremental Read - 1.70.0 但在尝试编译此行时出现 Reference to non-static member function must be called 错误:

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

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

提前致谢, 大卫

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

Maybe the incremental read example page is not updated with the latest syntax? Do you have an example relevant for the reverse proxy I'm trying to write?

文档中的示例是经过编译的,因此它们不可能过时。也许您正在混合示例和 Beast 的不同版本?你在使用 http::buffer_body 吗?您的消息声明是什么样的?