xref: /aosp_15_r20/external/cronet/net/dns/host_resolver_proc.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_HOST_RESOLVER_PROC_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_HOST_RESOLVER_PROC_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace net {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker class AddressList;
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // Interface for a getaddrinfo()-like procedure. This is used by tests
20*6777b538SAndroid Build Coastguard Worker // to control the underlying resolutions in HostResolverManager.
21*6777b538SAndroid Build Coastguard Worker // HostResolverProcs can be chained together; they fallback to the next
22*6777b538SAndroid Build Coastguard Worker // procedure in the chain by calling ResolveUsingPrevious(). Unless
23*6777b538SAndroid Build Coastguard Worker // `allow_fallback_to_system_or_default` is set to false, `default_proc_`
24*6777b538SAndroid Build Coastguard Worker // (set via SetDefault()) is added to the end of the chain and the actual system
25*6777b538SAndroid Build Coastguard Worker // resolver acts as the final fallback after the default proc.
26*6777b538SAndroid Build Coastguard Worker //
27*6777b538SAndroid Build Coastguard Worker // Note that implementations of HostResolverProc *MUST BE THREADSAFE*, since
28*6777b538SAndroid Build Coastguard Worker // the HostResolver implementation using them can be multi-threaded.
29*6777b538SAndroid Build Coastguard Worker class NET_EXPORT HostResolverProc
30*6777b538SAndroid Build Coastguard Worker     : public base::RefCountedThreadSafe<HostResolverProc> {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   explicit HostResolverProc(scoped_refptr<HostResolverProc> previous,
33*6777b538SAndroid Build Coastguard Worker                             bool allow_fallback_to_system_or_default = true);
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   HostResolverProc(const HostResolverProc&) = delete;
36*6777b538SAndroid Build Coastguard Worker   HostResolverProc& operator=(const HostResolverProc&) = delete;
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker   // Resolves |host| to an address list, restricting the results to addresses
39*6777b538SAndroid Build Coastguard Worker   // in |address_family|. If successful returns OK and fills |addrlist| with
40*6777b538SAndroid Build Coastguard Worker   // a list of socket addresses. Otherwise returns a network error code, and
41*6777b538SAndroid Build Coastguard Worker   // fills |os_error| with a more specific error if it was non-NULL.
42*6777b538SAndroid Build Coastguard Worker   virtual int Resolve(const std::string& host,
43*6777b538SAndroid Build Coastguard Worker                       AddressFamily address_family,
44*6777b538SAndroid Build Coastguard Worker                       HostResolverFlags host_resolver_flags,
45*6777b538SAndroid Build Coastguard Worker                       AddressList* addrlist,
46*6777b538SAndroid Build Coastguard Worker                       int* os_error) = 0;
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // Same as above but requires an additional `network` parameter. Differently
49*6777b538SAndroid Build Coastguard Worker   // from above the lookup will be performed specifically for `network`.
50*6777b538SAndroid Build Coastguard Worker   virtual int Resolve(const std::string& host,
51*6777b538SAndroid Build Coastguard Worker                       AddressFamily address_family,
52*6777b538SAndroid Build Coastguard Worker                       HostResolverFlags host_resolver_flags,
53*6777b538SAndroid Build Coastguard Worker                       AddressList* addrlist,
54*6777b538SAndroid Build Coastguard Worker                       int* os_error,
55*6777b538SAndroid Build Coastguard Worker                       handles::NetworkHandle network);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker  protected:
58*6777b538SAndroid Build Coastguard Worker   friend class base::RefCountedThreadSafe<HostResolverProc>;
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   virtual ~HostResolverProc();
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Asks the fallback procedure (if set) to do the resolve.
63*6777b538SAndroid Build Coastguard Worker   int ResolveUsingPrevious(const std::string& host,
64*6777b538SAndroid Build Coastguard Worker                            AddressFamily address_family,
65*6777b538SAndroid Build Coastguard Worker                            HostResolverFlags host_resolver_flags,
66*6777b538SAndroid Build Coastguard Worker                            AddressList* addrlist,
67*6777b538SAndroid Build Coastguard Worker                            int* os_error);
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker  private:
70*6777b538SAndroid Build Coastguard Worker   friend class HostResolverManager;
71*6777b538SAndroid Build Coastguard Worker   friend class HostResolverSystemTask;
72*6777b538SAndroid Build Coastguard Worker   friend class MockHostResolverBase;
73*6777b538SAndroid Build Coastguard Worker   friend class ScopedDefaultHostResolverProc;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   // Sets the previous procedure in the chain.  Aborts if this would result in a
76*6777b538SAndroid Build Coastguard Worker   // cycle.
77*6777b538SAndroid Build Coastguard Worker   void SetPreviousProc(scoped_refptr<HostResolverProc> proc);
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   // Sets the last procedure in the chain, i.e. appends |proc| to the end of the
80*6777b538SAndroid Build Coastguard Worker   // current chain.  Aborts if this would result in a cycle.
81*6777b538SAndroid Build Coastguard Worker   void SetLastProc(scoped_refptr<HostResolverProc> proc);
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   // Returns the last procedure in the chain starting at |proc|.  Will return
84*6777b538SAndroid Build Coastguard Worker   // NULL iff |proc| is NULL.
85*6777b538SAndroid Build Coastguard Worker   static HostResolverProc* GetLastProc(HostResolverProc* proc);
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker   // Sets the default host resolver procedure that is used by
88*6777b538SAndroid Build Coastguard Worker   // HostResolverManager. This can be used through ScopedDefaultHostResolverProc
89*6777b538SAndroid Build Coastguard Worker   // to set a catch-all DNS block in unit-tests (individual tests should use
90*6777b538SAndroid Build Coastguard Worker   // MockHostResolver to prevent hitting the network).
91*6777b538SAndroid Build Coastguard Worker   static HostResolverProc* SetDefault(HostResolverProc* proc);
92*6777b538SAndroid Build Coastguard Worker   static HostResolverProc* GetDefault();
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   bool allow_fallback_to_system_;
95*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HostResolverProc> previous_proc_;
96*6777b538SAndroid Build Coastguard Worker   static HostResolverProc* default_proc_;
97*6777b538SAndroid Build Coastguard Worker };
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker }  // namespace net
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker #endif  // NET_DNS_HOST_RESOLVER_PROC_H_
102