• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/dns/mapped_host_resolver.h"
6 
7 #include <string>
8 #include <utility>
9 
10 #include "base/strings/string_util.h"
11 #include "base/values.h"
12 #include "net/base/host_port_pair.h"
13 #include "net/base/net_errors.h"
14 #include "net/base/network_anonymization_key.h"
15 #include "net/base/url_util.h"
16 #include "net/dns/host_resolver.h"
17 #include "net/log/net_log_with_source.h"
18 #include "third_party/abseil-cpp/absl/types/optional.h"
19 #include "url/gurl.h"
20 #include "url/scheme_host_port.h"
21 #include "url/url_canon.h"
22 
23 namespace net {
24 
MappedHostResolver(std::unique_ptr<HostResolver> impl)25 MappedHostResolver::MappedHostResolver(std::unique_ptr<HostResolver> impl)
26     : impl_(std::move(impl)) {}
27 
28 MappedHostResolver::~MappedHostResolver() = default;
29 
OnShutdown()30 void MappedHostResolver::OnShutdown() {
31   impl_->OnShutdown();
32 }
33 
34 std::unique_ptr<HostResolver::ResolveHostRequest>
CreateRequest(url::SchemeHostPort host,NetworkAnonymizationKey network_anonymization_key,NetLogWithSource source_net_log,absl::optional<ResolveHostParameters> optional_parameters)35 MappedHostResolver::CreateRequest(
36     url::SchemeHostPort host,
37     NetworkAnonymizationKey network_anonymization_key,
38     NetLogWithSource source_net_log,
39     absl::optional<ResolveHostParameters> optional_parameters) {
40   GURL rewritten_url = host.GetURL();
41   HostMappingRules::RewriteResult result = rules_.RewriteUrl(rewritten_url);
42 
43   switch (result) {
44     case HostMappingRules::RewriteResult::kRewritten:
45       DCHECK(rewritten_url.is_valid());
46       DCHECK_NE(rewritten_url.host_piece(), "^NOTFOUND");
47       return impl_->CreateRequest(url::SchemeHostPort(rewritten_url),
48                                   std::move(network_anonymization_key),
49                                   std::move(source_net_log),
50                                   std::move(optional_parameters));
51     case HostMappingRules::RewriteResult::kInvalidRewrite:
52       // Treat any invalid mapping as if it was "^NOTFOUND" (which should itself
53       // result in `kInvalidRewrite`).
54       return CreateFailingRequest(ERR_NAME_NOT_RESOLVED);
55     case HostMappingRules::RewriteResult::kNoMatchingRule:
56       return impl_->CreateRequest(
57           std::move(host), std::move(network_anonymization_key),
58           std::move(source_net_log), std::move(optional_parameters));
59   }
60 }
61 
62 std::unique_ptr<HostResolver::ResolveHostRequest>
CreateRequest(const HostPortPair & host,const NetworkAnonymizationKey & network_anonymization_key,const NetLogWithSource & source_net_log,const absl::optional<ResolveHostParameters> & optional_parameters)63 MappedHostResolver::CreateRequest(
64     const HostPortPair& host,
65     const NetworkAnonymizationKey& network_anonymization_key,
66     const NetLogWithSource& source_net_log,
67     const absl::optional<ResolveHostParameters>& optional_parameters) {
68   HostPortPair rewritten = host;
69   rules_.RewriteHost(&rewritten);
70 
71   if (rewritten.host() == "^NOTFOUND") {
72     return CreateFailingRequest(ERR_NAME_NOT_RESOLVED);
73   }
74 
75   return impl_->CreateRequest(rewritten, network_anonymization_key,
76                               source_net_log, optional_parameters);
77 }
78 
79 std::unique_ptr<HostResolver::ProbeRequest>
CreateDohProbeRequest()80 MappedHostResolver::CreateDohProbeRequest() {
81   return impl_->CreateDohProbeRequest();
82 }
83 
GetHostCache()84 HostCache* MappedHostResolver::GetHostCache() {
85   return impl_->GetHostCache();
86 }
87 
GetDnsConfigAsValue() const88 base::Value::Dict MappedHostResolver::GetDnsConfigAsValue() const {
89   return impl_->GetDnsConfigAsValue();
90 }
91 
SetRequestContext(URLRequestContext * request_context)92 void MappedHostResolver::SetRequestContext(URLRequestContext* request_context) {
93   impl_->SetRequestContext(request_context);
94 }
95 
GetManagerForTesting()96 HostResolverManager* MappedHostResolver::GetManagerForTesting() {
97   return impl_->GetManagerForTesting();
98 }
99 
100 }  // namespace net
101