使用body_limit增强野兽消息

时间:2018-05-15 11:00:05

标签: c++ boost-beast

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

所以我将字符串体交换成了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()方法更改请求正文的大小限制。

是否有一种简单的方法可以从消息增加体型限制?

1 个答案:

答案 0 :(得分:5)

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);