Асинхронный HTTP-клиент Boost Beast + std :: future - PullRequest
0 голосов
/ 03 марта 2019

У меня есть проект, который будет работать в сети и хотел бы обернуть базовую реализацию запросов Boost Beast HTTP (S) внутри фьючерсов.

Я скопировал класс session из https://www.boost.org/doc/libs/1_69_0/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp ихотите изменить session::run() тип возврата на std::future<http::response<http::string_body>>.Кроме того, измените место // Write the message to standard out на настройку результата в обещании вместо печати. ​​

Вопросы:

  • , куда поместить обещание, которое будет использоваться для созданиябудущее?Является ли ученик правильным выбором?
  • где поставить boost::asio::io_context ioc?Должно ли оно быть в цикле ядра моего собственного приложения (при условии, что приложение будет запускать несколько запросов в течение своего срока службы), а затем передавать ссылку на ioc при выполнении запросов? А как насчет ioc.run()?- Мне нужно, чтобы он работал постоянно, я должен открыть специальный поток для запуска ioc, чтобы избежать блокировки?
  • Как обрабатывать session ошибки?Я хотел бы использовать интерфейс std::promise и поместить исключение на случай, если что-то пойдет не так - в основном замените все вызовы на fail() в примере с соответствующими исключениями.Но я не могу просто поместить объект исключения в обещание, он ожидает std::exception_ptr - я должен просто бросить, немедленно поймать его и поставить std::current_exception()?Мне кажется, что это плохой взлом.
  • Будет ли это работать, если я не создаю какие-либо темы в программе?Если нет, какой будет хороший способ запросить у объекта session, что все задачи выполнены?

Редактировать: добавлен еще вопрос о ioc (выделено жирным шрифтом)

...