xref: /aosp_15_r20/external/cronet/net/dns/host_resolver_proc.cc (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 #include "net/dns/host_resolver_proc.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <tuple>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
12*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver_system_task.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_OPENBSD)
19*6777b538SAndroid Build Coastguard Worker #define AI_ADDRCONFIG 0
20*6777b538SAndroid Build Coastguard Worker #endif
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace net {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker HostResolverProc* HostResolverProc::default_proc_ = nullptr;
25*6777b538SAndroid Build Coastguard Worker 
HostResolverProc(scoped_refptr<HostResolverProc> previous,bool allow_fallback_to_system_or_default)26*6777b538SAndroid Build Coastguard Worker HostResolverProc::HostResolverProc(scoped_refptr<HostResolverProc> previous,
27*6777b538SAndroid Build Coastguard Worker                                    bool allow_fallback_to_system_or_default)
28*6777b538SAndroid Build Coastguard Worker     : allow_fallback_to_system_(allow_fallback_to_system_or_default) {
29*6777b538SAndroid Build Coastguard Worker   SetPreviousProc(previous);
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker   // Implicitly fall-back to the global default procedure.
32*6777b538SAndroid Build Coastguard Worker   if (!previous && allow_fallback_to_system_or_default)
33*6777b538SAndroid Build Coastguard Worker     SetPreviousProc(default_proc_);
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker HostResolverProc::~HostResolverProc() = default;
37*6777b538SAndroid Build Coastguard Worker 
Resolve(const std::string & host,AddressFamily address_family,HostResolverFlags host_resolver_flags,AddressList * addrlist,int * os_error,handles::NetworkHandle network)38*6777b538SAndroid Build Coastguard Worker int HostResolverProc::Resolve(const std::string& host,
39*6777b538SAndroid Build Coastguard Worker                               AddressFamily address_family,
40*6777b538SAndroid Build Coastguard Worker                               HostResolverFlags host_resolver_flags,
41*6777b538SAndroid Build Coastguard Worker                               AddressList* addrlist,
42*6777b538SAndroid Build Coastguard Worker                               int* os_error,
43*6777b538SAndroid Build Coastguard Worker                               handles::NetworkHandle network) {
44*6777b538SAndroid Build Coastguard Worker   if (network == handles::kInvalidNetworkHandle)
45*6777b538SAndroid Build Coastguard Worker     return Resolve(host, address_family, host_resolver_flags, addrlist,
46*6777b538SAndroid Build Coastguard Worker                    os_error);
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   NOTIMPLEMENTED();
49*6777b538SAndroid Build Coastguard Worker   return ERR_NOT_IMPLEMENTED;
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker 
ResolveUsingPrevious(const std::string & host,AddressFamily address_family,HostResolverFlags host_resolver_flags,AddressList * addrlist,int * os_error)52*6777b538SAndroid Build Coastguard Worker int HostResolverProc::ResolveUsingPrevious(
53*6777b538SAndroid Build Coastguard Worker     const std::string& host,
54*6777b538SAndroid Build Coastguard Worker     AddressFamily address_family,
55*6777b538SAndroid Build Coastguard Worker     HostResolverFlags host_resolver_flags,
56*6777b538SAndroid Build Coastguard Worker     AddressList* addrlist,
57*6777b538SAndroid Build Coastguard Worker     int* os_error) {
58*6777b538SAndroid Build Coastguard Worker   if (previous_proc_.get()) {
59*6777b538SAndroid Build Coastguard Worker     return previous_proc_->Resolve(
60*6777b538SAndroid Build Coastguard Worker         host, address_family, host_resolver_flags, addrlist, os_error);
61*6777b538SAndroid Build Coastguard Worker   }
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   // If `allow_fallback_to_system_` is false there is no final fallback. It must
64*6777b538SAndroid Build Coastguard Worker   // be ensured that the Procs can handle any allowed requests. If this check
65*6777b538SAndroid Build Coastguard Worker   // fails while using MockHostResolver or RuleBasedHostResolverProc, it means
66*6777b538SAndroid Build Coastguard Worker   // none of the configured rules matched a host resolution request.
67*6777b538SAndroid Build Coastguard Worker   CHECK(allow_fallback_to_system_);
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   // Final fallback is the system resolver.
70*6777b538SAndroid Build Coastguard Worker   return SystemHostResolverCall(host, address_family, host_resolver_flags,
71*6777b538SAndroid Build Coastguard Worker                                 addrlist, os_error);
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
SetPreviousProc(scoped_refptr<HostResolverProc> proc)74*6777b538SAndroid Build Coastguard Worker void HostResolverProc::SetPreviousProc(scoped_refptr<HostResolverProc> proc) {
75*6777b538SAndroid Build Coastguard Worker   auto current_previous = std::move(previous_proc_);
76*6777b538SAndroid Build Coastguard Worker   // Now that we've guaranteed |this| is the last proc in a chain, we can
77*6777b538SAndroid Build Coastguard Worker   // detect potential cycles using GetLastProc().
78*6777b538SAndroid Build Coastguard Worker   previous_proc_ = (GetLastProc(proc.get()) == this)
79*6777b538SAndroid Build Coastguard Worker                        ? std::move(current_previous)
80*6777b538SAndroid Build Coastguard Worker                        : std::move(proc);
81*6777b538SAndroid Build Coastguard Worker }
82*6777b538SAndroid Build Coastguard Worker 
SetLastProc(scoped_refptr<HostResolverProc> proc)83*6777b538SAndroid Build Coastguard Worker void HostResolverProc::SetLastProc(scoped_refptr<HostResolverProc> proc) {
84*6777b538SAndroid Build Coastguard Worker   GetLastProc(this)->SetPreviousProc(std::move(proc));
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker // static
GetLastProc(HostResolverProc * proc)88*6777b538SAndroid Build Coastguard Worker HostResolverProc* HostResolverProc::GetLastProc(HostResolverProc* proc) {
89*6777b538SAndroid Build Coastguard Worker   if (proc == nullptr)
90*6777b538SAndroid Build Coastguard Worker     return nullptr;
91*6777b538SAndroid Build Coastguard Worker   HostResolverProc* last_proc = proc;
92*6777b538SAndroid Build Coastguard Worker   while (last_proc->previous_proc_.get() != nullptr)
93*6777b538SAndroid Build Coastguard Worker     last_proc = last_proc->previous_proc_.get();
94*6777b538SAndroid Build Coastguard Worker   return last_proc;
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker // static
SetDefault(HostResolverProc * proc)98*6777b538SAndroid Build Coastguard Worker HostResolverProc* HostResolverProc::SetDefault(HostResolverProc* proc) {
99*6777b538SAndroid Build Coastguard Worker   HostResolverProc* old = default_proc_;
100*6777b538SAndroid Build Coastguard Worker   default_proc_ = proc;
101*6777b538SAndroid Build Coastguard Worker   return old;
102*6777b538SAndroid Build Coastguard Worker }
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker // static
GetDefault()105*6777b538SAndroid Build Coastguard Worker HostResolverProc* HostResolverProc::GetDefault() {
106*6777b538SAndroid Build Coastguard Worker   return default_proc_;
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker }  // namespace net
110