У меня есть 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).