我的出发点是从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()
方法更改请求正文的大小限制。
是否有一种简单的方法可以从消息增加体型限制?
答案 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);