4#include <unordered_map>
6#include <coroio/promises.hpp>
7#include <coroio/socket.hpp>
26 TResolvConf(
const std::string& fn =
"/etc/resolv.conf");
44 void Load(std::istream& input);
60 template<
typename TSocket>
62 auto socket = std::make_shared<TSocket>(std::move(sock));
64 co_await socket->Connect(addr, deadline);
67 co_return co_await socket->ReadSome(buf, size);
70 co_return co_await socket->WriteSome(buf, size);
75 co_await Connector(addr, deadline);
79 co_return co_await Reader(buf, size);
83 co_return co_await Writer(buf, size);
87 std::function<TFuture<void>(
const TAddress& addr, TTime deadline)> Connector;
88 std::function<TFuture<ssize_t>(
void* buf,
size_t size)> Reader;
89 std::function<TFuture<ssize_t>(
const void* buf,
size_t size)> Writer;
126 template<
typename TPoller>
127 TResolver(TPoller& poller, EDNSType defaultType = EDNSType::A);
138 template<
typename TPoller>
149 template<
typename TPoller>
150 TResolver(
TAddress dnsAddr, TPoller& poller, EDNSType defaultType = EDNSType::A);
178 std::coroutine_handle<> SenderSuspended;
182 EDNSType DefaultType;
184 struct TResolveRequest {
188 bool operator==(
const TResolveRequest& other)
const {
189 return Name == other.Name && Type == other.Type;
192 size_t hash()
const {
193 std::size_t result = 0;
194 result ^= std::hash<std::string>()(Name) + 0x9e3779b9 + (result << 6) + (result >> 2);
195 result ^= std::hash<EDNSType>()(Type) + 0x9e3779b9 + (result << 6) + (result >> 2);
200 struct TResolveRequestHash
202 std::size_t operator()(
const TResolveRequest& c)
const
208 std::queue<TResolveRequest> AddResolveQueue;
209 std::queue<std::pair<TTime, TResolveRequest>> TimeoutsQueue;
211 struct TResolveResult {
212 std::vector<TAddress> Addresses = {};
213 std::exception_ptr Exception =
nullptr;
217 void ResumeWaiters(TResolveResult&& result,
const TResolveRequest& req);
219 std::unordered_map<TResolveRequest, TResolveResult, TResolveRequestHash> Results;
220 std::unordered_map<TResolveRequest, std::vector<std::coroutine_handle<>>, TResolveRequestHash> WaitingAddrs;
221 std::unordered_map<uint64_t, TResolveRequest> Inflight;
226template<
typename TPoller>
231template<
typename TPoller>
233 :
TResolver(conf.Nameservers[0], poller, defaultType)
236template<
typename TPoller>
238 : DnsAddr(std::move(dnsAddr))
239 , Socket(typename TPoller::
TSocket(poller, DnsAddr.Domain(), SOCK_DGRAM))
240 , DefaultType(defaultType)
243 Sender = SenderTask();
244 Receiver = ReceiverTask();
245 Timeouts = TimeoutsTask([&poller](TTime until) ->
TFuture<void> {
246 co_await poller.Sleep(until);
266 THostPort(
const std::string& host,
int port);
276 if (inet_pton(AF_INET, Host.c_str(), buf) == 1 || inet_pton(AF_INET6, Host.c_str(), buf)) {
280 auto addresses =
co_await resolver.
Resolve(Host);
281 if (addresses.empty()) {
282 throw std::runtime_error(
"Empty address");
285 co_return addresses.front().WithPort(Port);
288 const std::string ToString()
const {
289 return Host +
":" + std::to_string(Port);
292 const std::string& GetHost()
const {
296 int GetPort()
const {
A class representing an IPv4 or IPv6 address (with port).
Definition address.hpp:38
A host:port pair that resolves to a TAddress.
Definition resolver.hpp:261
TFuture< TAddress > Resolve(TResolver &resolver)
Resolves the host to a TAddress using the given resolver.
Definition resolver.hpp:274
Reads nameserver addresses from a resolv.conf-style file or stream.
Definition resolver.hpp:19
std::vector< TAddress > Nameservers
A vector of nameserver addresses.
Definition resolver.hpp:41
Async DNS resolver over UDP.
Definition resolver.hpp:115
TFuture< std::vector< TAddress > > Resolve(const std::string &hostname, EDNSType type=EDNSType::DEFAULT)
Resolves a hostname to a list of IP addresses.
Definition resolver.cpp:266
TResolver(TPoller &poller, EDNSType defaultType=EDNSType::A)
Constructs a TResolver using the default resolv configuration.
Definition resolver.hpp:227
High-level asynchronous socket for network communication.
Definition socket.hpp:367
Implementation of a promise/future system for coroutines.
Owned coroutine handle that carries a result of type T.
Definition corochain.hpp:185
Definition resolver.hpp:57