xref: /aosp_15_r20/external/cronet/net/dns/resolve_context.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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