Использование другого анализатора запросов в зависимости от запрашиваемого маршрута
Я внедряю мини-http-сервер с использованием boost beast. сервер имеет два разных маршрута POST / upload /..., а другой - POST / info. Первый используется для загрузки некоторых больших файлов, а второй - для хедлинговых объектов json. Чтобы сохранить производительность как можно выше, я пытаюсь проанализировать каждый маршрут с подходящим синтаксическим анализатором file_body и string_body/dynamic_body. Я надеялся, что можно сделать что-то вроде:
http::async_read_header(
socket_,
buffer_,
request_,
[self](beast::error_code ec, std::size_t)
{
if (!ec)
self->request_.body().data();
});
но это кажется невозможным.
Есть ли способ использовать разные тела запросов в зависимости от информации заголовка?
Спасибо заранее
1 ответ
Это должно быть описано в документации, но вот как это сделать: Используйте тип beast::request_parser<beast::empty_body>
сначала прочитать заголовок, а затем, в зависимости от содержимого заголовка, вы перемещаете-создаете новый парсер из старого с нужным вам типом тела. Пример:
// Deferred body type commitment
request_parser<empty_body> req0;
...
request_parser<string_body> req{std::move(req0)};
Вы можете прочитать полную документацию по переключению типов телосложения здесь: https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__parser/parser/overload5.html