OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/url_request/url_request_context_builder.h" | 5 #include "net/url_request/url_request_context_builder.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
17 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
18 #include "base/threading/thread.h" | 18 #include "base/task_scheduler/post_task.h" |
19 #include "base/threading/thread_task_runner_handle.h" | |
20 #include "net/base/cache_type.h" | 19 #include "net/base/cache_type.h" |
21 #include "net/base/net_errors.h" | 20 #include "net/base/net_errors.h" |
22 #include "net/base/network_delegate_impl.h" | 21 #include "net/base/network_delegate_impl.h" |
23 #include "net/base/sdch_manager.h" | 22 #include "net/base/sdch_manager.h" |
24 #include "net/cert/cert_verifier.h" | 23 #include "net/cert/cert_verifier.h" |
25 #include "net/cert/ct_known_logs.h" | 24 #include "net/cert/ct_known_logs.h" |
26 #include "net/cert/ct_log_verifier.h" | 25 #include "net/cert/ct_log_verifier.h" |
27 #include "net/cert/ct_policy_enforcer.h" | 26 #include "net/cert/ct_policy_enforcer.h" |
28 #include "net/cert/ct_verifier.h" | 27 #include "net/cert/ct_verifier.h" |
29 #include "net/cert/multi_log_ct_verifier.h" | 28 #include "net/cert/multi_log_ct_verifier.h" |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); | 136 DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); |
138 }; | 137 }; |
139 | 138 |
140 // A URLRequestContext subclass that owns most of its components | 139 // A URLRequestContext subclass that owns most of its components |
141 // via a UrlRequestContextStorage object. When URLRequestContextBuilder::Build() | 140 // via a UrlRequestContextStorage object. When URLRequestContextBuilder::Build() |
142 // is called, ownership of all URLRequestContext components is passed to the | 141 // is called, ownership of all URLRequestContext components is passed to the |
143 // ContainerURLRequestContext. Since this cancels requests in its destructor, | 142 // ContainerURLRequestContext. Since this cancels requests in its destructor, |
144 // it's not safe to subclass this. | 143 // it's not safe to subclass this. |
145 class ContainerURLRequestContext final : public URLRequestContext { | 144 class ContainerURLRequestContext final : public URLRequestContext { |
146 public: | 145 public: |
147 explicit ContainerURLRequestContext( | 146 ContainerURLRequestContext() : storage_(this) {} |
148 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) | |
149 : file_task_runner_(file_task_runner), storage_(this) {} | |
150 | 147 |
151 ~ContainerURLRequestContext() override { | 148 ~ContainerURLRequestContext() override { |
152 // Destroy the ReportingService before the rest of the URLRequestContext, so | 149 // Destroy the ReportingService before the rest of the URLRequestContext, so |
153 // it cancels any pending requests it may have. | 150 // it cancels any pending requests it may have. |
154 storage_.set_reporting_service(nullptr); | 151 storage_.set_reporting_service(nullptr); |
155 | 152 |
156 // Shut down the ProxyService, as it may have pending URLRequests using this | 153 // Shut down the ProxyService, as it may have pending URLRequests using this |
157 // context. Since this cancels requests, it's not safe to subclass this, as | 154 // context. Since this cancels requests, it's not safe to subclass this, as |
158 // some parts of the URLRequestContext may then be torn down before this | 155 // some parts of the URLRequestContext may then be torn down before this |
159 // cancels the ProxyService's URLRequests. | 156 // cancels the ProxyService's URLRequests. |
160 proxy_service()->OnShutdown(); | 157 proxy_service()->OnShutdown(); |
161 | 158 |
162 AssertNoURLRequests(); | 159 AssertNoURLRequests(); |
163 } | 160 } |
164 | 161 |
165 URLRequestContextStorage* storage() { | 162 URLRequestContextStorage* storage() { |
166 return &storage_; | 163 return &storage_; |
167 } | 164 } |
168 | 165 |
169 scoped_refptr<base::SingleThreadTaskRunner>& GetFileTaskRunner() { | |
170 // Create a new thread to run file tasks, if needed. | |
171 if (!file_task_runner_) { | |
172 DCHECK(!file_thread_); | |
173 file_thread_.reset(new base::Thread("Network File Thread")); | |
174 file_thread_->StartWithOptions( | |
175 base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0)); | |
176 file_task_runner_ = file_thread_->task_runner(); | |
177 } | |
178 return file_task_runner_; | |
179 } | |
180 | |
181 void set_transport_security_persister( | 166 void set_transport_security_persister( |
182 std::unique_ptr<TransportSecurityPersister> | 167 std::unique_ptr<TransportSecurityPersister> |
183 transport_security_persister) { | 168 transport_security_persister) { |
184 transport_security_persister_ = std::move(transport_security_persister); | 169 transport_security_persister_ = std::move(transport_security_persister); |
185 } | 170 } |
186 | 171 |
187 private: | 172 private: |
188 // The thread should be torn down last. | |
189 std::unique_ptr<base::Thread> file_thread_; | |
190 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; | |
191 | |
192 URLRequestContextStorage storage_; | 173 URLRequestContextStorage storage_; |
193 std::unique_ptr<TransportSecurityPersister> transport_security_persister_; | 174 std::unique_ptr<TransportSecurityPersister> transport_security_persister_; |
194 | 175 |
195 DISALLOW_COPY_AND_ASSIGN(ContainerURLRequestContext); | 176 DISALLOW_COPY_AND_ASSIGN(ContainerURLRequestContext); |
196 }; | 177 }; |
197 | 178 |
198 } // namespace | 179 } // namespace |
199 | 180 |
200 URLRequestContextBuilder::HttpCacheParams::HttpCacheParams() | 181 URLRequestContextBuilder::HttpCacheParams::HttpCacheParams() |
201 : type(IN_MEMORY), | 182 : type(IN_MEMORY), |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
315 http_auth_handler_factory_ = std::move(factory); | 296 http_auth_handler_factory_ = std::move(factory); |
316 } | 297 } |
317 | 298 |
318 void URLRequestContextBuilder::SetHttpServerProperties( | 299 void URLRequestContextBuilder::SetHttpServerProperties( |
319 std::unique_ptr<HttpServerProperties> http_server_properties) { | 300 std::unique_ptr<HttpServerProperties> http_server_properties) { |
320 http_server_properties_ = std::move(http_server_properties); | 301 http_server_properties_ = std::move(http_server_properties); |
321 } | 302 } |
322 | 303 |
323 std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { | 304 std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { |
324 std::unique_ptr<ContainerURLRequestContext> context( | 305 std::unique_ptr<ContainerURLRequestContext> context( |
325 new ContainerURLRequestContext(file_task_runner_)); | 306 new ContainerURLRequestContext()); |
326 URLRequestContextStorage* storage = context->storage(); | 307 URLRequestContextStorage* storage = context->storage(); |
327 | 308 |
328 context->set_name(name_); | 309 context->set_name(name_); |
329 context->set_enable_brotli(enable_brotli_); | 310 context->set_enable_brotli(enable_brotli_); |
330 context->set_network_quality_estimator(network_quality_estimator_); | 311 context->set_network_quality_estimator(network_quality_estimator_); |
331 | 312 |
332 storage->set_http_user_agent_settings( | 313 storage->set_http_user_agent_settings( |
333 base::MakeUnique<StaticHttpUserAgentSettings>(accept_language_, | 314 base::MakeUnique<StaticHttpUserAgentSettings>(accept_language_, |
334 user_agent_)); | 315 user_agent_)); |
335 | 316 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 } | 360 } |
380 | 361 |
381 if (sdch_enabled_) { | 362 if (sdch_enabled_) { |
382 storage->set_sdch_manager( | 363 storage->set_sdch_manager( |
383 std::unique_ptr<net::SdchManager>(new SdchManager())); | 364 std::unique_ptr<net::SdchManager>(new SdchManager())); |
384 } | 365 } |
385 | 366 |
386 storage->set_transport_security_state( | 367 storage->set_transport_security_state( |
387 base::MakeUnique<TransportSecurityState>()); | 368 base::MakeUnique<TransportSecurityState>()); |
388 if (!transport_security_persister_path_.empty()) { | 369 if (!transport_security_persister_path_.empty()) { |
370 // Use a low priority because saving this should not block anything | |
371 // user-visible. Block shutdown to ensure it does get persisted to disk, | |
372 // since it contains security-relevant information. | |
373 scoped_refptr<base::SequencedTaskRunner> task_runner(GetSequencedTaskRunner( | |
374 {base::MayBlock(), base::TaskPriority::BACKGROUND, | |
375 base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); | |
376 | |
389 context->set_transport_security_persister( | 377 context->set_transport_security_persister( |
390 base::WrapUnique<TransportSecurityPersister>( | 378 base::WrapUnique<TransportSecurityPersister>( |
391 new TransportSecurityPersister(context->transport_security_state(), | 379 new TransportSecurityPersister(context->transport_security_state(), |
392 transport_security_persister_path_, | 380 transport_security_persister_path_, |
393 context->GetFileTaskRunner(), | 381 task_runner, false))); |
394 false))); | |
395 } | 382 } |
396 | 383 |
397 if (http_server_properties_) { | 384 if (http_server_properties_) { |
398 storage->set_http_server_properties(std::move(http_server_properties_)); | 385 storage->set_http_server_properties(std::move(http_server_properties_)); |
399 } else { | 386 } else { |
400 storage->set_http_server_properties( | 387 storage->set_http_server_properties( |
401 std::unique_ptr<HttpServerProperties>(new HttpServerPropertiesImpl())); | 388 std::unique_ptr<HttpServerProperties>(new HttpServerPropertiesImpl())); |
402 } | 389 } |
403 | 390 |
404 if (cert_verifier_) { | 391 if (cert_verifier_) { |
(...skipping 17 matching lines...) Expand all Loading... | |
422 base::MakeUnique<URLRequestThrottlerManager>()); | 409 base::MakeUnique<URLRequestThrottlerManager>()); |
423 } | 410 } |
424 | 411 |
425 if (!proxy_service_) { | 412 if (!proxy_service_) { |
426 #if !defined(OS_LINUX) && !defined(OS_ANDROID) | 413 #if !defined(OS_LINUX) && !defined(OS_ANDROID) |
427 // TODO(willchan): Switch to using this code when | 414 // TODO(willchan): Switch to using this code when |
428 // ProxyService::CreateSystemProxyConfigService()'s signature doesn't suck. | 415 // ProxyService::CreateSystemProxyConfigService()'s signature doesn't suck. |
429 if (!proxy_config_service_) { | 416 if (!proxy_config_service_) { |
430 proxy_config_service_ = ProxyService::CreateSystemProxyConfigService( | 417 proxy_config_service_ = ProxyService::CreateSystemProxyConfigService( |
431 base::ThreadTaskRunnerHandle::Get().get(), | 418 base::ThreadTaskRunnerHandle::Get().get(), |
432 context->GetFileTaskRunner()); | 419 GetSingleThreadTaskRunner( |
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
When I first looked at this, I thought "Oh, of cou
mmenke
2017/06/21 15:13:55
ProxyService::CreateSystemProxyConfigService requi
| |
420 {base::MayBlock(), base::TaskPriority::USER_BLOCKING, | |
421 base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})); | |
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
Why CONTINUE_ON_SHUTDOWN for the proxy service?
mmenke
2017/06/21 15:13:56
Because we aren't writing anything to disk, so no
| |
433 } | 422 } |
434 #endif // !defined(OS_LINUX) && !defined(OS_ANDROID) | 423 #endif // !defined(OS_LINUX) && !defined(OS_ANDROID) |
435 proxy_service_ = | 424 proxy_service_ = |
436 CreateProxyService(std::move(proxy_config_service_), context.get(), | 425 CreateProxyService(std::move(proxy_config_service_), context.get(), |
437 context->host_resolver(), | 426 context->host_resolver(), |
438 context->network_delegate(), context->net_log()); | 427 context->network_delegate(), context->net_log()); |
439 proxy_service_->set_quick_check_enabled(pac_quick_check_enabled_); | 428 proxy_service_->set_quick_check_enabled(pac_quick_check_enabled_); |
440 proxy_service_->set_sanitize_url_policy(pac_sanitize_url_policy_); | 429 proxy_service_->set_sanitize_url_policy(pac_sanitize_url_policy_); |
441 } | 430 } |
442 storage->set_proxy_service(std::move(proxy_service_)); | 431 storage->set_proxy_service(std::move(proxy_service_)); |
(...skipping 12 matching lines...) Expand all Loading... | |
455 std::unique_ptr<HttpTransactionFactory> http_transaction_factory; | 444 std::unique_ptr<HttpTransactionFactory> http_transaction_factory; |
456 if (http_cache_enabled_) { | 445 if (http_cache_enabled_) { |
457 std::unique_ptr<HttpCache::BackendFactory> http_cache_backend; | 446 std::unique_ptr<HttpCache::BackendFactory> http_cache_backend; |
458 if (http_cache_params_.type != HttpCacheParams::IN_MEMORY) { | 447 if (http_cache_params_.type != HttpCacheParams::IN_MEMORY) { |
459 BackendType backend_type = | 448 BackendType backend_type = |
460 http_cache_params_.type == HttpCacheParams::DISK | 449 http_cache_params_.type == HttpCacheParams::DISK |
461 ? CACHE_BACKEND_DEFAULT | 450 ? CACHE_BACKEND_DEFAULT |
462 : CACHE_BACKEND_SIMPLE; | 451 : CACHE_BACKEND_SIMPLE; |
463 http_cache_backend.reset(new HttpCache::DefaultBackend( | 452 http_cache_backend.reset(new HttpCache::DefaultBackend( |
464 DISK_CACHE, backend_type, http_cache_params_.path, | 453 DISK_CACHE, backend_type, http_cache_params_.path, |
465 http_cache_params_.max_size, context->GetFileTaskRunner())); | 454 http_cache_params_.max_size, |
455 GetSingleThreadTaskRunner( | |
456 {base::MayBlock(), base::TaskPriority::USER_BLOCKING, | |
457 base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}))); | |
466 } else { | 458 } else { |
467 http_cache_backend = | 459 http_cache_backend = |
468 HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size); | 460 HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size); |
469 } | 461 } |
470 | 462 |
471 http_transaction_factory.reset(new HttpCache( | 463 http_transaction_factory.reset(new HttpCache( |
472 storage->http_network_session(), std::move(http_cache_backend), true)); | 464 storage->http_network_session(), std::move(http_cache_backend), true)); |
473 } else { | 465 } else { |
474 http_transaction_factory.reset( | 466 http_transaction_factory.reset( |
475 new HttpNetworkLayer(storage->http_network_session())); | 467 new HttpNetworkLayer(storage->http_network_session())); |
476 } | 468 } |
477 storage->set_http_transaction_factory(std::move(http_transaction_factory)); | 469 storage->set_http_transaction_factory(std::move(http_transaction_factory)); |
478 | 470 |
479 URLRequestJobFactoryImpl* job_factory = new URLRequestJobFactoryImpl; | 471 URLRequestJobFactoryImpl* job_factory = new URLRequestJobFactoryImpl; |
480 // Adds caller-provided protocol handlers first so that these handlers are | 472 // Adds caller-provided protocol handlers first so that these handlers are |
481 // used over data/file/ftp handlers below. | 473 // used over data/file/ftp handlers below. |
482 for (auto& scheme_handler : protocol_handlers_) { | 474 for (auto& scheme_handler : protocol_handlers_) { |
483 job_factory->SetProtocolHandler(scheme_handler.first, | 475 job_factory->SetProtocolHandler(scheme_handler.first, |
484 std::move(scheme_handler.second)); | 476 std::move(scheme_handler.second)); |
485 } | 477 } |
486 protocol_handlers_.clear(); | 478 protocol_handlers_.clear(); |
487 | 479 |
488 if (data_enabled_) | 480 if (data_enabled_) |
489 job_factory->SetProtocolHandler(url::kDataScheme, | 481 job_factory->SetProtocolHandler(url::kDataScheme, |
490 base::WrapUnique(new DataProtocolHandler)); | 482 base::WrapUnique(new DataProtocolHandler)); |
491 | 483 |
492 #if !BUILDFLAG(DISABLE_FILE_SUPPORT) | 484 #if !BUILDFLAG(DISABLE_FILE_SUPPORT) |
493 if (file_enabled_) { | 485 if (file_enabled_) { |
486 scoped_refptr<base::SequencedTaskRunner> task_runner(GetSequencedTaskRunner( | |
487 {base::MayBlock(), base::TaskPriority::BACKGROUND, | |
488 base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); | |
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
It's not doubt due to my mis-reading, but where is
mmenke
2017/06/21 15:13:56
Oops...Copy-paste error.
| |
489 | |
494 job_factory->SetProtocolHandler( | 490 job_factory->SetProtocolHandler( |
495 url::kFileScheme, | 491 url::kFileScheme, |
496 base::MakeUnique<FileProtocolHandler>(context->GetFileTaskRunner())); | 492 base::MakeUnique<FileProtocolHandler>( |
493 GetTaskRunner({base::MayBlock(), base::TaskPriority::USER_VISIBLE, | |
494 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}))); | |
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
Hmmm. Everything else was USER_BLOCKING, which ma
mmenke
2017/06/21 15:13:55
So, actually, despite the CL description, this was
Randy Smith (Not in Mondays)
2017/06/21 15:48:52
Ah, I missed that. I'd suggest being pretty clear
| |
497 } | 495 } |
498 #endif // !BUILDFLAG(DISABLE_FILE_SUPPORT) | 496 #endif // !BUILDFLAG(DISABLE_FILE_SUPPORT) |
499 | 497 |
500 #if !BUILDFLAG(DISABLE_FTP_SUPPORT) | 498 #if !BUILDFLAG(DISABLE_FTP_SUPPORT) |
501 if (ftp_enabled_) { | 499 if (ftp_enabled_) { |
502 job_factory->SetProtocolHandler( | 500 job_factory->SetProtocolHandler( |
503 url::kFtpScheme, FtpProtocolHandler::Create(context->host_resolver())); | 501 url::kFtpScheme, FtpProtocolHandler::Create(context->host_resolver())); |
504 } | 502 } |
505 #endif // !BUILDFLAG(DISABLE_FTP_SUPPORT) | 503 #endif // !BUILDFLAG(DISABLE_FTP_SUPPORT) |
506 | 504 |
(...skipping 21 matching lines...) Expand all Loading... | |
528 std::unique_ptr<ProxyService> URLRequestContextBuilder::CreateProxyService( | 526 std::unique_ptr<ProxyService> URLRequestContextBuilder::CreateProxyService( |
529 std::unique_ptr<ProxyConfigService> proxy_config_service, | 527 std::unique_ptr<ProxyConfigService> proxy_config_service, |
530 URLRequestContext* url_request_context, | 528 URLRequestContext* url_request_context, |
531 HostResolver* host_resolver, | 529 HostResolver* host_resolver, |
532 NetworkDelegate* network_delegate, | 530 NetworkDelegate* network_delegate, |
533 NetLog* net_log) { | 531 NetLog* net_log) { |
534 return ProxyService::CreateUsingSystemProxyResolver( | 532 return ProxyService::CreateUsingSystemProxyResolver( |
535 std::move(proxy_config_service), net_log); | 533 std::move(proxy_config_service), net_log); |
536 } | 534 } |
537 | 535 |
536 scoped_refptr<base::TaskRunner> URLRequestContextBuilder::GetTaskRunner( | |
537 const base::TaskTraits& traits) { | |
538 if (file_task_runner_) | |
539 return file_task_runner_; | |
540 return base::CreateTaskRunnerWithTraits(traits); | |
541 } | |
542 | |
543 scoped_refptr<base::SequencedTaskRunner> | |
544 URLRequestContextBuilder::GetSequencedTaskRunner( | |
545 const base::TaskTraits& traits) { | |
546 if (file_task_runner_) | |
547 return file_task_runner_; | |
548 return base::CreateSequencedTaskRunnerWithTraits(traits); | |
549 } | |
550 | |
551 scoped_refptr<base::SingleThreadTaskRunner> | |
552 URLRequestContextBuilder::GetSingleThreadTaskRunner( | |
553 const base::TaskTraits& traits) { | |
554 if (file_task_runner_) | |
555 return file_task_runner_; | |
556 return base::CreateSingleThreadTaskRunnerWithTraits(traits); | |
557 } | |
558 | |
538 } // namespace net | 559 } // namespace net |
OLD | NEW |