Как избежать ошибки body_limit в бусте зверя и правильно обрабатывать большие сообщения - PullRequest
1 голос
/ 25 октября 2019

У меня есть случаи, когда есть частичный ответ, который слишком велик для зверя, и я хочу остановиться, прежде чем доберусь до body_limit зверя, и продолжить обработку сообщения с этой точки, используя обычный boost :: asio. Имейте в виду, что это (очевидно) означает, что я уже получил заголовок и большую часть тела.

Я использую его для обратного прокси-сервера, поэтому в основном я хочу как-то отправить неполный ответ наhttp-клиент, продолжая ретрансляцию оставшихся данных ответа с помощью boost :: asio.

Я предполагаю, что мне нужно каким-то образом сериализовать неполный ответ, возможно, используя operator<< to std::stringstream, отправьте этоклиенту, используя boost :: asio, и продолжайте общение оттуда.

Будет ли это работать? Это правильный способ сделать это, или есть лучший способ, может быть, даже с использованием Apast Beast? Есть ли другой способ обработки фрагментированных сообщений, которые в API зверя могут превысить body_limit?

Заранее спасибо, Дэвид.

ОБНОВЛЕНИЕ

Я, наконец, отказался от идеи вернуться к boost asio, и теперь пытаюсь получить http-сообщение (chunked или обычный) в чанках с буфером фиксированного размера, чтобы я не достигал предела тела. Я только что закончил пробежку по Получать / анализировать тело сообщения по одному куску за раз · Выпуск # 154 · boostorg / beast , и кажется, что это именно то, что мне нужно. Я также пытаюсь реализовать обратный прокси-сервер .. Я пытался использовать Incremental Read 1. - 1.70.0 , но получаю ошибку Reference to non-static member function must be called при попытке скомпилировать эту строку:

ctx->response.get().body().data = response_buffer;

Может быть, страница примера инкрементного чтения не обновлена ​​с использованием последнего синтаксиса? У вас есть пример, относящийся к обратному прокси, который я пытаюсь написать?

Заранее спасибо, Дэвид

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Может быть, страница примера инкрементного чтения не обновлена ​​с использованием последнего синтаксиса? У вас есть пример, относящийся к обратному прокси, который я пытаюсь написать?

Примеры в документации скомпилированы, поэтому они не могут быть устаревшими. Возможно, вы смешиваете разные версии примера и Beast? Вы используете http::buffer_body? Как выглядит объявление вашего сообщения?

1 голос
/ 28 октября 2019

По умолчанию парсер Beast ограничивает размер тела до 1 МБ для запросов и до 8 МБ для ответов. Это сделано для того, чтобы предотвратить тривиальные атаки истощения ресурсов. Вы всегда можете увеличить лимит или полностью его устранить (установив его на наибольшее значение uint64_t), вызвав parser::body_limit: https://www.boost.org/doc/libs/1_71_0/libs/beast/doc/html/beast/ref/boost__beast__http__parser/body_limit.html

...