1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_RESOLVE_CONTEXT_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_RESOLVE_CONTEXT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker #include <vector> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/safe_ref.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/metrics/sample_vector.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/observer_list.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/observer_list_types.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/base/isolation_info.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_config.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_mode.h" 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker namespace net { 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker class ClassicDnsServerIterator; 29*6777b538SAndroid Build Coastguard Worker class DnsSession; 30*6777b538SAndroid Build Coastguard Worker class DnsServerIterator; 31*6777b538SAndroid Build Coastguard Worker class DohDnsServerIterator; 32*6777b538SAndroid Build Coastguard Worker class HostCache; 33*6777b538SAndroid Build Coastguard Worker class HostResolverCache; 34*6777b538SAndroid Build Coastguard Worker class URLRequestContext; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Represents various states of the DoH auto-upgrade process. 37*6777b538SAndroid Build Coastguard Worker // These values are persisted to logs. Entries should not be renumbered and 38*6777b538SAndroid Build Coastguard Worker // numeric values should never be reused. Update the corresponding enums.xml 39*6777b538SAndroid Build Coastguard Worker // entry when making changes here. 40*6777b538SAndroid Build Coastguard Worker enum class DohServerAutoupgradeStatus { 41*6777b538SAndroid Build Coastguard Worker kSuccessWithNoPriorFailures = 0, 42*6777b538SAndroid Build Coastguard Worker kSuccessWithSomePriorFailures = 1, 43*6777b538SAndroid Build Coastguard Worker kFailureWithSomePriorSuccesses = 2, 44*6777b538SAndroid Build Coastguard Worker kFailureWithNoPriorSuccesses = 3, 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker kMaxValue = kFailureWithNoPriorSuccesses 47*6777b538SAndroid Build Coastguard Worker }; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // Per-URLRequestContext data used by HostResolver. Expected to be owned by the 50*6777b538SAndroid Build Coastguard Worker // ContextHostResolver, and all usage/references are expected to be cleaned up 51*6777b538SAndroid Build Coastguard Worker // or cancelled before the URLRequestContext goes out of service. 52*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE ResolveContext : public base::CheckedObserver { 53*6777b538SAndroid Build Coastguard Worker public: 54*6777b538SAndroid Build Coastguard Worker // Number of failures allowed before a DoH server is designated 'unavailable'. 55*6777b538SAndroid Build Coastguard Worker // In AUTOMATIC mode, non-probe DoH queries should not be sent to DoH servers 56*6777b538SAndroid Build Coastguard Worker // that have reached this limit. 57*6777b538SAndroid Build Coastguard Worker // 58*6777b538SAndroid Build Coastguard Worker // This limit is different from the failure limit that governs insecure async 59*6777b538SAndroid Build Coastguard Worker // resolver bypass in multiple ways: NXDOMAIN responses are never counted as 60*6777b538SAndroid Build Coastguard Worker // failures, and the outcome of fallback queries is not taken into account. 61*6777b538SAndroid Build Coastguard Worker static const int kAutomaticModeFailureLimit = 10; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // The amount of time to wait after `StartDohAutoupgradeSuccessTimer()` is 64*6777b538SAndroid Build Coastguard Worker // called before `EmitDohAutoupgradeSuccessMetrics()` will be called to 65*6777b538SAndroid Build Coastguard Worker // possibly record the state of the DoH auto-upgrade process. 66*6777b538SAndroid Build Coastguard Worker static constexpr base::TimeDelta kDohAutoupgradeSuccessMetricTimeout = 67*6777b538SAndroid Build Coastguard Worker base::Minutes(1); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker class DohStatusObserver : public base::CheckedObserver { 70*6777b538SAndroid Build Coastguard Worker public: 71*6777b538SAndroid Build Coastguard Worker // Notification indicating that the current session for which DoH servers 72*6777b538SAndroid Build Coastguard Worker // are being tracked has changed. 73*6777b538SAndroid Build Coastguard Worker virtual void OnSessionChanged() = 0; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // Notification indicating that a DoH server has been marked unavailable, 76*6777b538SAndroid Build Coastguard Worker // but is ready for usage such as availability probes. 77*6777b538SAndroid Build Coastguard Worker // 78*6777b538SAndroid Build Coastguard Worker // |network_change| true if the invalidation was triggered by a network 79*6777b538SAndroid Build Coastguard Worker // connection change. 80*6777b538SAndroid Build Coastguard Worker virtual void OnDohServerUnavailable(bool network_change) = 0; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker protected: 83*6777b538SAndroid Build Coastguard Worker DohStatusObserver() = default; 84*6777b538SAndroid Build Coastguard Worker ~DohStatusObserver() override = default; 85*6777b538SAndroid Build Coastguard Worker }; 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker ResolveContext(URLRequestContext* url_request_context, bool enable_caching); 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker ResolveContext(const ResolveContext&) = delete; 90*6777b538SAndroid Build Coastguard Worker ResolveContext& operator=(const ResolveContext&) = delete; 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker ~ResolveContext() override; 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker // Returns an iterator for DoH DNS servers. 95*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DnsServerIterator> GetDohIterator(const DnsConfig& config, 96*6777b538SAndroid Build Coastguard Worker const SecureDnsMode& mode, 97*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker // Returns an iterator for classic DNS servers. 100*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DnsServerIterator> GetClassicDnsIterator( 101*6777b538SAndroid Build Coastguard Worker const DnsConfig& config, 102*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // Returns whether |doh_server_index| is eligible for use in AUTOMATIC mode, 105*6777b538SAndroid Build Coastguard Worker // that is that consecutive failures are less than kAutomaticModeFailureLimit 106*6777b538SAndroid Build Coastguard Worker // and the server has had at least one successful query or probe. Always 107*6777b538SAndroid Build Coastguard Worker // |false| if |session| is not the current session. 108*6777b538SAndroid Build Coastguard Worker bool GetDohServerAvailability(size_t doh_server_index, 109*6777b538SAndroid Build Coastguard Worker const DnsSession* session) const; 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker // Returns the number of DoH servers available for use in AUTOMATIC mode (see 112*6777b538SAndroid Build Coastguard Worker // GetDohServerAvailability()). Always 0 if |session| is not the current 113*6777b538SAndroid Build Coastguard Worker // session. 114*6777b538SAndroid Build Coastguard Worker size_t NumAvailableDohServers(const DnsSession* session) const; 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker // Record failure to get a response from the server (e.g. SERVFAIL, connection 117*6777b538SAndroid Build Coastguard Worker // failures, or that the server failed to respond before the fallback period 118*6777b538SAndroid Build Coastguard Worker // elapsed. If |is_doh_server| and the number of failures has surpassed a 119*6777b538SAndroid Build Coastguard Worker // threshold, sets the DoH probe state to unavailable. Noop if |session| is 120*6777b538SAndroid Build Coastguard Worker // not the current session. Should only be called with with server failure 121*6777b538SAndroid Build Coastguard Worker // |rv|s, not e.g. OK, ERR_NAME_NOT_RESOLVED (which at the transaction level 122*6777b538SAndroid Build Coastguard Worker // is expected to be nxdomain), or ERR_IO_PENDING. 123*6777b538SAndroid Build Coastguard Worker void RecordServerFailure(size_t server_index, 124*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 125*6777b538SAndroid Build Coastguard Worker int rv, 126*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker // Record that server responded successfully. Noop if |session| is not the 129*6777b538SAndroid Build Coastguard Worker // current session. 130*6777b538SAndroid Build Coastguard Worker void RecordServerSuccess(size_t server_index, 131*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 132*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker // Record how long it took to receive a response from the server. Noop if 135*6777b538SAndroid Build Coastguard Worker // |session| is not the current session. 136*6777b538SAndroid Build Coastguard Worker void RecordRtt(size_t server_index, 137*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 138*6777b538SAndroid Build Coastguard Worker base::TimeDelta rtt, 139*6777b538SAndroid Build Coastguard Worker int rv, 140*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Worker // Return the period the next query should run before fallback to next 143*6777b538SAndroid Build Coastguard Worker // attempt. (Not actually a "timeout" because queries are not typically 144*6777b538SAndroid Build Coastguard Worker // cancelled as additional attempts are made.) |attempt| counts from 0 and is 145*6777b538SAndroid Build Coastguard Worker // used for exponential backoff. 146*6777b538SAndroid Build Coastguard Worker base::TimeDelta NextClassicFallbackPeriod(size_t classic_server_index, 147*6777b538SAndroid Build Coastguard Worker int attempt, 148*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 149*6777b538SAndroid Build Coastguard Worker 150*6777b538SAndroid Build Coastguard Worker // Return the period the next DoH query should run before fallback to next 151*6777b538SAndroid Build Coastguard Worker // attempt. 152*6777b538SAndroid Build Coastguard Worker base::TimeDelta NextDohFallbackPeriod(size_t doh_server_index, 153*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker // Return a timeout for an insecure transaction (from Transaction::Start()). 156*6777b538SAndroid Build Coastguard Worker // Expected that the transaction will skip waiting for this timeout if it is 157*6777b538SAndroid Build Coastguard Worker // using fast timeouts, and also expected that transactions will always wait 158*6777b538SAndroid Build Coastguard Worker // for all attempts to run for at least their fallback period before dying 159*6777b538SAndroid Build Coastguard Worker // with timeout. 160*6777b538SAndroid Build Coastguard Worker base::TimeDelta ClassicTransactionTimeout(const DnsSession* session); 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard Worker // Return a timeout for a secure transaction (from Transaction::Start()). 163*6777b538SAndroid Build Coastguard Worker // Expected that the transaction will skip waiting for this timeout if it is 164*6777b538SAndroid Build Coastguard Worker // using fast timeouts, and also expected that transactions will always wait 165*6777b538SAndroid Build Coastguard Worker // for all attempts to run for at least their fallback period before dying 166*6777b538SAndroid Build Coastguard Worker // with timeout. 167*6777b538SAndroid Build Coastguard Worker base::TimeDelta SecureTransactionTimeout(SecureDnsMode secure_dns_mode, 168*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 169*6777b538SAndroid Build Coastguard Worker 170*6777b538SAndroid Build Coastguard Worker void RegisterDohStatusObserver(DohStatusObserver* observer); 171*6777b538SAndroid Build Coastguard Worker void UnregisterDohStatusObserver(const DohStatusObserver* observer); 172*6777b538SAndroid Build Coastguard Worker url_request_context()173*6777b538SAndroid Build Coastguard Worker URLRequestContext* url_request_context() { return url_request_context_; } url_request_context()174*6777b538SAndroid Build Coastguard Worker const URLRequestContext* url_request_context() const { 175*6777b538SAndroid Build Coastguard Worker return url_request_context_; 176*6777b538SAndroid Build Coastguard Worker } set_url_request_context(URLRequestContext * url_request_context)177*6777b538SAndroid Build Coastguard Worker void set_url_request_context(URLRequestContext* url_request_context) { 178*6777b538SAndroid Build Coastguard Worker DCHECK(!url_request_context_); 179*6777b538SAndroid Build Coastguard Worker DCHECK(url_request_context); 180*6777b538SAndroid Build Coastguard Worker url_request_context_ = url_request_context; 181*6777b538SAndroid Build Coastguard Worker } 182*6777b538SAndroid Build Coastguard Worker host_cache()183*6777b538SAndroid Build Coastguard Worker HostCache* host_cache() { return host_cache_.get(); } host_resolver_cache()184*6777b538SAndroid Build Coastguard Worker HostResolverCache* host_resolver_cache() { 185*6777b538SAndroid Build Coastguard Worker return host_resolver_cache_.get(); 186*6777b538SAndroid Build Coastguard Worker } 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker // Invalidate or clear saved per-context cached data that is not expected to 189*6777b538SAndroid Build Coastguard Worker // stay valid between connections or sessions (eg the HostCache and DNS server 190*6777b538SAndroid Build Coastguard Worker // stats). |new_session|, if non-null, will be the new "current" session for 191*6777b538SAndroid Build Coastguard Worker // which per-session data will be kept. 192*6777b538SAndroid Build Coastguard Worker void InvalidateCachesAndPerSessionData(const DnsSession* new_session, 193*6777b538SAndroid Build Coastguard Worker bool network_change); 194*6777b538SAndroid Build Coastguard Worker current_session_for_testing()195*6777b538SAndroid Build Coastguard Worker const DnsSession* current_session_for_testing() const { 196*6777b538SAndroid Build Coastguard Worker return current_session_.get(); 197*6777b538SAndroid Build Coastguard Worker } 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard Worker void StartDohAutoupgradeSuccessTimer(const DnsSession* session); 200*6777b538SAndroid Build Coastguard Worker doh_autoupgrade_metrics_timer_is_running_for_testing()201*6777b538SAndroid Build Coastguard Worker bool doh_autoupgrade_metrics_timer_is_running_for_testing() { 202*6777b538SAndroid Build Coastguard Worker return doh_autoupgrade_success_metric_timer_.IsRunning(); 203*6777b538SAndroid Build Coastguard Worker } 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker // Returns IsolationInfo that should be used for DoH requests. Using a single 206*6777b538SAndroid Build Coastguard Worker // transient IsolationInfo ensures that DNS requests aren't pooled with normal 207*6777b538SAndroid Build Coastguard Worker // web requests, but still allows them to be pooled with each other, to allow 208*6777b538SAndroid Build Coastguard Worker // reusing connections to the DoH server across different third party 209*6777b538SAndroid Build Coastguard Worker // contexts. One downside of a transient IsolationInfo is that it means 210*6777b538SAndroid Build Coastguard Worker // metadata about the DoH server itself will not be cached across restarts 211*6777b538SAndroid Build Coastguard Worker // (alternative service info if it supports QUIC, for instance). isolation_info()212*6777b538SAndroid Build Coastguard Worker const IsolationInfo& isolation_info() const { return isolation_info_; } 213*6777b538SAndroid Build Coastguard Worker 214*6777b538SAndroid Build Coastguard Worker // Network to perform the DNS lookups for. When equal to 215*6777b538SAndroid Build Coastguard Worker // handles::kInvalidNetworkHandle the decision of which one to target is left 216*6777b538SAndroid Build Coastguard Worker // to the resolver. Virtual for testing. 217*6777b538SAndroid Build Coastguard Worker virtual handles::NetworkHandle GetTargetNetwork() const; 218*6777b538SAndroid Build Coastguard Worker AsSafeRef()219*6777b538SAndroid Build Coastguard Worker base::SafeRef<ResolveContext> AsSafeRef() { 220*6777b538SAndroid Build Coastguard Worker return weak_ptr_factory_.GetSafeRef(); 221*6777b538SAndroid Build Coastguard Worker } 222*6777b538SAndroid Build Coastguard Worker GetWeakPtr()223*6777b538SAndroid Build Coastguard Worker base::WeakPtr<ResolveContext> GetWeakPtr() { 224*6777b538SAndroid Build Coastguard Worker return weak_ptr_factory_.GetWeakPtr(); 225*6777b538SAndroid Build Coastguard Worker } 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Worker private: 228*6777b538SAndroid Build Coastguard Worker friend DohDnsServerIterator; 229*6777b538SAndroid Build Coastguard Worker friend ClassicDnsServerIterator; 230*6777b538SAndroid Build Coastguard Worker // Runtime statistics of DNS server. 231*6777b538SAndroid Build Coastguard Worker struct ServerStats { 232*6777b538SAndroid Build Coastguard Worker explicit ServerStats(std::unique_ptr<base::SampleVector> rtt_histogram); 233*6777b538SAndroid Build Coastguard Worker 234*6777b538SAndroid Build Coastguard Worker ServerStats(ServerStats&&); 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard Worker ~ServerStats(); 237*6777b538SAndroid Build Coastguard Worker 238*6777b538SAndroid Build Coastguard Worker // Count of consecutive failures after last success. 239*6777b538SAndroid Build Coastguard Worker int last_failure_count = 0; 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Worker // True if any success has ever been recorded for this server for the 242*6777b538SAndroid Build Coastguard Worker // current connection. 243*6777b538SAndroid Build Coastguard Worker bool current_connection_success = false; 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker // Last time when server returned failure or exceeded fallback period. Reset 246*6777b538SAndroid Build Coastguard Worker // each time that a server returned success. 247*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_failure; 248*6777b538SAndroid Build Coastguard Worker // Last time when server returned success. 249*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_success; 250*6777b538SAndroid Build Coastguard Worker // Whether the server has ever returned failure. Used for per-provider 251*6777b538SAndroid Build Coastguard Worker // health metrics. 252*6777b538SAndroid Build Coastguard Worker bool has_failed_previously = false; 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker // A histogram of observed RTT . 255*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::SampleVector> rtt_histogram; 256*6777b538SAndroid Build Coastguard Worker }; 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard Worker // Return the (potentially rotating) index of the first configured server (to 259*6777b538SAndroid Build Coastguard Worker // be passed to [Doh]ServerIndexToUse()). Always returns 0 if |session| is not 260*6777b538SAndroid Build Coastguard Worker // the current session. 261*6777b538SAndroid Build Coastguard Worker size_t FirstServerIndex(bool doh_server, const DnsSession* session); 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker bool IsCurrentSession(const DnsSession* session) const; 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard Worker // Returns the ServerStats for the designated server. Returns nullptr if no 266*6777b538SAndroid Build Coastguard Worker // ServerStats found. 267*6777b538SAndroid Build Coastguard Worker ServerStats* GetServerStats(size_t server_index, bool is_doh_server); 268*6777b538SAndroid Build Coastguard Worker 269*6777b538SAndroid Build Coastguard Worker // Return the fallback period for the next query. 270*6777b538SAndroid Build Coastguard Worker base::TimeDelta NextFallbackPeriodHelper(const ServerStats* server_stats, 271*6777b538SAndroid Build Coastguard Worker int attempt); 272*6777b538SAndroid Build Coastguard Worker 273*6777b538SAndroid Build Coastguard Worker template <typename Iterator> 274*6777b538SAndroid Build Coastguard Worker base::TimeDelta TransactionTimeoutHelper(Iterator server_stats_begin, 275*6777b538SAndroid Build Coastguard Worker Iterator server_stats_end); 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker // Record the time to perform a query. 278*6777b538SAndroid Build Coastguard Worker void RecordRttForUma(size_t server_index, 279*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 280*6777b538SAndroid Build Coastguard Worker base::TimeDelta rtt, 281*6777b538SAndroid Build Coastguard Worker int rv, 282*6777b538SAndroid Build Coastguard Worker base::TimeDelta base_fallback_period, 283*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 284*6777b538SAndroid Build Coastguard Worker std::string GetQueryTypeForUma(size_t server_index, 285*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 286*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 287*6777b538SAndroid Build Coastguard Worker std::string GetDohProviderIdForUma(size_t server_index, 288*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 289*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 290*6777b538SAndroid Build Coastguard Worker bool GetProviderUseExtraLogging(size_t server_index, 291*6777b538SAndroid Build Coastguard Worker bool is_doh_server, 292*6777b538SAndroid Build Coastguard Worker const DnsSession* session); 293*6777b538SAndroid Build Coastguard Worker 294*6777b538SAndroid Build Coastguard Worker void NotifyDohStatusObserversOfSessionChanged(); 295*6777b538SAndroid Build Coastguard Worker void NotifyDohStatusObserversOfUnavailable(bool network_change); 296*6777b538SAndroid Build Coastguard Worker 297*6777b538SAndroid Build Coastguard Worker static bool ServerStatsToDohAvailability(const ServerStats& stats); 298*6777b538SAndroid Build Coastguard Worker 299*6777b538SAndroid Build Coastguard Worker // Emit histograms indicating the current state of all configured DoH 300*6777b538SAndroid Build Coastguard Worker // providers (for use in determining whether DoH auto-upgrade was successful). 301*6777b538SAndroid Build Coastguard Worker void EmitDohAutoupgradeSuccessMetrics(); 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker raw_ptr<URLRequestContext> url_request_context_; 304*6777b538SAndroid Build Coastguard Worker 305*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostCache> host_cache_; 306*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolverCache> host_resolver_cache_; 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker // Current maximum server fallback period. Updated on connection change. 309*6777b538SAndroid Build Coastguard Worker base::TimeDelta max_fallback_period_; 310*6777b538SAndroid Build Coastguard Worker 311*6777b538SAndroid Build Coastguard Worker // All DohStatusObservers only hold a WeakPtr<ResolveContext>, so there's no 312*6777b538SAndroid Build Coastguard Worker // need for check_empty to be true. 313*6777b538SAndroid Build Coastguard Worker base::ObserverList<DohStatusObserver, 314*6777b538SAndroid Build Coastguard Worker false /* check_empty */, 315*6777b538SAndroid Build Coastguard Worker false /* allow_reentrancy */> 316*6777b538SAndroid Build Coastguard Worker doh_status_observers_; 317*6777b538SAndroid Build Coastguard Worker 318*6777b538SAndroid Build Coastguard Worker // Per-session data is only stored and valid for the latest session. Before 319*6777b538SAndroid Build Coastguard Worker // accessing, should check that |current_session_| is valid and matches a 320*6777b538SAndroid Build Coastguard Worker // passed in DnsSession. 321*6777b538SAndroid Build Coastguard Worker // 322*6777b538SAndroid Build Coastguard Worker // Using a WeakPtr, so even if a new session has the same pointer as an old 323*6777b538SAndroid Build Coastguard Worker // invalidated session, it can be recognized as a different session. 324*6777b538SAndroid Build Coastguard Worker // 325*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1022059): Make const DnsSession once server stats have been 326*6777b538SAndroid Build Coastguard Worker // moved and no longer need to be read from DnsSession for availability logic. 327*6777b538SAndroid Build Coastguard Worker base::WeakPtr<const DnsSession> current_session_; 328*6777b538SAndroid Build Coastguard Worker // Current index into |config_.nameservers| to begin resolution with. 329*6777b538SAndroid Build Coastguard Worker int classic_server_index_ = 0; 330*6777b538SAndroid Build Coastguard Worker base::TimeDelta initial_fallback_period_; 331*6777b538SAndroid Build Coastguard Worker // Track runtime statistics of each classic (insecure) DNS server. 332*6777b538SAndroid Build Coastguard Worker std::vector<ServerStats> classic_server_stats_; 333*6777b538SAndroid Build Coastguard Worker // Track runtime statistics of each DoH server. 334*6777b538SAndroid Build Coastguard Worker std::vector<ServerStats> doh_server_stats_; 335*6777b538SAndroid Build Coastguard Worker 336*6777b538SAndroid Build Coastguard Worker const IsolationInfo isolation_info_; 337*6777b538SAndroid Build Coastguard Worker 338*6777b538SAndroid Build Coastguard Worker base::OneShotTimer doh_autoupgrade_success_metric_timer_; 339*6777b538SAndroid Build Coastguard Worker 340*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<ResolveContext> weak_ptr_factory_{this}; 341*6777b538SAndroid Build Coastguard Worker }; 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker } // namespace net 344*6777b538SAndroid Build Coastguard Worker 345*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_RESOLVE_CONTEXT_H_ 346