【问题标题】:How do I avoid body_limit error in boost's beast and correctly handle large messages如何避免boost的野兽中的body_limit错误并正确处理大消息
【发布时间】:2019-10-25 10:23:24
【问题描述】:

我遇到过对于 Beast 来说太大的分块响应的情况,我想在到达 Beast 的 body_limit 之前停下来,然后使用普通的 boost::asio 继续处理该消息。请注意,这(显然)意味着我已经收到了标题和大部分正文。

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

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

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

提前致谢, 大卫。

更新

我终于放弃了回退到 boost 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;

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

提前致谢, 大卫

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这正是我的问题,使用http::string_body 而不是http::buffer_body,谢谢!
    【解决方案2】:

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

    【讨论】:

    • 嗨,感谢您的回复 :),问题是我试图避免到达 body_limit,因为从 body_limit 恢复很复杂。一般来说,我希望选择不存储整个消息,因为我正在实现反向代理,有时只想简单地传递消息。请查看我的 UPDATE 问题,我现在在问一些不同的问题..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多