blob: 066fc004b58833851d16b7c9461031360cea381b [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2019 The Chromium Authors
Eric Orth59066222019-03-07 23:52:272// 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/context_host_resolver.h"
6
Eric Orth5233c3a2019-04-08 17:01:147#include <string>
Eric Orth59066222019-03-07 23:52:278#include <utility>
Cammie Smith Barnes958c7f32020-12-17 16:43:119#include <vector>
Eric Orth59066222019-03-07 23:52:2710
Hans Wennborg0924470b2020-04-27 21:08:0511#include "base/check_op.h"
Eric Orth59066222019-03-07 23:52:2712#include "base/strings/string_piece.h"
13#include "base/time/tick_clock.h"
Eric Orth3ad7bd02019-09-30 23:38:5914#include "net/base/net_errors.h"
Brianna Goldstein548f56ab2022-10-03 20:29:5215#include "net/base/network_anonymization_key.h"
Eric Orth59066222019-03-07 23:52:2716#include "net/dns/dns_config.h"
Eric Orthbccf549692019-04-16 19:20:1517#include "net/dns/host_cache.h"
Eric Orthc4cca5d2021-07-02 19:59:0118#include "net/dns/host_resolver.h"
Eric Orth960e7062019-03-08 18:43:5419#include "net/dns/host_resolver_manager.h"
Eric Orth59066222019-03-07 23:52:2720#include "net/dns/host_resolver_proc.h"
Yoichiro Hibara6a4e2822022-09-05 04:20:0221#include "net/dns/public/host_resolver_results.h"
Katharine Daly886eef72019-11-22 02:56:0322#include "net/dns/public/resolve_error_info.h"
Eric Orth069a3c6e2020-01-31 23:14:2423#include "net/dns/resolve_context.h"
Eric Orthc4cca5d2021-07-02 19:59:0124#include "net/log/net_log_with_source.h"
Eric Orth5fb3cbb32019-03-29 17:06:3725#include "net/url_request/url_request_context.h"
Eric Orthc4cca5d2021-07-02 19:59:0126#include "third_party/abseil-cpp/absl/types/optional.h"
27#include "url/scheme_host_port.h"
Eric Orth59066222019-03-07 23:52:2728
29namespace net {
30
Eric Orthaf82b49a2020-02-01 01:48:5031ContextHostResolver::ContextHostResolver(
32 HostResolverManager* manager,
33 std::unique_ptr<ResolveContext> resolve_context)
34 : manager_(manager), resolve_context_(std::move(resolve_context)) {
Eric Orth9ded7fe2019-03-22 16:32:3835 DCHECK(manager_);
Eric Orthaf82b49a2020-02-01 01:48:5036 DCHECK(resolve_context_);
Eric Orth37b18192019-04-22 19:09:2837
Eric Orthaf82b49a2020-02-01 01:48:5038 manager_->RegisterResolveContext(resolve_context_.get());
Eric Orth9ded7fe2019-03-22 16:32:3839}
Eric Orth59066222019-03-07 23:52:2740
Eric Orth9ded7fe2019-03-22 16:32:3841ContextHostResolver::ContextHostResolver(
Eric Orthbccf549692019-04-16 19:20:1542 std::unique_ptr<HostResolverManager> owned_manager,
Eric Orthaf82b49a2020-02-01 01:48:5043 std::unique_ptr<ResolveContext> resolve_context)
44 : ContextHostResolver(owned_manager.get(), std::move(resolve_context)) {
45 owned_manager_ = std::move(owned_manager);
Eric Orth9ded7fe2019-03-22 16:32:3846}
47
48ContextHostResolver::~ContextHostResolver() {
Benjamin M. Schwartz4a5617202021-12-07 22:56:3349 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Eric Orth9ded7fe2019-03-22 16:32:3850 if (owned_manager_)
51 DCHECK_EQ(owned_manager_.get(), manager_);
Eric Orth5233c3a2019-04-08 17:01:1452
Eric Orthaf82b49a2020-02-01 01:48:5053 // No |resolve_context_| to deregister if OnShutdown() was already called.
54 if (resolve_context_)
55 manager_->DeregisterResolveContext(resolve_context_.get());
Eric Orth9ded7fe2019-03-22 16:32:3856}
Eric Orth59066222019-03-07 23:52:2757
Eric Orth5d9958c2019-09-27 20:43:1858void ContextHostResolver::OnShutdown() {
Eric Orth3ad7bd02019-09-30 23:38:5959 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
60
Eric Orth069a3c6e2020-01-31 23:14:2461 DCHECK(resolve_context_);
Eric Orthaf82b49a2020-02-01 01:48:5062 manager_->DeregisterResolveContext(resolve_context_.get());
Eric Orth069a3c6e2020-01-31 23:14:2463 resolve_context_.reset();
Eric Orthaf82b49a2020-02-01 01:48:5064
65 DCHECK(!shutting_down_);
Eric Orth3ad7bd02019-09-30 23:38:5966 shutting_down_ = true;
Eric Orth5d9958c2019-09-27 20:43:1867}
68
Eric Orth59066222019-03-07 23:52:2769std::unique_ptr<HostResolver::ResolveHostRequest>
70ContextHostResolver::CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:0171 url::SchemeHostPort host,
Brianna Goldstein548f56ab2022-10-03 20:29:5272 NetworkAnonymizationKey network_anonymization_key,
Eric Orthc4cca5d2021-07-02 19:59:0173 NetLogWithSource source_net_log,
74 absl::optional<ResolveHostParameters> optional_parameters) {
75 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
76
Benjamin M. Schwartz4a5617202021-12-07 22:56:3377 if (shutting_down_)
78 return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN);
Eric Orthc4cca5d2021-07-02 19:59:0179
Benjamin M. Schwartz4a5617202021-12-07 22:56:3380 return manager_->CreateRequest(
Brianna Goldstein548f56ab2022-10-03 20:29:5281 Host(std::move(host)), std::move(network_anonymization_key),
Benjamin M. Schwartz4a5617202021-12-07 22:56:3382 std::move(source_net_log), std::move(optional_parameters),
83 resolve_context_.get(), resolve_context_->host_cache());
Eric Orthc4cca5d2021-07-02 19:59:0184}
85
86std::unique_ptr<HostResolver::ResolveHostRequest>
87ContextHostResolver::CreateRequest(
Eric Orth59066222019-03-07 23:52:2788 const HostPortPair& host,
Brianna Goldstein548f56ab2022-10-03 20:29:5289 const NetworkAnonymizationKey& network_anonymization_key,
Eric Orth59066222019-03-07 23:52:2790 const NetLogWithSource& source_net_log,
Anton Bikineev068d2912021-05-15 20:43:5291 const absl::optional<ResolveHostParameters>& optional_parameters) {
Eric Orth3ad7bd02019-09-30 23:38:5992 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
93
Benjamin M. Schwartz4a5617202021-12-07 22:56:3394 if (shutting_down_)
95 return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN);
Eric Orth3ad7bd02019-09-30 23:38:5996
Brianna Goldstein548f56ab2022-10-03 20:29:5297 return manager_->CreateRequest(
98 host, network_anonymization_key, source_net_log, optional_parameters,
99 resolve_context_.get(), resolve_context_->host_cache());
Eric Orth314e8b42019-11-12 00:32:21100}
101
102std::unique_ptr<HostResolver::ProbeRequest>
103ContextHostResolver::CreateDohProbeRequest() {
104 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
105
Benjamin M. Schwartz4a5617202021-12-07 22:56:33106 if (shutting_down_)
107 return HostResolver::CreateFailingProbeRequest(ERR_CONTEXT_SHUT_DOWN);
Eric Orth314e8b42019-11-12 00:32:21108
Benjamin M. Schwartz4a5617202021-12-07 22:56:33109 return manager_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth59066222019-03-07 23:52:27110}
111
112std::unique_ptr<HostResolver::MdnsListener>
113ContextHostResolver::CreateMdnsListener(const HostPortPair& host,
114 DnsQueryType query_type) {
Eric Orth9ded7fe2019-03-22 16:32:38115 return manager_->CreateMdnsListener(host, query_type);
Eric Orth59066222019-03-07 23:52:27116}
117
Eric Orth59066222019-03-07 23:52:27118HostCache* ContextHostResolver::GetHostCache() {
Eric Orthaf82b49a2020-02-01 01:48:50119 return resolve_context_->host_cache();
Eric Orth59066222019-03-07 23:52:27120}
121
Panos Astithas8aa1ec82020-08-31 18:37:41122base::Value ContextHostResolver::GetDnsConfigAsValue() const {
Eric Orth9ded7fe2019-03-22 16:32:38123 return manager_->GetDnsConfigAsValue();
Eric Orth59066222019-03-07 23:52:27124}
125
Eric Orth59066222019-03-07 23:52:27126void ContextHostResolver::SetRequestContext(
127 URLRequestContext* request_context) {
Eric Orth3ad7bd02019-09-30 23:38:59128 DCHECK(!shutting_down_);
Eric Orthaf82b49a2020-02-01 01:48:50129 DCHECK(resolve_context_);
Eric Orth3ad7bd02019-09-30 23:38:59130 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Eric Orth5fb3cbb32019-03-29 17:06:37131
Eric Orthaf82b49a2020-02-01 01:48:50132 resolve_context_->set_url_request_context(request_context);
Eric Orth59066222019-03-07 23:52:27133}
134
Eric Orth5fb3cbb32019-03-29 17:06:37135HostResolverManager* ContextHostResolver::GetManagerForTesting() {
136 return manager_;
137}
138
139const URLRequestContext* ContextHostResolver::GetContextForTesting() const {
Eric Orth069a3c6e2020-01-31 23:14:24140 return resolve_context_ ? resolve_context_->url_request_context() : nullptr;
Eric Orth5fb3cbb32019-03-29 17:06:37141}
142
Stefano Duo6527ed42022-07-29 09:25:44143handles::NetworkHandle ContextHostResolver::GetTargetNetworkForTesting() const {
Stefano Duobf5a8a92022-04-22 12:14:10144 return resolve_context_ ? resolve_context_->GetTargetNetwork()
Stefano Duo6527ed42022-07-29 09:25:44145 : handles::kInvalidNetworkHandle;
Stefano Duobf5a8a92022-04-22 12:14:10146}
147
Eric Orth59066222019-03-07 23:52:27148size_t ContextHostResolver::LastRestoredCacheSize() const {
Eric Orthaf82b49a2020-02-01 01:48:50149 return resolve_context_->host_cache()
150 ? resolve_context_->host_cache()->last_restore_size()
151 : 0;
Eric Orth59066222019-03-07 23:52:27152}
153
154size_t ContextHostResolver::CacheSize() const {
Eric Orthaf82b49a2020-02-01 01:48:50155 return resolve_context_->host_cache() ? resolve_context_->host_cache()->size()
156 : 0;
Eric Orth59066222019-03-07 23:52:27157}
158
Matthew Denton3eef9d7a2022-09-29 02:00:33159void ContextHostResolver::SetHostResolverSystemParamsForTest(
160 const HostResolverSystemTask::Params& host_resolver_system_params) {
161 manager_->set_host_resolver_system_params_for_test( // IN-TEST
162 host_resolver_system_params);
Eric Orth59066222019-03-07 23:52:27163}
164
Eric Orth59066222019-03-07 23:52:27165void ContextHostResolver::SetTickClockForTesting(
166 const base::TickClock* tick_clock) {
Eric Orth9ded7fe2019-03-22 16:32:38167 manager_->SetTickClockForTesting(tick_clock);
Eric Orthaf82b49a2020-02-01 01:48:50168 if (resolve_context_->host_cache())
169 resolve_context_->host_cache()->set_tick_clock_for_testing(tick_clock);
Eric Orth59066222019-03-07 23:52:27170}
171
172} // namespace net