Loading...
Searching...
No Matches
resolver.hpp
1/* Copyright (c) 2018-2024 Marcelo Zimbres Silva (mzimbres@gmail.com)
2 *
3 * Distributed under the Boost Software License, Version 1.0. (See
4 * accompanying file LICENSE.txt)
5 */
6
7#ifndef BOOST_REDIS_RESOLVER_HPP
8#define BOOST_REDIS_RESOLVER_HPP
9
10#include <boost/redis/config.hpp>
11#include <boost/redis/detail/helper.hpp>
12#include <boost/redis/error.hpp>
13#include <boost/asio/compose.hpp>
14#include <boost/asio/coroutine.hpp>
15#include <boost/asio/ip/tcp.hpp>
16#include <boost/asio/cancel_after.hpp>
17#include <string>
18#include <chrono>
19
20namespace boost::redis::detail
21{
22
23template <class Resolver>
24struct resolve_op {
25 Resolver* resv_ = nullptr;
26 asio::coroutine coro{};
27
28 template <class Self>
29 void operator()( Self& self
30 , system::error_code ec = {}
31 , asio::ip::tcp::resolver::results_type res = {})
32 {
33 BOOST_ASIO_CORO_REENTER (coro)
34 {
35 BOOST_ASIO_CORO_YIELD
36 resv_->resv_.async_resolve(
37 resv_->addr_.host,
38 resv_->addr_.port,
39 asio::cancel_after(resv_->timeout_, std::move(self)));
40
41 resv_->results_ = res;
42
43 if (ec == asio::error::operation_aborted) {
44 self.complete(error::resolve_timeout);
45 } else {
46 self.complete(ec);
47 }
48 }
49 }
50};
51
52template <class Executor>
53class resolver {
54public:
55 resolver(Executor ex) : resv_{ex} {}
56
57 template <class CompletionToken>
58 auto async_resolve(CompletionToken&& token)
59 {
60 return asio::async_compose
61 < CompletionToken
62 , void(system::error_code)
63 >(resolve_op<resolver>{this}, token, resv_);
64 }
65
66 std::size_t cancel(operation op)
67 {
68 switch (op) {
70 case operation::all:
71 resv_.cancel();
72 break;
73 default: /* ignore */;
74 }
75
76 return 0;
77 }
78
79 auto const& results() const noexcept
80 { return results_;}
81
82 void set_config(config const& cfg)
83 {
84 addr_ = cfg.addr;
85 timeout_ = cfg.resolve_timeout;
86 }
87
88private:
89 using resolver_type = asio::ip::basic_resolver<asio::ip::tcp, Executor>;
90 template <class> friend struct resolve_op;
91
92 resolver_type resv_;
93 address addr_;
94 std::chrono::steady_clock::duration timeout_;
95 asio::ip::tcp::resolver::results_type results_;
96};
97
98} // boost::redis::detail
99
100#endif // BOOST_REDIS_RESOLVER_HPP
operation
Connection operations that can be cancelled.
Definition: operation.hpp:18
@ resolve_timeout
Resolve timeout.
@ resolve
Resolve operation.
@ all
Refers to all operations.