// Copyright 2012 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_MANAGER_H_ #define NET_DNS_HOST_RESOLVER_MANAGER_H_ #include <stddef.h> #include <stdint.h> #include <deque> #include <map> #include <memory> #include <optional> #include <set> #include <string> #include <string_view> #include <vector> #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "base/values.h" #include "net/base/completion_once_callback.h" #include "net/base/host_port_pair.h" #include "net/base/network_anonymization_key.h" #include "net/base/network_change_notifier.h" #include "net/base/network_handle.h" #include "net/base/prioritized_dispatcher.h" #include "net/dns/dns_config.h" #include "net/dns/host_cache.h" #include "net/dns/host_resolver.h" #include "net/dns/httpssvc_metrics.h" #include "net/dns/public/dns_config_overrides.h" #include "net/dns/public/dns_query_type.h" #include "net/dns/public/secure_dns_mode.h" #include "net/dns/public/secure_dns_policy.h" #include "net/dns/resolve_context.h" #include "net/dns/system_dns_config_change_notifier.h" #include "net/log/net_log_with_source.h" #include "net/socket/datagram_client_socket.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/gurl.h" #include "url/scheme_host_port.h" namespace base { class TickClock; } // namespace base namespace net { class DnsClient; class DnsProbeRunner; class IPAddress; class MDnsClient; class ClientSocketFactory; class MDnsSocketFactory; class NetLog; // Scheduler and controller of host resolution requests. Because of the global // nature of host resolutions, this class is generally expected to be singleton // within the browser and only be interacted with through per-context // ContextHostResolver objects (which are themselves generally interacted with // though the HostResolver interface). // // For each hostname that is requested, HostResolver creates a // HostResolverManager::Job. When this job gets dispatched it creates a task // (HostResolverSystemTask for the system resolver or DnsTask for the async // resolver) which resolves the hostname. If requests for that same host are // made during the job's lifetime, they are attached to the existing job rather // than creating a new one. This avoids doing parallel resolves for the same // host. // // The way these classes fit together is illustrated by: // // // +----------- HostResolverManager ----------+ // | | | // Job Job Job // (for host1, fam1) (for host2, fam2) (for hostx, famx) // / | | / | | / | | // Request ... Request Request ... Request Request ... Request // (port1) (port2) (port3) (port4) (port5) (portX) // // When a HostResolverManager::Job finishes, the callbacks of each waiting // request are run on the origin thread. // // Thread safety: This class is not threadsafe, and must only be called // from one thread! // // The HostResolverManager enforces limits on the maximum number of concurrent // threads using PrioritizedDispatcher::Limits. // // Jobs are ordered in the queue based on their priority and order of arrival. class NET_EXPORT HostResolverManager : public NetworkChangeNotifier::IPAddressObserver, public NetworkChangeNotifier::ConnectionTypeObserver, public SystemDnsConfigChangeNotifier::Observer { … }; // Resolves a local hostname (such as "localhost" or "vhost.localhost") into // IP endpoints (with port 0). Returns true if |host| is a local // hostname and false otherwise. Names will resolve to both IPv4 and IPv6. // This function is only exposed so it can be unit-tested. // TODO(tfarina): It would be better to change the tests so this function // gets exercised indirectly through HostResolverManager. NET_EXPORT_PRIVATE bool ResolveLocalHostname( std::string_view host, std::vector<IPEndPoint>* address_list); } // namespace net #endif // NET_DNS_HOST_RESOLVER_MANAGER_H_