如何避免Boost野兽中出现body_limit错误并正确处理大消息

时间:2019-10-25 10:23:24

标签: c++ http boost boost-asio boost-beast

在某些情况下,有一个大块的响应对于野兽来说太大了,我想在进入野兽的body_limit之前停下来,然后继续使用普通的boost :: asio处理该消息。请注意,这(显然)意味着我已经收到了标头和主体的很大一部分。

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

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

这项工作有效吗?这是这样做的正确方法,还是有更好的方法,甚至可以使用野兽API?是否有另一种方法可以处理野兽的api中即将超过body_limit的分块消息?

预先感谢, 大卫。

更新

我终于放弃了回退以提高asio的想法,现在正尝试使用固定大小的缓冲区以块的形式接收http消息(分块或常规),以便不达到正文限制。我刚刚浏览了Receive/parse the message body one chunk at a time · Issue #154 · boostorg/beast,看来这正是我所需要的。我也尝试实现反向代理。.我尝试使用Incremental Read ? - 1.70.0,但在尝试编译此行时收到Reference to non-static member function must be called错误:

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

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

预先感谢, 大卫

2 个答案:

答案 0 :(得分:1)

默认情况下,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

答案 1 :(得分:1)

  

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

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