7#ifndef BOOST_REDIS_CONNECTOR_HPP
8#define BOOST_REDIS_CONNECTOR_HPP
10#include <boost/redis/detail/helper.hpp>
11#include <boost/redis/error.hpp>
12#include <boost/asio/compose.hpp>
13#include <boost/asio/connect.hpp>
14#include <boost/asio/coroutine.hpp>
15#include <boost/asio/ip/tcp.hpp>
16#include <boost/asio/cancel_after.hpp>
20namespace boost::redis::detail
23template <
class Connector,
class Stream>
25 Connector* ctor_ =
nullptr;
26 Stream* stream =
nullptr;
27 asio::ip::tcp::resolver::results_type
const* res_ =
nullptr;
28 asio::coroutine coro{};
31 void operator()( Self& self
32 , system::error_code
const& ec = {}
33 , asio::ip::tcp::endpoint
const& ep= {})
35 BOOST_ASIO_CORO_REENTER (coro)
38 asio::async_connect(*stream, *res_,
39 [](system::error_code
const&,
auto const&) {
return true; },
40 asio::cancel_after(ctor_->timeout_, std::move(self)));
42 ctor_->endpoint_ = ep;
44 if (ec == asio::error::operation_aborted) {
55 void set_config(config
const& cfg)
56 { timeout_ = cfg.connect_timeout; }
58 template <
class Stream,
class CompletionToken>
62 asio::ip::tcp::resolver::results_type
const& res,
63 CompletionToken&& token)
65 return asio::async_compose
67 , void(system::error_code)
68 >(connect_op<connector, Stream>{
this, &stream, &res}, token);
71 auto const& endpoint() const noexcept {
return endpoint_;}
74 template <
class,
class>
friend struct connect_op;
76 std::chrono::steady_clock::duration timeout_ = std::chrono::seconds{2};
77 asio::ip::tcp::endpoint endpoint_;
@ connect_timeout
Connect timeout.