// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_DNS_HOST_RESOLVER_SYSTEM_TASK_H_ #define NET_DNS_HOST_RESOLVER_SYSTEM_TASK_H_ #include <optional> #include <string> #include <vector> #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ref.h" #include "base/task/task_runner.h" #include "net/base/address_list.h" #include "net/base/ip_endpoint.h" #include "net/base/net_export.h" #include "net/base/network_anonymization_key.h" #include "net/base/network_handle.h" #include "net/dns/host_resolver_proc.h" #include "net/dns/public/dns_query_type.h" #include "net/log/net_log_with_source.h" namespace net { class HostResolverCache; SystemDnsResultsCallback; // Calls SystemHostResolverCall() (or in some tests, HostResolverProc::Resolve) // in ThreadPool. So EnsureSystemHostResolverCallReady() must be called before // using this class. // // Performs retries if specified by HostResolverSystemTask::Params. // // Whenever we try to resolve the host, we post a delayed task to check if host // resolution (OnLookupComplete) is completed or not. If the original attempt // hasn't completed, then we start another attempt for host resolution. We take // the results from the first attempt that finishes and ignore the results from // all other attempts. // // This class is designed to be used not just by HostResolverManager, but by // general consumers. // // It should only be used on the main thread to ensure that hooks (see // SetSystemHostResolverOverride()) only ever run on the main thread. class NET_EXPORT HostResolverSystemTask { … }; // Ensures any necessary initialization occurs such that // SystemHostResolverCall() can be called on other threads. NET_EXPORT void EnsureSystemHostResolverCallReady(); // Resolves `host` to an address list, using the system's default host resolver. // (i.e. this calls out to getaddrinfo()). If successful returns OK and fills // `addrlist` with a list of socket addresses. Otherwise returns a // network error code, and fills `os_error` with a more specific error if it // was non-NULL. // `network` is an optional parameter, when specified (!= // handles::kInvalidNetworkHandle) the lookup will be performed specifically for // `network`. // // This should NOT be called in a sandboxed process. NET_EXPORT_PRIVATE int SystemHostResolverCall( const std::string& host, AddressFamily address_family, HostResolverFlags host_resolver_flags, AddressList* addrlist, int* os_error, handles::NetworkHandle network = handles::kInvalidNetworkHandle); // Sets the task runner that system DNS resolution will run on, which is mostly // useful for tests and fuzzers that need reproducibilty of failures. NET_EXPORT_PRIVATE void SetSystemDnsResolutionTaskRunnerForTesting( scoped_refptr<base::TaskRunner> task_runner); // The following will be used to override the behavior of // HostResolverSystemTask. This override will be called instead of posting // SystemHostResolverCall() to a worker thread. The override will only be // invoked on the main thread. // The override should never invoke `results_cb` synchronously. NET_EXPORT void SetSystemDnsResolverOverride( base::RepeatingCallback<void(const std::optional<std::string>& host, AddressFamily address_family, HostResolverFlags host_resolver_flags, SystemDnsResultsCallback results_cb, handles::NetworkHandle network)> dns_override); } // namespace net #endif // NET_DNS_HOST_RESOLVER_SYSTEM_TASK_H_