xref: /aosp_15_r20/external/cronet/net/dns/dns_transaction.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_DNS_TRANSACTION_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_DNS_TRANSACTION_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <memory>
11*6777b538SAndroid Build Coastguard Worker #include <optional>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <string_view>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/dns/opt_record_rdata.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_mode.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/dns/record_rdata.h"
22*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker namespace net {
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker class DnsResponse;
27*6777b538SAndroid Build Coastguard Worker class DnsSession;
28*6777b538SAndroid Build Coastguard Worker class NetLogWithSource;
29*6777b538SAndroid Build Coastguard Worker class ResolveContext;
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker // The hostname probed by CreateDohProbeRunner().
32*6777b538SAndroid Build Coastguard Worker inline constexpr std::string_view kDohProbeHostname = "www.gstatic.com";
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker // DnsTransaction implements a stub DNS resolver as defined in RFC 1034.
35*6777b538SAndroid Build Coastguard Worker // The DnsTransaction takes care of retransmissions, name server fallback (or
36*6777b538SAndroid Build Coastguard Worker // round-robin), suffix search, and simple response validation ("does it match
37*6777b538SAndroid Build Coastguard Worker // the query") to fight poisoning.
38*6777b538SAndroid Build Coastguard Worker //
39*6777b538SAndroid Build Coastguard Worker // Destroying DnsTransaction cancels the underlying network effort.
40*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE DnsTransaction {
41*6777b538SAndroid Build Coastguard Worker  public:
42*6777b538SAndroid Build Coastguard Worker   // Called with the response or nullptr if no matching response was received.
43*6777b538SAndroid Build Coastguard Worker   // Note that the `GetDottedName()` of the response may be different than the
44*6777b538SAndroid Build Coastguard Worker   // original `hostname` (passed to `DnsTransactionFactory::CreateTransaction()`
45*6777b538SAndroid Build Coastguard Worker   // as a result of suffix search.
46*6777b538SAndroid Build Coastguard Worker   using ResponseCallback =
47*6777b538SAndroid Build Coastguard Worker       base::OnceCallback<void(int neterror, const DnsResponse* response)>;
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   virtual ~DnsTransaction() = default;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   // Returns the original |hostname|.
52*6777b538SAndroid Build Coastguard Worker   virtual const std::string& GetHostname() const = 0;
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   // Returns the |qtype|.
55*6777b538SAndroid Build Coastguard Worker   virtual uint16_t GetType() const = 0;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // Starts the transaction.  Always completes asynchronously.
58*6777b538SAndroid Build Coastguard Worker   virtual void Start(ResponseCallback callback) = 0;
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   virtual void SetRequestPriority(RequestPriority priority) = 0;
61*6777b538SAndroid Build Coastguard Worker };
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker // Startable/Cancellable object to represent a DNS probe sequence.
64*6777b538SAndroid Build Coastguard Worker class DnsProbeRunner {
65*6777b538SAndroid Build Coastguard Worker  public:
66*6777b538SAndroid Build Coastguard Worker   // Destruction cancels the probes.
67*6777b538SAndroid Build Coastguard Worker   virtual ~DnsProbeRunner() = default;
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   // Starts all applicable probes that are not already running. May be called
70*6777b538SAndroid Build Coastguard Worker   // multiple times, but should not be called after destruction of the
71*6777b538SAndroid Build Coastguard Worker   // DnsTransactionFactory.
72*6777b538SAndroid Build Coastguard Worker   //
73*6777b538SAndroid Build Coastguard Worker   // Set |network_change| to indicate if this start or restart was triggered by
74*6777b538SAndroid Build Coastguard Worker   // a network connection change. Only used for logging and metrics.
75*6777b538SAndroid Build Coastguard Worker   virtual void Start(bool network_change) = 0;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   // Gets the delay until the next scheduled probe to the specified DoH server.
78*6777b538SAndroid Build Coastguard Worker   // Returns base::TimeDelta() if no probe scheduled.
79*6777b538SAndroid Build Coastguard Worker   virtual base::TimeDelta GetDelayUntilNextProbeForTest(
80*6777b538SAndroid Build Coastguard Worker       size_t doh_server_index) const = 0;
81*6777b538SAndroid Build Coastguard Worker };
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker // Creates DnsTransaction which performs asynchronous DNS search.
84*6777b538SAndroid Build Coastguard Worker // It does NOT perform caching, aggregation or prioritization of transactions.
85*6777b538SAndroid Build Coastguard Worker //
86*6777b538SAndroid Build Coastguard Worker // Destroying the factory does NOT affect any already created DnsTransactions.
87*6777b538SAndroid Build Coastguard Worker //
88*6777b538SAndroid Build Coastguard Worker // DnsProbeRunners, however, will safely abort themselves on destruction of
89*6777b538SAndroid Build Coastguard Worker // their creating factory, and they should only be started or restarted while
90*6777b538SAndroid Build Coastguard Worker // the factory is still alive.
91*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE DnsTransactionFactory {
92*6777b538SAndroid Build Coastguard Worker  public:
93*6777b538SAndroid Build Coastguard Worker   DnsTransactionFactory();
94*6777b538SAndroid Build Coastguard Worker   virtual ~DnsTransactionFactory();
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   // Creates DnsTransaction for the given |hostname| and |qtype| (assuming
97*6777b538SAndroid Build Coastguard Worker   // QCLASS is IN). |hostname| should be in the dotted form. A dot at the end
98*6777b538SAndroid Build Coastguard Worker   // implies the domain name is fully-qualified and will be exempt from suffix
99*6777b538SAndroid Build Coastguard Worker   // search. |hostname| should not be an IP literal.
100*6777b538SAndroid Build Coastguard Worker   //
101*6777b538SAndroid Build Coastguard Worker   // The |net_log| is used as the parent log.
102*6777b538SAndroid Build Coastguard Worker   //
103*6777b538SAndroid Build Coastguard Worker   // |secure| specifies whether DNS lookups should be performed using DNS-over-
104*6777b538SAndroid Build Coastguard Worker   // HTTPS (DoH) or using plaintext DNS.
105*6777b538SAndroid Build Coastguard Worker   //
106*6777b538SAndroid Build Coastguard Worker   // When |fast_timeout| is true, the transaction will timeout quickly after
107*6777b538SAndroid Build Coastguard Worker   // making its DNS attempts, without necessarily waiting long enough to allow
108*6777b538SAndroid Build Coastguard Worker   // slower-than-average requests to complete. Intended as an optimization for
109*6777b538SAndroid Build Coastguard Worker   // cases where the caller has reasonable fallback options to the transaction
110*6777b538SAndroid Build Coastguard Worker   // and it would be beneficial to move on to those options sooner on signals
111*6777b538SAndroid Build Coastguard Worker   // that the transaction is potentially slow or problematic.
112*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] virtual std::unique_ptr<DnsTransaction> CreateTransaction(
113*6777b538SAndroid Build Coastguard Worker       std::string hostname,
114*6777b538SAndroid Build Coastguard Worker       uint16_t qtype,
115*6777b538SAndroid Build Coastguard Worker       const NetLogWithSource& net_log,
116*6777b538SAndroid Build Coastguard Worker       bool secure,
117*6777b538SAndroid Build Coastguard Worker       SecureDnsMode secure_dns_mode,
118*6777b538SAndroid Build Coastguard Worker       ResolveContext* resolve_context,
119*6777b538SAndroid Build Coastguard Worker       bool fast_timeout) = 0;
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   // Creates a runner to run the DoH probe sequence for all configured DoH
122*6777b538SAndroid Build Coastguard Worker   // resolvers.
123*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] virtual std::unique_ptr<DnsProbeRunner> CreateDohProbeRunner(
124*6777b538SAndroid Build Coastguard Worker       ResolveContext* resolve_context) = 0;
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // The given EDNS0 option will be included in all DNS queries performed by
127*6777b538SAndroid Build Coastguard Worker   // transactions from this factory.
128*6777b538SAndroid Build Coastguard Worker   virtual void AddEDNSOption(std::unique_ptr<OptRecordRdata::Opt> opt) = 0;
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   // Returns the default SecureDnsMode in the config.
131*6777b538SAndroid Build Coastguard Worker   virtual SecureDnsMode GetSecureDnsModeForTest() = 0;
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   // Creates a DnsTransactionFactory which creates DnsTransactionImpl using the
134*6777b538SAndroid Build Coastguard Worker   // |session|.
135*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] static std::unique_ptr<DnsTransactionFactory> CreateFactory(
136*6777b538SAndroid Build Coastguard Worker       DnsSession* session);
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<DnsTransactionFactory> weak_factory_{this};
139*6777b538SAndroid Build Coastguard Worker };
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker }  // namespace net
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker #endif  // NET_DNS_DNS_TRANSACTION_H_
144