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