• 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 <optional>
8 #include <string>
9 #include <utility>
10 
11 #include "base/notimplemented.h"
12 #include "base/strings/string_util.h"
13 #include "base/values.h"
14 #include "net/base/host_port_pair.h"
15 #include "net/base/net_errors.h"
16 #include "net/base/network_anonymization_key.h"
17 #include "net/base/url_util.h"
18 #include "net/dns/host_resolver.h"
19 #include "net/log/net_log_with_source.h"
20 #include "url/gurl.h"
21 #include "url/scheme_host_port.h"
22 #include "url/url_canon.h"
23 
24 namespace net {
25 
MappedHostResolver(std::unique_ptr<HostResolver> impl)26 MappedHostResolver::MappedHostResolver(std::unique_ptr<HostResolver> impl)
27     : impl_(std::move(impl)) {}
28 
29 MappedHostResolver::~MappedHostResolver() = default;
30 
OnShutdown()31 void MappedHostResolver::OnShutdown() {
32   impl_->OnShutdown();
33 }
34 
35 std::unique_ptr<HostResolver::ResolveHostRequest>
CreateRequest(url::SchemeHostPort host,NetworkAnonymizationKey network_anonymization_key,NetLogWithSource source_net_log,std::optional<ResolveHostParameters> optional_parameters)36 MappedHostResolver::CreateRequest(
37     url::SchemeHostPort host,
38     NetworkAnonymizationKey network_anonymization_key,
39     NetLogWithSource source_net_log,
40     std::optional<ResolveHostParameters> optional_parameters) {
41   GURL rewritten_url = host.GetURL();
42   HostMappingRules::RewriteResult result = rules_.RewriteUrl(rewritten_url);
43 
44   switch (result) {
45     case HostMappingRules::RewriteResult::kRewritten:
46       DCHECK(rewritten_url.is_valid());
47       DCHECK_NE(rewritten_url.host_piece(), "^NOTFOUND");
48       return impl_->CreateRequest(url::SchemeHostPort(rewritten_url),
49                                   std::move(network_anonymization_key),
50                                   std::move(source_net_log),
51                                   std::move(optional_parameters));
52     case HostMappingRules::RewriteResult::kInvalidRewrite:
53       // Treat any invalid mapping as if it was "^NOTFOUND" (which should itself
54       // result in `kInvalidRewrite`).
55       return CreateFailingRequest(ERR_NAME_NOT_RESOLVED);
56     case HostMappingRules::RewriteResult::kNoMatchingRule:
57       return impl_->CreateRequest(
58           std::move(host), std::move(network_anonymization_key),
59           std::move(source_net_log), std::move(optional_parameters));
60   }
61 }
62 
63 std::unique_ptr<HostResolver::ResolveHostRequest>
CreateRequest(const HostPortPair & host,const NetworkAnonymizationKey & network_anonymization_key,const NetLogWithSource & source_net_log,const std::optional<ResolveHostParameters> & optional_parameters)64 MappedHostResolver::CreateRequest(
65     const HostPortPair& host,
66     const NetworkAnonymizationKey& network_anonymization_key,
67     const NetLogWithSource& source_net_log,
68     const std::optional<ResolveHostParameters>& optional_parameters) {
69   HostPortPair rewritten = host;
70   rules_.RewriteHost(&rewritten);
71 
72   if (rewritten.host() == "^NOTFOUND") {
73     return CreateFailingRequest(ERR_NAME_NOT_RESOLVED);
74   }
75 
76   return impl_->CreateRequest(rewritten, network_anonymization_key,
77                               source_net_log, optional_parameters);
78 }
79 
80 std::unique_ptr<HostResolver::ServiceEndpointRequest>
CreateServiceEndpointRequest(Host host,NetworkAnonymizationKey network_anonymization_key,NetLogWithSource net_log,ResolveHostParameters parameters)81 MappedHostResolver::CreateServiceEndpointRequest(
82     Host host,
83     NetworkAnonymizationKey network_anonymization_key,
84     NetLogWithSource net_log,
85     ResolveHostParameters parameters) {
86   // All call sites of this function should have a valid scheme.
87   CHECK(host.HasScheme());
88   GURL rewritten_url = host.AsSchemeHostPort().GetURL();
89   HostMappingRules::RewriteResult result = rules_.RewriteUrl(rewritten_url);
90 
91   switch (result) {
92     case HostMappingRules::RewriteResult::kRewritten:
93       DCHECK(rewritten_url.is_valid());
94       DCHECK_NE(rewritten_url.host_piece(), "^NOTFOUND");
95       return impl_->CreateServiceEndpointRequest(
96           Host(url::SchemeHostPort(rewritten_url)),
97           std::move(network_anonymization_key), std::move(net_log),
98           std::move(parameters));
99     case HostMappingRules::RewriteResult::kInvalidRewrite:
100       // Treat any invalid mapping as if it was "^NOTFOUND" (which should itself
101       // result in `kInvalidRewrite`).
102       return CreateFailingServiceEndpointRequest(ERR_NAME_NOT_RESOLVED);
103     case HostMappingRules::RewriteResult::kNoMatchingRule:
104       return impl_->CreateServiceEndpointRequest(
105           std::move(host), std::move(network_anonymization_key),
106           std::move(net_log), std::move(parameters));
107   }
108 }
109 
110 std::unique_ptr<HostResolver::ProbeRequest>
CreateDohProbeRequest()111 MappedHostResolver::CreateDohProbeRequest() {
112   return impl_->CreateDohProbeRequest();
113 }
114 
GetHostCache()115 HostCache* MappedHostResolver::GetHostCache() {
116   return impl_->GetHostCache();
117 }
118 
GetDnsConfigAsValue() const119 base::Value::Dict MappedHostResolver::GetDnsConfigAsValue() const {
120   return impl_->GetDnsConfigAsValue();
121 }
122 
SetRequestContext(URLRequestContext * request_context)123 void MappedHostResolver::SetRequestContext(URLRequestContext* request_context) {
124   impl_->SetRequestContext(request_context);
125 }
126 
GetManagerForTesting()127 HostResolverManager* MappedHostResolver::GetManagerForTesting() {
128   return impl_->GetManagerForTesting();
129 }
130 
131 }  // namespace net
132