【问题标题】:boost beast message with body_limit使用 body_limit 提升野兽消息
【发布时间】:2018-11-22 19:06:49
【问题描述】:

我的出发点是从 boost http_client_async 的 boost beast http_client_async 示例创建一个简单的下载器代码。在这种情况下,我想将收到的正文写入文件。

于是我把字符串body换成了file_body,用来写入接收到的数据:

 http::response_parser<http::file_body> res_;

并且简单地将 on_write 方法重写为

void on_write( boost::system::error_code ec,
               std::size_t bytes_transferred )
{
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    boost::system::error_code ec_file;
    res_.body().open("myTest.txt", boost::beast::file_mode::write, ec_file);

    // test for ec_file missing 

    // Receive the HTTP response
    http::async_read(socket_, buffer_, res_,
        std::bind(
            &session::on_read,
            shared_from_this(),
            std::placeholders::_1,
            std::placeholders::_2));
}

但是现在,一些接收到的数据体太大了:

read: body limit exceeded

我尝试增加身体限制。

如果使用解析器而不是消息,可以使用body_limit() 方法更改请求正文的大小限制。

是否还有一种简单的方法可以通过消息增加正文大小限制?

【问题讨论】:

  • 我认为使用response_parser&lt;http::file_body&gt; 代替response&lt;http::string_body&gt; 是最好的方法。这里弄糊涂了。响应解析器不是消息。当试图让 body 调用 open 时,res_ 需要调用 res_.get().body().open("myTest.txt", boost::beast::file_mode::write, ec_file);。 response_parser res_ 能够处理成员变量 body_limit()。

标签: c++ boost-beast


【解决方案1】:

Beast 的 HTTP 接口按层分组。第一层具有面向消息的流算法,它在 HTTP 消息容器上运行。这些是为简单而设计的,但允许很少的定制。下一层是面向序列化器/解析器的接口。这需要在流操作期间维持序列化器(用于写入)或解析器(用于读取)的生命周期。它稍微复杂一些,但相应地允许更多的自定义。

调整消息正文的最大大小需要使用面向解析器的接口,正如您在评论中指出的那样:

namespace http = boost::beast::http;
http::response_parser<http::file_body> parser;

// Allow for an unlimited body size
parser.body_limit((std::numeric_limits<std::uint64_t>::max)());
...
http::read(socket, buffer, parser);

【讨论】:

  • 感谢您的澄清!我用代码工作了一段时间。阅读代码 + 文档 API 比目前的文档示例更有帮助,因为使用 beast 的可能性真的很大!
  • 我认为 std::numeric_limits<:uint64_t>::max 应该是 std::numeric_limits<:uint64_t>::max()。
  • 是的,你是对的!此外,函数名称应该用括号括起来,以防有人将 max 定义为宏 (tsk tsk Windows.h)
  • http::response_parser&lt;http::string_body&gt; 不是move_insertable。这可以防止std::vector::reserve::resize 等。我该如何处理?我真正需要的是一个没有正文限制的可用 HTTP 响应向量。
  • @VinnieFalco 我基本上经历了与 OP 相同的步骤。它可以工作,但我想知道使用 async_read_some ,因为我将使用相对资源受限的目标。到目前为止,我失败了,并且在第二次读取时出现“错误的行尾”错误。我显然做错了什么;我需要使用 async_read_some 吗?如果是这样,你能告诉我在哪里看吗(我需要序列化器还是自定义解析器?)有没有更好的地方寻求帮助!?非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2018-11-01
  • 2018-08-25
  • 2019-06-04
相关资源
最近更新 更多