COROIO: coroio/resolver.hpp Source File
COROIO
 
Loading...
Searching...
No Matches
resolver.hpp
1#pragma once
2
3#include <exception>
4#include <unordered_map>
5
6#include "promises.hpp"
7#include "socket.hpp"
8#include "corochain.hpp"
9
10namespace NNet {
11
21public:
27 TResolvConf(const std::string& fn = "/etc/resolv.conf");
36 TResolvConf(std::istream& input);
42 std::vector<TAddress> Nameservers;
43
44private:
45 void Load(std::istream& input);
46};
47
52enum class EDNSType {
53 DEFAULT = 0,
54 A = 1,
55 AAAA = 28,
56};
57
83template<typename TPoller>
84class TResolver {
85public:
95 TResolver(TPoller& poller, EDNSType defaultType = EDNSType::A);
106 TResolver(const TResolvConf& conf, TPoller& poller, EDNSType defaultType = EDNSType::A);
116 TResolver(TAddress dnsAddr, TPoller& poller, EDNSType defaultType = EDNSType::A);
117 ~TResolver();
118
132 TFuture<std::vector<TAddress>> Resolve(const std::string& hostname, EDNSType type = EDNSType::DEFAULT);
133
134private:
135 TFuture<void> SenderTask();
136 TFuture<void> ReceiverTask();
137 TFuture<void> TimeoutsTask();
138
139 void ResumeSender();
140
141 TFuture<void> Sender;
142 TFuture<void> Receiver;
143 TFuture<void> Timeouts;
144 std::coroutine_handle<> SenderSuspended;
145
146 TAddress DnsAddr;
147 TSocket Socket;
148 TPoller& Poller;
149 EDNSType DefaultType;
150
151 struct TResolveRequest {
152 std::string Name;
153 EDNSType Type;
154
155 bool operator==(const TResolveRequest& other) const {
156 return Name == other.Name && Type == other.Type;
157 }
158
159 size_t hash() const {
160 std::size_t result = 0;
161 result ^= std::hash<std::string>()(Name) + 0x9e3779b9 + (result << 6) + (result >> 2);
162 result ^= std::hash<EDNSType>()(Type) + 0x9e3779b9 + (result << 6) + (result >> 2);
163 return result;
164 }
165 };
166
167 struct TResolveRequestHash
168 {
169 std::size_t operator()(const TResolveRequest& c) const
170 {
171 return c.hash();
172 }
173 };
174
175 std::queue<TResolveRequest> AddResolveQueue;
176 std::queue<std::pair<TTime, TResolveRequest>> TimeoutsQueue;
177
178 struct TResolveResult {
179 std::vector<TAddress> Addresses = {};
180 std::exception_ptr Exception = nullptr;
181 int Retries = 0;
182 };
183
184 void ResumeWaiters(TResolveResult&& result, const TResolveRequest& req);
185
186 std::unordered_map<TResolveRequest, TResolveResult, TResolveRequestHash> Results;
187 std::unordered_map<TResolveRequest, std::vector<std::coroutine_handle<>>, TResolveRequestHash> WaitingAddrs;
188 std::unordered_map<uint64_t, TResolveRequest> Inflight;
189
190 uint16_t Xid = 1;
191};
192
193class THostPort {
194public:
195 THostPort(const std::string& hostPort);
196 THostPort(const std::string& host, int port);
197
198 template<typename T>
199 TFuture<TAddress> Resolve(TResolver<T>& resolver);
200
201private:
202 std::string Host;
203 int Port;
204};
205
206} // namespace NNet
A class representing an IPv4 or IPv6 address (with port).
Definition address.hpp:30
Reads and stores DNS configuration from a file or an input stream.
Definition resolver.hpp:20
std::vector< TAddress > Nameservers
A vector of nameserver addresses.
Definition resolver.hpp:42
TResolvConf(std::istream &input)
Constructs a TResolvConf from an input stream.
TResolvConf(const std::string &fn="/etc/resolv.conf")
Constructs a TResolvConf and loads DNS configuration from a file.
Resolves hostnames into IP addresses using a custom poller.
Definition resolver.hpp:84
TFuture< std::vector< TAddress > > Resolve(const std::string &hostname, EDNSType type=EDNSType::DEFAULT)
Resolves a hostname to a list of addresses.
TResolver(TAddress dnsAddr, TPoller &poller, EDNSType defaultType=EDNSType::A)
Constructs a TResolver using a specific DNS address.
TResolver(TPoller &poller, EDNSType defaultType=EDNSType::A)
Constructs a TResolver using the default resolv configuration.
TResolver(const TResolvConf &conf, TPoller &poller, EDNSType defaultType=EDNSType::A)
Constructs a TResolver with a specified DNS configuration.
High-level asynchronous socket for network communication.
Definition socket.hpp:364
Implementation of a promise/future system for coroutines.
Future type for coroutines returning a value of type T.
Definition corochain.hpp:177