Улучшает ли asio ssl :: stream поддерживает несколько ожидающих вызовов http :: async_write? - PullRequest
2 голосов
/ 29 марта 2020

У меня есть http-клиент, который выполняет http :: async_write () с обратным вызовом, который выполняет http :: async_read () в ssl :: stream. Все операции asyn c заключены в одну и ту же явную цепочку.

Упрощенный код выглядит следующим образом

http::async_write(
        *tcp_session_->tcp_stream(), *request,
        boost::asio::bind_executor(
            tcp_session_strand_,
            [request, this](
                boost::system::error_code ec,
                std::size_t /* bytes_transferred */) {
              if (ec) {
                return;
              }
              auto response_buffer =
                  std::make_shared<boost::beast::flat_buffer>();
              auto response = std::make_shared<HttpResponse>();
              http::async_read(
                  *tcp_session_->tcp_stream(), *response_buffer, *response,
                  boost::asio::bind_executor(
                      tcp_session_strand_,
                      [request, done, response_buffer, response](
                          boost::system::error_code ec,
                          std::size_t /*bytes_transferred*/) {
                        if (ec) {
                          // log error
                          return;
                        }
                      }));
            }));

Я вызываю async_write два раза подряд. Я не жду завершения первого обработчика async_write до выполнения второй записи.

Я вижу такое поведение. Первый async_write завершен, затем второй async_write завершен, затем первый async_read вызывается с ошибкой: «Операция отменена». Это воспроизводится довольно последовательно, поэтому я предполагаю, что ssl :: stream не поддерживает несколько ожидающих http запросов. В основном нужно ждать ответа перед отправкой следующего запроса.

Правильно ли мое предположение? Я прочитал документацию по ssl :: stream, но об этом ничего не сказано (только то, что asyn c операции должны быть сериализованы с помощью strand).

...