Использование другого анализатора запросов в зависимости от запрашиваемого маршрута

Я внедряю мини-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

Другие вопросы по тегам