Boost C ++ - утверждение не выполнено: body_.file_.is_open () и превышен лимит тела - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в Boost и пытаюсь добавить запрос POST к одному из примеров клиента. Но мне не удалось прочитать запрос http::quest<http::file_body> на стороне сервера.

Assertion failed: body_.file_.is_open(), file D:\Boost C++ Projects\AsioServre\include\boost _1_72_0\boost\beast\http\impl\file_body_win32.hpp, line 184

Я прочитал код Boost в этом файле file_body_win32.hpp , он просто говорит мне, что файл открытый. Как так? И странно то, что если я поменяю content_type: "text/plain" на content_type: "image/jpeg" (тело открывает изображение), тогда утверждение будет пройдено, но с ошибкой превышения лимита тела.

Клиентская сторона:

std::string path = "C:\\Users\\Jinx\\Desktop\\Damn\\test.txt";
body.open(path.c_str(), boost::beast::file_mode::scan, ec);
req_to.version(version);
req_to.method(http::verb::post);
req_to.target(target);
req_to.set(http::field::host, host);
req_to.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
req_to.set(http::field::content_type, "text/plain");
req_to.content_length(body.size());
req_to.keep_alive(req_.keep_alive());
req_to.body() = std::move(body);
req_to.prepare_payload();

http::async_write(stream_, req_to, beast::bind_front_handler(&session::on_write, shared_from_this()));

На стороне сервера я понятия не имею, какой тип буфера мне следует использовать. Я пробовал мультибуфер, он тоже не работал.

Сторона сервера:

beast::tcp_stream stream_;
beast::flat_buffer buffer_; 
std::shared_ptr<std::string const> doc_root_;
http::request<http::file_body> req_from;

http::async_read(stream_, buffer_, req_from, beast::bind_front_handler(&session::on_read, shared_from_this()));

Согласно документу http :: file_body :

При сериализации , реализация прочитает файл и представит эти октеты как содержимое тела.

Как файл может быть открыт сервером?

...