Каковы требования для чтения и записи из потока http (в boost :: beast)? - PullRequest
2 голосов
/ 06 апреля 2019

Я хотел бы использовать boost :: beast для чтения и записи в etcd. Для начала я хотел бы иметь возможность сделать эти примеры с бустом зверя. Они легко выполнимы с завитком. Etcd можно рассматривать как хранилище ключей / значений. Функции set / get (put / range на странице примеров) легко сделать с примером клиента boost :: beast . Там нет проблем.

Но "смотреть", я не понимаю. Согласно документам , часы - это непрерывный поток, в отличие от других, которые являются сеансами, которые умирают сразу после получения результата. Примеры скручивания показывают изменение значения и ответа на месте, пока часы еще активны. Я должен использовать этот же поток для выполнения всего, что связано с этими часами, включая его остановку.

Мой вопрос в целом: Как я могу реализовать это в boost :: beast ?

Скажем, из примера клиента я отправляю ioc.run через поток с

std::thread t(&std::iocontext::run, &ioc);
t.detach();

Теперь у меня есть полный контроль над клиентом в главном потоке. Должен ли я создавать новые http-запросы и отправлять их в async_write через объект сокета? Но тогда, если я это сделаю, я потеряю функции boost :: beast при переносе заголовка http с хорошим http::request<http::string_body> Я должен создавать заголовки вручную? Или я должен просто отправить json с каким-то ограничителем строки, чтобы указать, что сообщение окончено? Как выглядит протокол связи?

Пример с boost :: beast был бы великолепен.

1 Ответ

1 голос
/ 09 апреля 2019

Похоже, etcd использует "долго выполняющиеся запросы". Для этого вы хотите использовать http::read_header [1] или http::async_read_header [2] для получения заголовка ответа, а затем использовать http::read_some [3] или http::async_read_some [4] в цикле для чтения частей тело ответа. Чтобы это работало без ошибок, вы должны использовать http::buffer_body [5], который предназначен для такого рода вещей. Пример HTTP Relay [6] в документации демонстрирует использование buffer_body и может быть адаптирован для обработки длительных запросов.

[1] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__read_header/overload2.html

[2] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__async_read_header.html

[3] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__read_some/overload2.html

{4] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__async_read_some.html

[5] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__buffer_body.html

[6] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/more_examples/http_relay.html

...