beast icon indicating copy to clipboard operation
beast copied to clipboard

关于解析器中的body_limit设置提问

Open Yinpinghua opened this issue 4 years ago • 13 comments

麻烦问下,当用chunked 传输,就可以检测body_limit的限制,而非chunked传输就不检测body_limit限制

Yinpinghua avatar Sep 14 '20 06:09 Yinpinghua

我会检查。 听起来像个虫子。


I will check. It sounds like a bug.

madmongo1 avatar Sep 14 '20 06:09 madmongo1

嗯,谢谢您啊

Yinpinghua avatar Sep 14 '20 07:09 Yinpinghua

麻烦,问下这个bug将会在v1.75版本上修复嘛?

Yinpinghua avatar Sep 15 '20 09:09 Yinpinghua

I have written extra tests for basic_parser and I can find no problem with the operation of body_limit.

Would you be able to share a minimal, complete program with me that demonstrates the issue?


我已经为basic_parser编写了额外的测试,并且body_limit的操作没有问题。

您可以与我共享一个最小的完整程序来演示该问题吗?

madmongo1 avatar Sep 25 '20 14:09 madmongo1

这不对吧,我之前调试过源码,还是有这问题的

Yinpinghua avatar Oct 22 '20 07:10 Yinpinghua

http::async_read_header 先调用这个函数,然后再调用http::async_read 这个函数

Yinpinghua avatar Oct 22 '20 07:10 Yinpinghua

您可以与我共享一个最小的完整程序来演示该问题吗?

madmongo1 avatar Oct 22 '20 08:10 madmongo1

我这边是个代理服务

Yinpinghua avatar Oct 22 '20 08:10 Yinpinghua

请让您的客户分享一个“最小可编译的可验证示例”来说明问题。

您可以通过以下方式将代码括在反引号中,以在此问题的注释中发布代码:

void test()
{
  do_something();
}

madmongo1 avatar Oct 22 '20 08:10 madmongo1

boost::optional<http::request_parser<http::buffer_body>> server_parser_;

beast::flat_buffer server_buffer_;

void http_session::do_read_https_header() { // Set the timeout. beast::get_lowest_layer(tcp_stream_).expires_after(std::chrono::seconds(30)); // Read a request server_parser_.emplace(); // server_parser_->header_limit(10 * 1024 * 1024); server_parser_->body_limit(500 * 1024 * 1024);

http::async_read_header(tcp_stream_, server_buffer_, *server_parser_,
	boost::beast::bind_front_handler(
		[self = shared_from_this()](const beast::error_code& ec, size_t byte_read){
	try
	{
		beast::get_lowest_layer(self->tcp_stream_).expires_never();
		...
}));

}

void http_session::do_read_http_body() {

beast::get_lowest_layer(tcp_stream_).expires_after(std::chrono::seconds(30));
memset(server_recv_buf_, 0, sizeof(server_recv_buf_));
server_parser_->get().body().data = server_recv_buf_;
server_parser_->get().body().size = sizeof(server_recv_buf_);

http::async_read(
	tcp_stream_,
	server_buffer_,
	*server_parser_,
	boost::beast::bind_front_handler(
		[self = shared_from_this()](const beast::error_code& ec, std::size_t bytes_transferred){
	beast::get_lowest_layer(self->tcp_stream_).expires_never();

	if (ec) {
		if (ec != beast::http::error::need_buffer) {
			self->do_client_stream_eof();
			self->do_tcp_stream_eof();
			self->fail(ec, " http_session::do_read_http_body");
			return;
		}
	}

	self->client_send_msg_.body().data = self->server_recv_buf_;
	self->client_send_msg_.body().size =
		sizeof(self->server_recv_buf_) - self->server_parser_->get().body().size;
	self->client_send_msg_.body().more = !self->server_parser_->is_done();

	if (self->is_client_ssl_) {
		self->client_send_write_https_body();
	}
	else {
		self->client_send_write_http_body();
	}
}));

}

Yinpinghua avatar Oct 22 '20 08:10 Yinpinghua

@Yinpinghua Is this still open?

ashtum avatar Dec 31 '23 10:12 ashtum

yes

------------------ 原始邮件 ------------------ 发件人: "Mohammad @.>; 发送时间: 2024年1月8日(星期一) 晚上10:25 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [boostorg/beast] 关于解析器中的body_limit设置提问 (#2087)

Closed #2087 as not planned.

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

Yinpinghua avatar Jan 09 '24 01:01 Yinpinghua

Could you please provide a minimal, reproducible code? I have no idea what the problem is, as the provided code doesn't reveal any issues.

ashtum avatar Jan 26 '24 07:01 ashtum