blob: 4161673ba0f9ec6a079436469e5a6579ff1e88cc [file] [log] [blame]
[email protected]d24fc3a02012-02-11 02:08:341// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]0ac83682010-01-22 17:46: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 "chrome/browser/io_thread.h"
[email protected]e83326f2010-07-31 17:29:256
dchenge73d8520c2015-12-27 01:19:097#include <utility>
[email protected]bcefe0f2010-11-10 16:19:108#include <vector>
9
[email protected]284303b62013-11-28 15:11:5410#include "base/base64.h"
[email protected]21ee224e2011-11-21 02:17:5311#include "base/bind.h"
12#include "base/bind_helpers.h"
[email protected]aa84a7e2012-03-15 21:29:0613#include "base/command_line.h"
[email protected]c93123fa2012-04-19 02:49:4814#include "base/compiler_specific.h"
[email protected]58580352010-10-26 04:07:5015#include "base/debug/leak_tracker.h"
zhongyi81f85c6d92015-10-16 19:34:1416#include "base/environment.h"
davidben2a811e4e2015-12-01 10:49:3417#include "base/files/file_path.h"
[email protected]0ac83682010-01-22 17:46:2718#include "base/logging.h"
avi6846aef2015-12-26 01:09:3819#include "base/macros.h"
dcheng4af48582016-04-19 00:29:3520#include "base/memory/ptr_util.h"
[email protected]903e63382013-06-01 00:40:5821#include "base/metrics/field_trial.h"
davidben45eb19952016-05-05 16:30:4422#include "base/metrics/histogram_macros.h"
Gabriel Charette5ff87ce2017-05-16 18:03:4523#include "base/single_thread_task_runner.h"
[email protected]7286e3fc2011-07-19 22:13:2424#include "base/stl_util.h"
bnce3553d92014-10-30 22:29:4525#include "base/strings/string_piece.h"
[email protected]1988e1c2013-02-28 20:27:4226#include "base/strings/string_split.h"
[email protected]9c7ddc92013-06-11 01:40:5727#include "base/strings/string_util.h"
davidben2a811e4e2015-12-01 10:49:3428#include "base/strings/utf_string_conversions.h"
fdoraydd7eb402017-04-26 21:44:2529#include "base/task_scheduler/post_task.h"
[email protected]3fc40c142011-12-01 13:09:0430#include "base/threading/thread.h"
[email protected]d827e112014-03-31 17:45:0531#include "base/time/time.h"
primiano6221e572015-01-28 12:14:3432#include "base/trace_event/trace_event.h"
[email protected]addb3242011-06-13 21:39:1633#include "build/build_config.h"
[email protected]df2840d2011-02-20 16:32:3234#include "chrome/browser/browser_process.h"
sclittlea133de02015-11-10 23:54:2135#include "chrome/browser/data_usage/tab_id_annotator.h"
kundajif617523b2016-09-09 22:41:2436#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h"
[email protected]026876f32012-08-22 23:53:4037#include "chrome/browser/net/async_dns_field_trial.h"
mmenke14085ad2017-06-15 21:53:5438#include "chrome/browser/net/chrome_mojo_proxy_resolver_factory.h"
[email protected]c38831a12011-10-28 12:44:4939#include "chrome/browser/net/chrome_network_delegate.h"
[email protected]4588b3d2012-11-14 00:37:3840#include "chrome/browser/net/dns_probe_service.h"
[email protected]db0e86dd2011-03-16 14:47:2141#include "chrome/browser/net/proxy_service_factory.h"
eranm3c2d6432016-06-01 10:17:2742#include "chrome/browser/net/sth_distributor_provider.h"
[email protected]aa051272014-03-10 05:56:5643#include "chrome/common/chrome_content_client.h"
[email protected]0ac83682010-01-22 17:46:2744#include "chrome/common/chrome_switches.h"
[email protected]bcefe0f2010-11-10 16:19:1045#include "chrome/common/pref_names.h"
eranm3c2d6432016-06-01 10:17:2746#include "components/certificate_transparency/tree_state_tracker.h"
megjablon3476e042014-10-14 19:21:5947#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
sclittle3f98c6c2015-11-19 22:59:2948#include "components/data_usage/core/data_use_aggregator.h"
sclittlec441f782015-11-12 01:12:0949#include "components/data_usage/core/data_use_amortizer.h"
sclittle3f98c6c2015-11-19 22:59:2950#include "components/data_usage/core/data_use_annotator.h"
kundajic6135962016-09-26 17:54:2851#include "components/data_use_measurement/core/data_use_ascriber.h"
gayane0b46091c2016-04-07 21:01:0552#include "components/metrics/metrics_service.h"
drogerc690e8802015-09-21 14:29:1653#include "components/net_log/chrome_net_log.h"
[email protected]76b4b152013-12-08 21:10:0454#include "components/policy/core/common/policy_service.h"
brettw39d6ba42016-08-24 16:56:3855#include "components/policy/policy_constants.h"
brettwb1fc1b82016-02-02 00:19:0856#include "components/prefs/pref_registry_simple.h"
57#include "components/prefs/pref_service.h"
abhishek.a2171c612852015-08-31 10:48:1958#include "components/proxy_config/pref_proxy_config_tracker.h"
[email protected]488a0e252014-06-25 04:37:4459#include "components/variations/variations_associated_data.h"
sdefresne9fb67692015-08-03 18:48:2260#include "components/version_info/version_info.h"
[email protected]c38831a12011-10-28 12:44:4961#include "content/public/browser/browser_thread.h"
Jochen Eisingerbc991412017-07-14 22:06:2262#include "content/public/browser/ignore_errors_cert_verifier.h"
tbansal15973c32017-05-10 18:40:4463#include "content/public/browser/network_quality_observer_factory.h"
eustasfbec9132015-12-30 14:56:5164#include "content/public/common/content_features.h"
brettw90e92602015-10-10 00:12:4065#include "content/public/common/content_switches.h"
rtenneti4d126a72015-06-23 17:32:0966#include "content/public/common/user_agent.h"
brettw00899e62016-11-12 02:10:1767#include "extensions/features/features.h"
pauljensen7b34e522016-05-12 18:20:5968#include "net/base/logging_network_change_observer.h"
rdsmith60e6e6fb2015-03-05 16:49:2069#include "net/base/sdch_manager.h"
rsleevi6df54182016-06-13 14:34:2370#include "net/cert/caching_cert_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1171#include "net/cert/cert_verifier.h"
[email protected]f46f6d52014-02-08 04:00:3972#include "net/cert/cert_verify_proc.h"
[email protected]284303b62013-11-28 15:11:5473#include "net/cert/ct_known_logs.h"
davidbeneb5f8ef32014-09-04 14:14:3274#include "net/cert/ct_log_verifier.h"
[email protected]284303b62013-11-28 15:11:5475#include "net/cert/ct_verifier.h"
davidbeneb5f8ef32014-09-04 14:14:3276#include "net/cert/multi_log_ct_verifier.h"
[email protected]f46f6d52014-02-08 04:00:3977#include "net/cert/multi_threaded_cert_verifier.h"
eranm3c2d6432016-06-01 10:17:2778#include "net/cert/sth_distributor.h"
79#include "net/cert/sth_observer.h"
[email protected]bc71b8772013-04-10 20:55:1680#include "net/dns/host_cache.h"
[email protected]f2cb3cf2013-03-21 01:40:5381#include "net/dns/host_resolver.h"
82#include "net/dns/mapped_host_resolver.h"
[email protected]eb3cac72010-02-26 21:07:4583#include "net/http/http_auth_filter.h"
[email protected]fa55e192010-02-15 14:25:5084#include "net/http/http_auth_handler_factory.h"
aberentbba302d2015-12-03 10:20:1985#include "net/http/http_auth_preferences.h"
mmenke14085ad2017-06-15 21:53:5486#include "net/http/http_network_session.h"
[email protected]17291a022011-10-10 07:32:5387#include "net/http/http_server_properties_impl.h"
mmenke14085ad2017-06-15 21:53:5488#include "net/http/http_transaction_factory.h"
brettwa1228ebb2016-10-28 03:51:3489#include "net/net_features.h"
tbansalca83c002016-04-28 20:56:2890#include "net/nqe/external_estimate_provider.h"
tbansald3e08ca62017-05-04 19:51:0991#include "net/nqe/network_quality_estimator_params.h"
[email protected]6104ea5d2011-04-27 21:37:1292#include "net/proxy/proxy_config_service.h"
[email protected]86933612010-10-16 23:10:3393#include "net/proxy/proxy_script_fetcher_impl.h"
[email protected]6104ea5d2011-04-27 21:37:1294#include "net/proxy/proxy_service.h"
rch4c967ea2016-12-22 01:41:0795#include "net/quic/chromium/quic_utils_chromium.h"
zhongyi81f85c6d92015-10-16 19:34:1496#include "net/socket/ssl_client_socket.h"
[email protected]717e4e22013-04-10 20:52:2397#include "net/socket/tcp_client_socket.h"
[email protected]3dc1bc42012-06-19 08:20:5398#include "net/url_request/url_fetcher.h"
[email protected]f9c8c7c2014-07-31 16:42:3199#include "net/url_request/url_request_context.h"
wjmacleanea309f72015-08-25 20:56:59100#include "net/url_request/url_request_context_builder.h"
mmenke14085ad2017-06-15 21:53:54101#include "net/url_request/url_request_context_builder_mojo.h"
[email protected]f9c8c7c2014-07-31 16:42:31102#include "net/url_request/url_request_context_getter.h"
brettw03e61962016-03-15 06:27:04103#include "url/url_constants.h"
[email protected]0ac83682010-01-22 17:46:27104
brettw00899e62016-11-12 02:10:17105#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]84b7a552014-07-19 04:52:06106#include "chrome/browser/extensions/event_router_forwarder.h"
107#endif
108
jam1c5a91492016-02-24 20:47:53109#if defined(USE_NSS_CERTS)
eromaned744f32015-04-09 06:35:49110#include "net/cert_net/nss_ocsp.h"
[email protected]a592c0432012-12-01 18:10:29111#endif
[email protected]77feb462011-05-16 23:37:25112
zpengdb4a58e2017-01-10 17:40:32113#if defined(OS_ANDROID)
jeremyimb6c97ae2015-01-05 22:57:14114#include "base/android/build_info.h"
megjablon174bc342015-11-05 00:30:06115#include "chrome/browser/android/data_usage/external_data_use_observer.h"
tbansaldafbb3e2015-08-19 19:55:33116#include "chrome/browser/android/net/external_estimate_provider_android.h"
sclittlec441f782015-11-12 01:12:09117#include "components/data_usage/android/traffic_stats_amortizer.h"
estark9a263782017-01-20 02:13:04118#include "net/cert/cert_net_fetcher.h"
119#include "net/cert/cert_verify_proc_android.h"
120#include "net/cert_net/cert_net_fetcher_impl.h"
zpengdb4a58e2017-01-10 17:40:32121#endif // defined(OS_ANDROID)
jeremyimb6c97ae2015-01-05 22:57:14122
[email protected]f46f6d52014-02-08 04:00:39123#if defined(OS_CHROMEOS)
124#include "chrome/browser/chromeos/net/cert_verify_proc_chromeos.h"
zentaroe0326352017-05-09 13:11:51125#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
mmenke14085ad2017-06-15 21:53:54126#include "chromeos/network/dhcp_proxy_script_fetcher_factory_chromeos.h"
[email protected]106ccd2c2014-06-17 09:21:00127#include "chromeos/network/host_resolver_impl_chromeos.h"
[email protected]f46f6d52014-02-08 04:00:39128#endif
129
davidben45eb19952016-05-05 16:30:44130#if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL)
davidben45eb19952016-05-05 16:30:44131#include "crypto/openssl_util.h"
tfarina29a3a1742016-10-28 18:47:33132#include "third_party/boringssl/src/include/openssl/cpu.h"
davidben45eb19952016-05-05 16:30:44133#endif
134
[email protected]631bb742011-11-02 11:29:39135using content::BrowserThread;
136
[email protected]075c0322012-02-14 00:56:44137class SafeBrowsingURLRequestContext;
138
[email protected]21ee224e2011-11-21 02:17:53139// The IOThread object must outlive any tasks posted to the IO thread before the
140// Quit task, so base::Bind() calls are not refcounted.
141
[email protected]0ac83682010-01-22 17:46:27142namespace {
143
tbansalb177b5392015-06-25 11:13:02144// Field trial for network quality estimator. Seeds RTT and downstream
145// throughput observations with values that correspond to the connection type
146// determined by the operating system.
147const char kNetworkQualityEstimatorFieldTrialName[] = "NetworkQualityEstimator";
148
jam1c5a91492016-02-24 20:47:53149#if defined(OS_MACOSX)
[email protected]11f5e3a2012-09-27 00:30:13150void ObserveKeychainEvents() {
thestig00844cea2015-09-08 21:44:52151 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]11f5e3a2012-09-27 00:30:13152 net::CertDatabase::GetInstance()->SetMessageLoopForKeychainEvents();
153}
154#endif
155
zhongyi81f85c6d92015-10-16 19:34:14156// Gets file path into ssl_keylog_file from command line argument or
157// environment variable. Command line argument has priority when
158// both specified.
davidben2a811e4e2015-12-01 10:49:34159base::FilePath GetSSLKeyLogFile(const base::CommandLine& command_line) {
zhongyi81f85c6d92015-10-16 19:34:14160 if (command_line.HasSwitch(switches::kSSLKeyLogFile)) {
davidben2a811e4e2015-12-01 10:49:34161 base::FilePath path =
162 command_line.GetSwitchValuePath(switches::kSSLKeyLogFile);
163 if (!path.empty())
164 return path;
zhongyi81f85c6d92015-10-16 19:34:14165 LOG(WARNING) << "ssl-key-log-file argument missing";
166 }
davidben2a811e4e2015-12-01 10:49:34167
dcheng4af48582016-04-19 00:29:35168 std::unique_ptr<base::Environment> env(base::Environment::Create());
davidben2a811e4e2015-12-01 10:49:34169 std::string path_str;
170 env->GetVar("SSLKEYLOGFILE", &path_str);
171#if defined(OS_WIN)
172 // base::Environment returns environment variables in UTF-8 on Windows.
173 return base::FilePath(base::UTF8ToUTF16(path_str));
174#else
175 return base::FilePath(path_str);
176#endif
zhongyi81f85c6d92015-10-16 19:34:14177}
178
dcheng4af48582016-04-19 00:29:35179std::unique_ptr<net::HostResolver> CreateGlobalHostResolver(
180 net::NetLog* net_log) {
[email protected]d22f06e2013-06-11 16:01:17181 TRACE_EVENT0("startup", "IOThread::CreateGlobalHostResolver");
avi556c05022014-12-22 23:31:43182 const base::CommandLine& command_line =
183 *base::CommandLine::ForCurrentProcess();
[email protected]962b98212010-07-17 03:37:51184
[email protected]c54a8912012-10-22 22:09:43185 net::HostResolver::Options options;
dcheng4af48582016-04-19 00:29:35186 std::unique_ptr<net::HostResolver> global_host_resolver;
[email protected]106ccd2c2014-06-17 09:21:00187#if defined OS_CHROMEOS
188 global_host_resolver =
189 chromeos::HostResolverImplChromeOS::CreateSystemResolver(options,
190 net_log);
191#else
192 global_host_resolver =
193 net::HostResolver::CreateSystemResolver(options, net_log);
194#endif
[email protected]9087aa32010-02-18 08:03:38195
[email protected]3dc5d7ef2014-03-28 19:18:21196 // If hostname remappings were specified on the command-line, layer these
197 // rules on top of the real host resolver. This allows forwarding all requests
198 // through a designated test server.
199 if (!command_line.HasSwitch(switches::kHostResolverRules))
dchenge73d8520c2015-12-27 01:19:09200 return global_host_resolver;
[email protected]0ac83682010-01-22 17:46:27201
dcheng4af48582016-04-19 00:29:35202 std::unique_ptr<net::MappedHostResolver> remapped_resolver(
dchenge73d8520c2015-12-27 01:19:09203 new net::MappedHostResolver(std::move(global_host_resolver)));
[email protected]3dc5d7ef2014-03-28 19:18:21204 remapped_resolver->SetRulesFromString(
205 command_line.GetSwitchValueASCII(switches::kHostResolverRules));
dchenge73d8520c2015-12-27 01:19:09206 return std::move(remapped_resolver);
[email protected]0ac83682010-01-22 17:46:27207}
208
robliao7253fd22016-12-01 18:41:38209// This function is for forwarding metrics usage pref changes to the metrics
210// service on the appropriate thread.
211// TODO(gayane): Reduce the frequency of posting tasks from IO to UI thread.
212void UpdateMetricsUsagePrefsOnUIThread(const std::string& service_name,
213 int message_size,
214 bool is_cellular) {
tzik3f7781d2017-04-20 17:09:33215 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
216 base::BindOnce(
217 [](const std::string& service_name,
218 int message_size, bool is_cellular) {
219 // Some unit tests use IOThread but do not
220 // initialize MetricsService. In that case it's
221 // fine to skip the update.
222 auto* metrics_service =
223 g_browser_process->metrics_service();
224 if (metrics_service) {
225 metrics_service->UpdateMetricsUsagePrefs(
226 service_name, message_size, is_cellular);
227 }
228 },
229 service_name, message_size, is_cellular));
robliao7253fd22016-12-01 18:41:38230}
231
[email protected]0ac83682010-01-22 17:46:27232} // namespace
233
[email protected]abe2c032011-03-31 18:49:34234class SystemURLRequestContextGetter : public net::URLRequestContextGetter {
[email protected]db0e86dd2011-03-16 14:47:21235 public:
236 explicit SystemURLRequestContextGetter(IOThread* io_thread);
[email protected]db0e86dd2011-03-16 14:47:21237
[email protected]abe2c032011-03-31 18:49:34238 // Implementation for net::UrlRequestContextGetter.
Daniel Chenga542fca2014-10-21 09:51:29239 net::URLRequestContext* GetURLRequestContext() override;
240 scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
241 const override;
[email protected]db0e86dd2011-03-16 14:47:21242
[email protected]13ed17f82012-04-06 02:27:18243 protected:
Daniel Chenga542fca2014-10-21 09:51:29244 ~SystemURLRequestContextGetter() override;
[email protected]13ed17f82012-04-06 02:27:18245
[email protected]db0e86dd2011-03-16 14:47:21246 private:
247 IOThread* const io_thread_; // Weak pointer, owned by BrowserProcess.
[email protected]4969b0122012-06-16 01:58:28248 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
[email protected]db0e86dd2011-03-16 14:47:21249
250 base::debug::LeakTracker<SystemURLRequestContextGetter> leak_tracker_;
251};
252
253SystemURLRequestContextGetter::SystemURLRequestContextGetter(
254 IOThread* io_thread)
255 : io_thread_(io_thread),
[email protected]4969b0122012-06-16 01:58:28256 network_task_runner_(
thestig529ad8a2016-07-08 20:30:12257 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)) {}
[email protected]db0e86dd2011-03-16 14:47:21258
259SystemURLRequestContextGetter::~SystemURLRequestContextGetter() {}
260
261net::URLRequestContext* SystemURLRequestContextGetter::GetURLRequestContext() {
thestig00844cea2015-09-08 21:44:52262 DCHECK_CURRENTLY_ON(BrowserThread::IO);
mmenkef73a5122017-07-13 23:27:39263 DCHECK(io_thread_->globals()->system_request_context);
[email protected]db0e86dd2011-03-16 14:47:21264
mmenkef73a5122017-07-13 23:27:39265 return io_thread_->globals()->system_request_context;
[email protected]db0e86dd2011-03-16 14:47:21266}
267
[email protected]4969b0122012-06-16 01:58:28268scoped_refptr<base::SingleThreadTaskRunner>
269SystemURLRequestContextGetter::GetNetworkTaskRunner() const {
270 return network_task_runner_;
[email protected]db0e86dd2011-03-16 14:47:21271}
272
[email protected]c93123fa2012-04-19 02:49:48273IOThread::Globals::
274SystemRequestContextLeakChecker::SystemRequestContextLeakChecker(
275 Globals* globals)
276 : globals_(globals) {
277 DCHECK(globals_);
[email protected]7613faae2012-04-18 01:01:19278}
[email protected]1889dc1b2010-10-14 22:03:13279
[email protected]c93123fa2012-04-19 02:49:48280IOThread::Globals::
281SystemRequestContextLeakChecker::~SystemRequestContextLeakChecker() {
Matt Menked0b07a982017-08-23 02:09:29282 globals_->system_request_context->AssertNoURLRequests();
[email protected]c93123fa2012-04-19 02:49:48283}
284
mmenkef73a5122017-07-13 23:27:39285IOThread::Globals::Globals()
286 : system_request_context(nullptr),
287 system_request_context_leak_checker(this),
288 enable_brotli(false) {}
[email protected]c2dad292012-09-07 21:27:35289
[email protected]c93123fa2012-04-19 02:49:48290IOThread::Globals::~Globals() {}
291
[email protected]bcefe0f2010-11-10 16:19:10292// |local_state| is passed in explicitly in order to (1) reduce implicit
293// dependencies and (2) make IOThread more flexible for testing.
[email protected]3ce02412011-03-01 12:01:15294IOThread::IOThread(
[email protected]b1de2c72013-02-06 02:45:47295 PrefService* local_state,
[email protected]77305422012-11-29 16:51:39296 policy::PolicyService* policy_service,
drogerc690e8802015-09-21 14:29:16297 net_log::ChromeNetLog* net_log,
Matt Menke21b9cc62017-08-23 15:45:45298 extensions::EventRouterForwarder* extension_event_router_forwarder,
299 SystemNetworkContextManager* system_network_context_manager)
[email protected]2e5b60a22011-11-28 15:56:41300 : net_log_(net_log),
brettw00899e62016-11-12 02:10:17301#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]3ce02412011-03-01 12:01:15302 extension_event_router_forwarder_(extension_event_router_forwarder),
[email protected]84b7a552014-07-19 04:52:06303#endif
mmenkea7da6da2016-09-01 21:56:52304 globals_(nullptr),
Matt Menkecfef87d2017-08-03 13:03:06305 is_quic_allowed_on_init_(true),
mohan.reddy14cb4ad42014-09-17 18:15:14306 weak_factory_(this) {
aberentbba302d2015-12-03 10:20:19307 scoped_refptr<base::SingleThreadTaskRunner> io_thread_proxy =
thestig529ad8a2016-07-08 20:30:12308 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
[email protected]bcefe0f2010-11-10 16:19:10309 auth_schemes_ = local_state->GetString(prefs::kAuthSchemes);
aberentbba302d2015-12-03 10:20:19310 negotiate_disable_cname_lookup_.Init(
311 prefs::kDisableAuthNegotiateCnameLookup, local_state,
312 base::Bind(&IOThread::UpdateNegotiateDisableCnameLookup,
313 base::Unretained(this)));
314 negotiate_disable_cname_lookup_.MoveToThread(io_thread_proxy);
315 negotiate_enable_port_.Init(
316 prefs::kEnableAuthNegotiatePort, local_state,
317 base::Bind(&IOThread::UpdateNegotiateEnablePort, base::Unretained(this)));
318 negotiate_enable_port_.MoveToThread(io_thread_proxy);
319 auth_server_whitelist_.Init(
320 prefs::kAuthServerWhitelist, local_state,
321 base::Bind(&IOThread::UpdateServerWhitelist, base::Unretained(this)));
322 auth_server_whitelist_.MoveToThread(io_thread_proxy);
323 auth_delegate_whitelist_.Init(
324 prefs::kAuthNegotiateDelegateWhitelist, local_state,
325 base::Bind(&IOThread::UpdateDelegateWhitelist, base::Unretained(this)));
326 auth_delegate_whitelist_.MoveToThread(io_thread_proxy);
327#if defined(OS_ANDROID)
328 auth_android_negotiate_account_type_.Init(
329 prefs::kAuthAndroidNegotiateAccountType, local_state,
330 base::Bind(&IOThread::UpdateAndroidAuthNegotiateAccountType,
331 base::Unretained(this)));
332 auth_android_negotiate_account_type_.MoveToThread(io_thread_proxy);
333#endif
334#if defined(OS_POSIX) && !defined(OS_ANDROID)
[email protected]ac7f3fdb2010-11-12 12:47:05335 gssapi_library_name_ = local_state->GetString(prefs::kGSSAPILibraryName);
aberentbba302d2015-12-03 10:20:19336#endif
zentaroe0326352017-05-09 13:11:51337#if defined(OS_CHROMEOS)
338 policy::BrowserPolicyConnectorChromeOS* connector =
339 g_browser_process->platform_part()->browser_policy_connector_chromeos();
340 allow_gssapi_library_load_ = connector->IsActiveDirectoryManaged();
341#endif
[email protected]6f96cbcb2011-11-04 02:26:07342 pref_proxy_config_tracker_.reset(
[email protected]e2930d0902013-07-17 05:25:42343 ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
344 local_state));
mmenke02505da2017-05-15 16:37:34345 system_proxy_config_service_ = ProxyServiceFactory::CreateProxyConfigService(
346 pref_proxy_config_tracker_.get());
[email protected]9d8cfb682012-09-13 16:48:04347 ChromeNetworkDelegate::InitializePrefsOnUIThread(
348 &system_enable_referrers_,
igorcov193d8ad32016-05-27 11:03:21349 nullptr,
350 nullptr,
351 nullptr,
352 nullptr,
[email protected]9d8cfb682012-09-13 16:48:04353 local_state);
[email protected]4d45a6de2011-05-13 05:20:18354 ssl_config_service_manager_.reset(
abhishek.a212849cee2015-10-20 11:27:29355 ssl_config::SSLConfigServiceManager::CreateDefaultManager(
356 local_state,
thestig529ad8a2016-07-08 20:30:12357 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)));
[email protected]2e5b60a22011-11-28 15:56:41358
jdoerrie239723572017-03-02 12:09:19359 base::Value* dns_client_enabled_default =
360 new base::Value(chrome_browser_net::ConfigureAsyncDnsFieldTrial());
[email protected]68a9b0d82013-03-08 07:05:07361 local_state->SetDefaultPrefValue(prefs::kBuiltInDnsClientEnabled,
362 dns_client_enabled_default);
ttuttle530184962015-01-13 00:24:07363 chrome_browser_net::LogAsyncDnsPrefSource(
364 local_state->FindPreference(prefs::kBuiltInDnsClientEnabled));
[email protected]68a9b0d82013-03-08 07:05:07365
[email protected]fa4b6c32012-11-26 23:02:39366 dns_client_enabled_.Init(prefs::kBuiltInDnsClientEnabled,
367 local_state,
368 base::Bind(&IOThread::UpdateDnsClientEnabled,
369 base::Unretained(this)));
aberentbba302d2015-12-03 10:20:19370 dns_client_enabled_.MoveToThread(io_thread_proxy);
[email protected]fa4b6c32012-11-26 23:02:39371
[email protected]67378142013-12-17 21:57:17372 quick_check_enabled_.Init(prefs::kQuickCheckEnabled,
373 local_state);
aberentbba302d2015-12-03 10:20:19374 quick_check_enabled_.MoveToThread(io_thread_proxy);
[email protected]67378142013-12-17 21:57:17375
eroman9f7ea642016-06-03 21:28:29376 pac_https_url_stripping_enabled_.Init(prefs::kPacHttpsUrlStrippingEnabled,
377 local_state);
378 pac_https_url_stripping_enabled_.MoveToThread(io_thread_proxy);
379
eranm3c2d6432016-06-01 10:17:27380 chrome_browser_net::SetGlobalSTHDistributor(
381 std::unique_ptr<net::ct::STHDistributor>(new net::ct::STHDistributor()));
382
gab90becc92016-12-08 17:19:34383 BrowserThread::SetIOThreadDelegate(this);
mmenkef73a5122017-07-13 23:27:39384
Matt Menke21b9cc62017-08-23 15:45:45385 system_network_context_manager->SetUp(&network_context_request_,
386 &network_context_params_,
387 &is_quic_allowed_on_init_);
[email protected]bcefe0f2010-11-10 16:19:10388}
[email protected]0ac83682010-01-22 17:46:27389
390IOThread::~IOThread() {
[email protected]2e5b60a22011-11-28 15:56:41391 // This isn't needed for production code, but in tests, IOThread may
392 // be multiply constructed.
gab90becc92016-12-08 17:19:34393 BrowserThread::SetIOThreadDelegate(nullptr);
[email protected]2e5b60a22011-11-28 15:56:41394
[email protected]d461ed22013-01-18 03:18:56395 pref_proxy_config_tracker_->DetachFromPrefService();
[email protected]d13c3272010-02-04 00:24:51396 DCHECK(!globals_);
eranm3c2d6432016-06-01 10:17:27397
398 // Destroy the old distributor to check that the observers list it holds is
399 // empty.
400 chrome_browser_net::SetGlobalSTHDistributor(nullptr);
[email protected]0ac83682010-01-22 17:46:27401}
402
[email protected]d13c3272010-02-04 00:24:51403IOThread::Globals* IOThread::globals() {
thestig00844cea2015-09-08 21:44:52404 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]d13c3272010-02-04 00:24:51405 return globals_;
[email protected]0ac83682010-01-22 17:46:27406}
407
[email protected]37ac95b2013-07-23 23:39:35408void IOThread::SetGlobalsForTesting(Globals* globals) {
thestig00844cea2015-09-08 21:44:52409 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]37ac95b2013-07-23 23:39:35410 DCHECK(!globals || !globals_);
411 globals_ = globals;
412}
413
drogerc690e8802015-09-21 14:29:16414net_log::ChromeNetLog* IOThread::net_log() {
[email protected]b2fcd0e2010-12-01 15:19:40415 return net_log_;
416}
417
[email protected]b09f76d62011-12-07 01:51:06418void IOThread::ChangedToOnTheRecord() {
thestig00844cea2015-09-08 21:44:52419 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]b09f76d62011-12-07 01:51:06420 BrowserThread::PostTask(
tzik3f7781d2017-04-20 17:09:33421 BrowserThread::IO, FROM_HERE,
422 base::BindOnce(&IOThread::ChangedToOnTheRecordOnIOThread,
423 base::Unretained(this)));
[email protected]b09f76d62011-12-07 01:51:06424}
425
[email protected]abe2c032011-03-31 18:49:34426net::URLRequestContextGetter* IOThread::system_url_request_context_getter() {
thestig00844cea2015-09-08 21:44:52427 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]5173de8b2013-06-02 21:16:02428 if (!system_url_request_context_getter_.get()) {
mmenke02505da2017-05-15 16:37:34429 system_url_request_context_getter_ =
430 new SystemURLRequestContextGetter(this);
[email protected]db0e86dd2011-03-16 14:47:21431 }
[email protected]5173de8b2013-06-02 21:16:02432 return system_url_request_context_getter_.get();
[email protected]db0e86dd2011-03-16 14:47:21433}
434
[email protected]0ac83682010-01-22 17:46:27435void IOThread::Init() {
[email protected]a5e73b82013-07-17 08:58:39436 TRACE_EVENT0("startup", "IOThread::InitAsync");
thestig00844cea2015-09-08 21:44:52437 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]70b92342010-10-12 05:54:06438
jam1c5a91492016-02-24 20:47:53439#if defined(USE_NSS_CERTS)
[email protected]8c434cbc2012-03-14 14:25:09440 net::SetMessageLoopForNSSHttpIO();
[email protected]a592c0432012-12-01 18:10:29441#endif
[email protected]70b92342010-10-12 05:54:06442
avi556c05022014-12-22 23:31:43443 const base::CommandLine& command_line =
444 *base::CommandLine::ForCurrentProcess();
[email protected]c2dad292012-09-07 21:27:35445
zhongyi81f85c6d92015-10-16 19:34:14446 // Export ssl keys if log file specified.
davidben2a811e4e2015-12-01 10:49:34447 base::FilePath ssl_keylog_file = GetSSLKeyLogFile(command_line);
David Benjamindc2f4b02017-07-27 23:59:02448 if (!ssl_keylog_file.empty())
449 net::SSLClientSocket::SetSSLKeyLogFile(ssl_keylog_file);
zhongyi81f85c6d92015-10-16 19:34:14450
[email protected]d13c3272010-02-04 00:24:51451 DCHECK(!globals_);
452 globals_ = new Globals;
453
[email protected]58bc7042010-07-07 18:04:14454 // Add an observer that will emit network change events to the ChromeNetLog.
455 // Assuming NetworkChangeNotifier dispatches in FIFO order, we should be
456 // logging the network change before other IO thread consumers respond to it.
457 network_change_observer_.reset(
pauljensen7b34e522016-05-12 18:20:59458 new net::LoggingNetworkChangeObserver(net_log_));
[email protected]58bc7042010-07-07 18:04:14459
[email protected]cde8b3c2012-08-13 19:20:52460 // Setup the HistogramWatcher to run on the IO thread.
461 net::NetworkChangeNotifier::InitHistogramWatcher();
462
brettw00899e62016-11-12 02:10:17463#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]3ce02412011-03-01 12:01:15464 globals_->extension_event_router_forwarder =
465 extension_event_router_forwarder_;
[email protected]84b7a552014-07-19 04:52:06466#endif
467
dcheng4af48582016-04-19 00:29:35468 std::unique_ptr<data_usage::DataUseAmortizer> data_use_amortizer;
zpengdb4a58e2017-01-10 17:40:32469#if defined(OS_ANDROID)
sclittlec441f782015-11-12 01:12:09470 data_use_amortizer.reset(new data_usage::android::TrafficStatsAmortizer());
zpengdb4a58e2017-01-10 17:40:32471#endif // defined(OS_ANDROID)
sclittlec441f782015-11-12 01:12:09472
kundajif617523b2016-09-09 22:41:24473 globals_->data_use_ascriber =
474 base::MakeUnique<data_use_measurement::ChromeDataUseAscriber>();
475
sclittle3f98c6c2015-11-19 22:59:29476 globals_->data_use_aggregator.reset(new data_usage::DataUseAggregator(
dcheng4af48582016-04-19 00:29:35477 std::unique_ptr<data_usage::DataUseAnnotator>(
sclittlec441f782015-11-12 01:12:09478 new chrome_browser_data_usage::TabIdAnnotator()),
dchenge73d8520c2015-12-27 01:19:09479 std::move(data_use_amortizer)));
sclittleae932be2015-10-08 20:53:50480
zpengdb4a58e2017-01-10 17:40:32481#if defined(OS_ANDROID)
sclittle3f98c6c2015-11-19 22:59:29482 globals_->external_data_use_observer.reset(
tbansal7c98c0a2015-11-03 21:39:51483 new chrome::android::ExternalDataUseObserver(
sclittle3f98c6c2015-11-19 22:59:29484 globals_->data_use_aggregator.get(),
thestig529ad8a2016-07-08 20:30:12485 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
486 BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)));
zpengdb4a58e2017-01-10 17:40:32487#endif // defined(OS_ANDROID)
[email protected]84b7a552014-07-19 04:52:06488
tbansalb177b5392015-06-25 11:13:02489 std::map<std::string, std::string> network_quality_estimator_params;
490 variations::GetVariationParams(kNetworkQualityEstimatorFieldTrialName,
491 &network_quality_estimator_params);
tbansal1c92d5b2015-08-14 20:14:43492
tbansald3e08ca62017-05-04 19:51:09493 if (command_line.HasSwitch(switches::kForceEffectiveConnectionType)) {
494 const std::string force_ect_value =
495 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
496 switches::kForceEffectiveConnectionType);
497
498 if (!force_ect_value.empty()) {
499 // If the effective connection type is forced using command line switch,
500 // it overrides the one set by field trial.
501 network_quality_estimator_params[net::kForceEffectiveConnectionType] =
502 force_ect_value;
503 }
504 }
505
dcheng4af48582016-04-19 00:29:35506 std::unique_ptr<net::ExternalEstimateProvider> external_estimate_provider;
zpengdb4a58e2017-01-10 17:40:32507#if defined(OS_ANDROID)
tbansal1c92d5b2015-08-14 20:14:43508 external_estimate_provider.reset(
tbansaldafbb3e2015-08-19 19:55:33509 new chrome::android::ExternalEstimateProviderAndroid());
zpengdb4a58e2017-01-10 17:40:32510#endif // defined(OS_ANDROID)
tbansal1c92d5b2015-08-14 20:14:43511 // Pass ownership.
512 globals_->network_quality_estimator.reset(new net::NetworkQualityEstimator(
tbansal4a4305a2017-06-08 05:03:19513 std::move(external_estimate_provider),
514 base::MakeUnique<net::NetworkQualityEstimatorParams>(
515 network_quality_estimator_params),
tbansal97e38a22017-01-20 20:43:02516 net_log_));
tbansal15973c32017-05-10 18:40:44517 globals_->network_quality_observer = content::CreateNetworkQualityObserver(
518 globals_->network_quality_estimator.get());
tbansalea2fb8c2015-05-22 22:23:00519
eranm1a79db22015-11-24 10:56:49520 std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs(
eranm03d454c2015-07-02 09:12:03521 net::ct::CreateLogVerifiersForKnownLogs());
[email protected]284303b62013-11-28 15:11:54522
eranm1a79db22015-11-24 10:56:49523 globals_->ct_logs.assign(ct_logs.begin(), ct_logs.end());
524
eranmbbf5af702017-02-02 16:06:18525 ct_tree_tracker_.reset(new certificate_transparency::TreeStateTracker(
526 globals_->ct_logs, net_log_));
eranm3c2d6432016-06-01 10:17:27527 // Register the ct_tree_tracker_ as observer for new STHs.
528 RegisterSTHObserver(ct_tree_tracker_.get());
eranm3c2d6432016-06-01 10:17:27529
[email protected]4588b3d2012-11-14 00:37:38530 globals_->dns_probe_service.reset(new chrome_browser_net::DnsProbeService());
maksim.sisov3d40c812016-05-02 13:27:16531 globals_->enable_brotli =
bnc18fb77f2016-04-04 20:54:04532 base::FeatureList::IsEnabled(features::kBrotliEncoding);
bnce87c7c712016-08-01 23:59:48533
534 // Check for OS support of TCP FastOpen, and turn it on for all connections if
535 // indicated by user.
bnc18fb77f2016-04-04 20:54:04536 // TODO(rch): Make the client socket factory a per-network session instance,
537 // constructed from a NetworkSession::Params, to allow us to move this option
538 // to IOThread::Globals & HttpNetworkSession::Params.
bnc18fb77f2016-04-04 20:54:04539 bool always_enable_tfo_if_supported =
540 command_line.HasSwitch(switches::kEnableTcpFastOpen);
bnc18fb77f2016-04-04 20:54:04541 net::CheckSupportAndMaybeEnableTCPFastOpen(always_enable_tfo_if_supported);
[email protected]f9cf5572012-12-04 15:52:09542
Matt Menkebdf84c72017-08-03 13:56:24543 if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests))
544 net::URLFetcher::SetIgnoreCertificateRequests(true);
bnce87c7c712016-08-01 23:59:48545
jam1c5a91492016-02-24 20:47:53546#if defined(OS_MACOSX)
[email protected]11f5e3a2012-09-27 00:30:13547 // Start observing Keychain events. This needs to be done on the UI thread,
548 // as Keychain services requires a CFRunLoop.
549 BrowserThread::PostTask(BrowserThread::UI,
550 FROM_HERE,
551 base::Bind(&ObserveKeychainEvents));
552#endif
553
davidben45eb19952016-05-05 16:30:44554#if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL)
555 // Record how common CPUs with broken NEON units are. See
556 // https://crbug.com/341598.
557 crypto::EnsureOpenSSLInit();
558 UMA_HISTOGRAM_BOOLEAN("Net.HasBrokenNEON", CRYPTO_has_broken_NEON());
559#endif
mmenke02505da2017-05-15 16:37:34560
mmenkef2e53b22017-05-15 18:40:18561 ConstructSystemRequestContext();
mmenkec2af5952017-06-07 23:26:47562
563 UpdateDnsClientEnabled();
[email protected]0ac83682010-01-22 17:46:27564}
565
[email protected]2a92cd92010-04-27 00:01:41566void IOThread::CleanUp() {
[email protected]075c0322012-02-14 00:56:44567 base::debug::LeakTracker<SafeBrowsingURLRequestContext>::CheckForLeaks();
568
jam1c5a91492016-02-24 20:47:53569#if defined(USE_NSS_CERTS)
[email protected]8c434cbc2012-03-14 14:25:09570 net::ShutdownNSSHttpIO();
[email protected]a592c0432012-12-01 18:10:29571#endif
[email protected]59a3b362010-10-21 21:52:41572
[email protected]db0e86dd2011-03-16 14:47:21573 system_url_request_context_getter_ = NULL;
574
eranm3c2d6432016-06-01 10:17:27575 // Unlink the ct_tree_tracker_ from the global cert_transparency_verifier
576 // and unregister it from new STH notifications so it will take no actions
577 // on anything observed during CleanUp process.
Matt Menked0b07a982017-08-23 02:09:29578 globals()->system_request_context->cert_transparency_verifier()->SetObserver(
579 nullptr);
580 UnregisterSTHObserver(ct_tree_tracker_.get());
581 ct_tree_tracker_.reset();
eranm3c2d6432016-06-01 10:17:27582
Matt Menked0b07a982017-08-23 02:09:29583 globals_->system_request_context->proxy_service()->OnShutdown();
mmenkeab0c11d2017-05-30 17:15:17584
mmenke4dcfb512017-06-26 22:00:21585#if defined(USE_NSS_CERTS)
Matt Menked0b07a982017-08-23 02:09:29586 net::SetURLRequestContextForNSSHttpIO(nullptr);
mmenke4dcfb512017-06-26 22:00:21587#endif
588
589#if defined(OS_ANDROID)
Matt Menked0b07a982017-08-23 02:09:29590 net::CertVerifyProcAndroid::ShutdownCertNetFetcher();
mmenke4dcfb512017-06-26 22:00:21591#endif
mmenke4dcfb512017-06-26 22:00:21592
[email protected]af669932012-01-17 19:26:58593 // Release objects that the net::URLRequestContext could have been pointing
594 // to.
[email protected]0ee7a3b2010-11-09 06:13:40595
[email protected]7592b41f2014-04-01 01:44:43596 // Shutdown the HistogramWatcher on the IO thread.
597 net::NetworkChangeNotifier::ShutdownHistogramWatcher();
598
[email protected]0ee7a3b2010-11-09 06:13:40599 // This must be reset before the ChromeNetLog is destroyed.
600 network_change_observer_.reset();
601
[email protected]db0e86dd2011-03-16 14:47:21602 system_proxy_config_service_.reset();
[email protected]d13c3272010-02-04 00:24:51603 delete globals_;
604 globals_ = NULL;
[email protected]0ac83682010-01-22 17:46:27605
[email protected]db0e86dd2011-03-16 14:47:21606 base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks();
eroman81b0a992017-07-08 01:29:34607
608 if (net_log_)
609 net_log_->ShutDownBeforeTaskScheduler();
[email protected]0ac83682010-01-22 17:46:27610}
611
bnc18fb77f2016-04-04 20:54:04612// static
[email protected]b1de2c72013-02-06 02:45:47613void IOThread::RegisterPrefs(PrefRegistrySimple* registry) {
614 registry->RegisterStringPref(prefs::kAuthSchemes,
bengr70266e22015-06-12 19:38:17615 "basic,digest,ntlm,negotiate");
[email protected]68a9b0d82013-03-08 07:05:07616 registry->RegisterBooleanPref(prefs::kDisableAuthNegotiateCnameLookup, false);
[email protected]b1de2c72013-02-06 02:45:47617 registry->RegisterBooleanPref(prefs::kEnableAuthNegotiatePort, false);
[email protected]007b3f82013-04-09 08:46:45618 registry->RegisterStringPref(prefs::kAuthServerWhitelist, std::string());
619 registry->RegisterStringPref(prefs::kAuthNegotiateDelegateWhitelist,
620 std::string());
621 registry->RegisterStringPref(prefs::kGSSAPILibraryName, std::string());
aberentec894a52015-07-09 14:45:53622 registry->RegisterStringPref(prefs::kAuthAndroidNegotiateAccountType,
623 std::string());
[email protected]b1de2c72013-02-06 02:45:47624 registry->RegisterBooleanPref(prefs::kEnableReferrers, true);
[email protected]1575e3d2014-05-03 22:21:44625 data_reduction_proxy::RegisterPrefs(registry);
[email protected]68a9b0d82013-03-08 07:05:07626 registry->RegisterBooleanPref(prefs::kBuiltInDnsClientEnabled, true);
[email protected]67378142013-12-17 21:57:17627 registry->RegisterBooleanPref(prefs::kQuickCheckEnabled, true);
eroman9f7ea642016-06-03 21:28:29628 registry->RegisterBooleanPref(prefs::kPacHttpsUrlStrippingEnabled, true);
[email protected]bcefe0f2010-11-10 16:19:10629}
630
aberentbba302d2015-12-03 10:20:19631void IOThread::UpdateServerWhitelist() {
632 globals_->http_auth_preferences->set_server_whitelist(
633 auth_server_whitelist_.GetValue());
634}
[email protected]b7304162010-08-23 17:42:29635
aberentbba302d2015-12-03 10:20:19636void IOThread::UpdateDelegateWhitelist() {
637 globals_->http_auth_preferences->set_delegate_whitelist(
638 auth_delegate_whitelist_.GetValue());
639}
640
641#if defined(OS_ANDROID)
642void IOThread::UpdateAndroidAuthNegotiateAccountType() {
643 globals_->http_auth_preferences->set_auth_android_negotiate_account_type(
644 auth_android_negotiate_account_type_.GetValue());
645}
646#endif
647
648void IOThread::UpdateNegotiateDisableCnameLookup() {
649 globals_->http_auth_preferences->set_negotiate_disable_cname_lookup(
650 negotiate_disable_cname_lookup_.GetValue());
651}
652
653void IOThread::UpdateNegotiateEnablePort() {
654 globals_->http_auth_preferences->set_negotiate_enable_port(
655 negotiate_enable_port_.GetValue());
656}
657
mmenkec2af5952017-06-07 23:26:47658std::unique_ptr<net::HttpAuthHandlerFactory>
659IOThread::CreateDefaultAuthHandlerFactory(net::HostResolver* host_resolver) {
aberentbba302d2015-12-03 10:20:19660 std::vector<std::string> supported_schemes = base::SplitString(
661 auth_schemes_, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
662 globals_->http_auth_preferences.reset(new net::HttpAuthPreferences(
663 supported_schemes
664#if defined(OS_POSIX) && !defined(OS_ANDROID)
665 ,
666 gssapi_library_name_
667#endif
zentaroe0326352017-05-09 13:11:51668#if defined(OS_CHROMEOS)
669 ,
670 allow_gssapi_library_load_
671#endif
aberentbba302d2015-12-03 10:20:19672 ));
673 UpdateServerWhitelist();
674 UpdateDelegateWhitelist();
675 UpdateNegotiateDisableCnameLookup();
676 UpdateNegotiateEnablePort();
677#if defined(OS_ANDROID)
678 UpdateAndroidAuthNegotiateAccountType();
679#endif
mmenkec2af5952017-06-07 23:26:47680
681 return net::HttpAuthHandlerRegistryFactory::Create(
682 globals_->http_auth_preferences.get(), host_resolver);
[email protected]eb3cac72010-02-26 21:07:45683}
684
msramek94f5656c2016-08-31 17:08:29685void IOThread::ClearHostCache(
686 const base::Callback<bool(const std::string&)>& host_filter) {
thestig00844cea2015-09-08 21:44:52687 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]d6f37fc2011-02-13 23:58:41688
Matt Menked0b07a982017-08-23 02:09:29689 globals_->system_request_context->host_resolver()
690 ->GetHostCache()
691 ->ClearForHosts(host_filter);
[email protected]0ac83682010-01-22 17:46:27692}
[email protected]db0e86dd2011-03-16 14:47:21693
pmarko6ab8be242017-01-11 11:02:55694void IOThread::DisableQuic() {
Matt Menkecfef87d2017-08-03 13:03:06695 DCHECK_CURRENTLY_ON(BrowserThread::IO);
696 globals_->network_service->DisableQuic();
pmarko6ab8be242017-01-11 11:02:55697}
698
[email protected]4d45a6de2011-05-13 05:20:18699net::SSLConfigService* IOThread::GetSSLConfigService() {
700 return ssl_config_service_manager_->Get();
701}
702
[email protected]b09f76d62011-12-07 01:51:06703void IOThread::ChangedToOnTheRecordOnIOThread() {
thestig00844cea2015-09-08 21:44:52704 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]b09f76d62011-12-07 01:51:06705
706 // Clear the host cache to avoid showing entries from the OTR session
707 // in about:net-internals.
msramek94f5656c2016-08-31 17:08:29708 ClearHostCache(base::Callback<bool(const std::string&)>());
[email protected]b09f76d62011-12-07 01:51:06709}
710
[email protected]fa4b6c32012-11-26 23:02:39711void IOThread::UpdateDnsClientEnabled() {
mmenkec2af5952017-06-07 23:26:47712 globals()->system_request_context->host_resolver()->SetDnsClientEnabled(
713 *dns_client_enabled_);
[email protected]fa4b6c32012-11-26 23:02:39714}
[email protected]903e63382013-06-01 00:40:58715
eranm3c2d6432016-06-01 10:17:27716void IOThread::RegisterSTHObserver(net::ct::STHObserver* observer) {
717 chrome_browser_net::GetGlobalSTHDistributor()->RegisterObserver(observer);
718}
719
720void IOThread::UnregisterSTHObserver(net::ct::STHObserver* observer) {
721 chrome_browser_net::GetGlobalSTHDistributor()->UnregisterObserver(observer);
722}
723
eroman9f7ea642016-06-03 21:28:29724bool IOThread::WpadQuickCheckEnabled() const {
725 return quick_check_enabled_.GetValue();
726}
727
728bool IOThread::PacHttpsUrlStrippingEnabled() const {
729 return pac_https_url_stripping_enabled_.GetValue();
730}
731
mmenke1c261ff2017-07-23 17:06:35732void IOThread::SetUpProxyConfigService(
733 net::URLRequestContextBuilderMojo* builder,
734 std::unique_ptr<net::ProxyConfigService> proxy_config_service) const {
mmenkec2af5952017-06-07 23:26:47735 const base::CommandLine& command_line =
736 *base::CommandLine::ForCurrentProcess();
mmenke1c261ff2017-07-23 17:06:35737
738 // TODO(eroman): Figure out why this doesn't work in single-process mode.
739 // Should be possible now that a private isolate is used.
740 // http://crbug.com/474654
741 if (!command_line.HasSwitch(switches::kWinHttpProxyResolver)) {
742 if (command_line.HasSwitch(switches::kSingleProcess)) {
743 LOG(ERROR) << "Cannot use V8 Proxy resolver in single process mode.";
744 } else {
745 builder->set_mojo_proxy_resolver_factory(
746 ChromeMojoProxyResolverFactory::GetInstance());
747#if defined(OS_CHROMEOS)
748 builder->set_dhcp_fetcher_factory(
749 base::MakeUnique<chromeos::DhcpProxyScriptFetcherFactoryChromeos>());
750#endif
751 }
752 }
753
754 builder->set_pac_quick_check_enabled(WpadQuickCheckEnabled());
755 builder->set_pac_sanitize_url_policy(
756 PacHttpsUrlStrippingEnabled()
757 ? net::ProxyService::SanitizeUrlPolicy::SAFE
758 : net::ProxyService::SanitizeUrlPolicy::UNSAFE);
759 builder->set_proxy_config_service(std::move(proxy_config_service));
760}
761
762void IOThread::ConstructSystemRequestContext() {
mmenkef73a5122017-07-13 23:27:39763 std::unique_ptr<net::URLRequestContextBuilderMojo> builder =
764 base::MakeUnique<net::URLRequestContextBuilderMojo>();
mmenkec2af5952017-06-07 23:26:47765
mmenkef73a5122017-07-13 23:27:39766 builder->set_network_quality_estimator(
mmenkef2e53b22017-05-15 18:40:18767 globals_->network_quality_estimator.get());
mmenkef73a5122017-07-13 23:27:39768 builder->set_enable_brotli(globals_->enable_brotli);
769 builder->set_name("system");
mmenke518c27b2017-05-04 23:15:21770
mmenkef73a5122017-07-13 23:27:39771 builder->set_user_agent(GetUserAgent());
mmenke15992ce2017-05-30 21:05:02772 std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
773 new ChromeNetworkDelegate(extension_event_router_forwarder(),
774 &system_enable_referrers_));
775 // By default, data usage is considered off the record.
776 chrome_network_delegate->set_data_use_aggregator(
777 globals_->data_use_aggregator.get(),
778 true /* is_data_usage_off_the_record */);
mmenkef73a5122017-07-13 23:27:39779 builder->set_network_delegate(
mmenke15992ce2017-05-30 21:05:02780 globals_->data_use_ascriber->CreateNetworkDelegate(
781 std::move(chrome_network_delegate), GetMetricsDataUseForwarder()));
mmenkef73a5122017-07-13 23:27:39782 builder->set_net_log(net_log_);
mmenke14085ad2017-06-15 21:53:54783 std::unique_ptr<net::HostResolver> host_resolver(
784 CreateGlobalHostResolver(net_log_));
mmenkef2e53b22017-05-15 18:40:18785
mmenkef73a5122017-07-13 23:27:39786 builder->set_ssl_config_service(GetSSLConfigService());
787 builder->SetHttpAuthHandlerFactory(
mmenke14085ad2017-06-15 21:53:54788 CreateDefaultAuthHandlerFactory(host_resolver.get()));
wjmacleanea309f72015-08-25 20:56:59789
mmenkef73a5122017-07-13 23:27:39790 builder->set_host_resolver(std::move(host_resolver));
wjmacleanea309f72015-08-25 20:56:59791
Jochen Eisingerbc991412017-07-14 22:06:22792 std::unique_ptr<net::CertVerifier> cert_verifier;
mmenkec2af5952017-06-07 23:26:47793#if defined(OS_CHROMEOS)
794 // Creates a CertVerifyProc that doesn't allow any profile-provided certs.
Jochen Eisingerbc991412017-07-14 22:06:22795 cert_verifier = base::MakeUnique<net::CachingCertVerifier>(
mmenkec2af5952017-06-07 23:26:47796 base::MakeUnique<net::MultiThreadedCertVerifier>(
Jochen Eisingerbc991412017-07-14 22:06:22797 new chromeos::CertVerifyProcChromeOS()));
mmenkec2af5952017-06-07 23:26:47798#else
Jochen Eisingerbc991412017-07-14 22:06:22799 cert_verifier = net::CertVerifier::CreateDefault();
800#endif
mmenke1c261ff2017-07-23 17:06:35801 const base::CommandLine& command_line =
802 *base::CommandLine::ForCurrentProcess();
Jochen Eisingerbc991412017-07-14 22:06:22803 builder->SetCertVerifier(
804 content::IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
805 command_line, switches::kUserDataDir, std::move(cert_verifier)));
mmenkec2af5952017-06-07 23:26:47806 UMA_HISTOGRAM_BOOLEAN(
807 "Net.Certificate.IgnoreCertificateErrorsSPKIListPresent",
808 command_line.HasSwitch(switches::kIgnoreCertificateErrorsSPKIList));
mmenkec2af5952017-06-07 23:26:47809
810 std::unique_ptr<net::MultiLogCTVerifier> ct_verifier =
811 base::MakeUnique<net::MultiLogCTVerifier>();
812 // Add built-in logs
813 ct_verifier->AddLogs(globals_->ct_logs);
814
815 // Register the ct_tree_tracker_ as observer for verified SCTs.
816 ct_verifier->SetObserver(ct_tree_tracker_.get());
817
mmenkef73a5122017-07-13 23:27:39818 builder->set_ct_verifier(std::move(ct_verifier));
mmenke6ddfbea2017-05-31 21:48:41819
mmenke1c261ff2017-07-23 17:06:35820 SetUpProxyConfigService(builder.get(),
821 std::move(system_proxy_config_service_));
mmenkef2e53b22017-05-15 18:40:18822
mmenkef73a5122017-07-13 23:27:39823 globals_->network_service = content::NetworkService::Create();
Matt Menkecfef87d2017-08-03 13:03:06824 if (!is_quic_allowed_on_init_)
825 globals_->network_service->DisableQuic();
826
mmenkef73a5122017-07-13 23:27:39827 globals_->system_network_context =
828 globals_->network_service->CreateNetworkContextWithBuilder(
829 std::move(network_context_request_),
830 std::move(network_context_params_), std::move(builder),
831 &globals_->system_request_context);
mmenke4dcfb512017-06-26 22:00:21832
833#if defined(USE_NSS_CERTS)
mmenkef73a5122017-07-13 23:27:39834 net::SetURLRequestContextForNSSHttpIO(globals_->system_request_context);
mmenke4dcfb512017-06-26 22:00:21835#endif
836#if defined(OS_ANDROID)
837 net::CertVerifyProcAndroid::SetCertNetFetcher(
mmenkef73a5122017-07-13 23:27:39838 net::CreateCertNetFetcher(globals_->system_request_context));
mmenke4dcfb512017-06-26 22:00:21839#endif
wjmacleanea309f72015-08-25 20:56:59840}
841
robliao7253fd22016-12-01 18:41:38842metrics::UpdateUsagePrefCallbackType IOThread::GetMetricsDataUseForwarder() {
843 return base::Bind(&UpdateMetricsUsagePrefsOnUIThread);
gayane0b46091c2016-04-07 21:01:05844}