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