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( |
| 374 GetFileSequencedTaskRunner( |
| 375 {base::MayBlock(), base::TaskPriority::BACKGROUND, |
| 376 base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); |
| 377 |
389 context->set_transport_security_persister( | 378 context->set_transport_security_persister( |
390 base::WrapUnique<TransportSecurityPersister>( | 379 base::WrapUnique<TransportSecurityPersister>( |
391 new TransportSecurityPersister(context->transport_security_state(), | 380 new TransportSecurityPersister(context->transport_security_state(), |
392 transport_security_persister_path_, | 381 transport_security_persister_path_, |
393 context->GetFileTaskRunner(), | 382 task_runner, false))); |
394 false))); | |
395 } | 383 } |
396 | 384 |
397 if (http_server_properties_) { | 385 if (http_server_properties_) { |
398 storage->set_http_server_properties(std::move(http_server_properties_)); | 386 storage->set_http_server_properties(std::move(http_server_properties_)); |
399 } else { | 387 } else { |
400 storage->set_http_server_properties( | 388 storage->set_http_server_properties( |
401 std::unique_ptr<HttpServerProperties>(new HttpServerPropertiesImpl())); | 389 std::unique_ptr<HttpServerProperties>(new HttpServerPropertiesImpl())); |
402 } | 390 } |
403 | 391 |
404 if (cert_verifier_) { | 392 if (cert_verifier_) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 std::unique_ptr<HttpTransactionFactory> http_transaction_factory; | 442 std::unique_ptr<HttpTransactionFactory> http_transaction_factory; |
455 if (http_cache_enabled_) { | 443 if (http_cache_enabled_) { |
456 std::unique_ptr<HttpCache::BackendFactory> http_cache_backend; | 444 std::unique_ptr<HttpCache::BackendFactory> http_cache_backend; |
457 if (http_cache_params_.type != HttpCacheParams::IN_MEMORY) { | 445 if (http_cache_params_.type != HttpCacheParams::IN_MEMORY) { |
458 BackendType backend_type = | 446 BackendType backend_type = |
459 http_cache_params_.type == HttpCacheParams::DISK | 447 http_cache_params_.type == HttpCacheParams::DISK |
460 ? CACHE_BACKEND_DEFAULT | 448 ? CACHE_BACKEND_DEFAULT |
461 : CACHE_BACKEND_SIMPLE; | 449 : CACHE_BACKEND_SIMPLE; |
462 http_cache_backend.reset(new HttpCache::DefaultBackend( | 450 http_cache_backend.reset(new HttpCache::DefaultBackend( |
463 DISK_CACHE, backend_type, http_cache_params_.path, | 451 DISK_CACHE, backend_type, http_cache_params_.path, |
464 http_cache_params_.max_size, context->GetFileTaskRunner())); | 452 http_cache_params_.max_size, |
| 453 GetFileSingleThreadTaskRunner( |
| 454 {base::MayBlock(), base::TaskPriority::USER_BLOCKING, |
| 455 base::TaskShutdownBehavior::BLOCK_SHUTDOWN}))); |
465 } else { | 456 } else { |
466 http_cache_backend = | 457 http_cache_backend = |
467 HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size); | 458 HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size); |
468 } | 459 } |
469 | 460 |
470 http_transaction_factory.reset(new HttpCache( | 461 http_transaction_factory.reset(new HttpCache( |
471 storage->http_network_session(), std::move(http_cache_backend), true)); | 462 storage->http_network_session(), std::move(http_cache_backend), true)); |
472 } else { | 463 } else { |
473 http_transaction_factory.reset( | 464 http_transaction_factory.reset( |
474 new HttpNetworkLayer(storage->http_network_session())); | 465 new HttpNetworkLayer(storage->http_network_session())); |
(...skipping 10 matching lines...) Expand all Loading... |
485 protocol_handlers_.clear(); | 476 protocol_handlers_.clear(); |
486 | 477 |
487 if (data_enabled_) | 478 if (data_enabled_) |
488 job_factory->SetProtocolHandler(url::kDataScheme, | 479 job_factory->SetProtocolHandler(url::kDataScheme, |
489 base::WrapUnique(new DataProtocolHandler)); | 480 base::WrapUnique(new DataProtocolHandler)); |
490 | 481 |
491 #if !BUILDFLAG(DISABLE_FILE_SUPPORT) | 482 #if !BUILDFLAG(DISABLE_FILE_SUPPORT) |
492 if (file_enabled_) { | 483 if (file_enabled_) { |
493 job_factory->SetProtocolHandler( | 484 job_factory->SetProtocolHandler( |
494 url::kFileScheme, | 485 url::kFileScheme, |
495 base::MakeUnique<FileProtocolHandler>(context->GetFileTaskRunner())); | 486 base::MakeUnique<FileProtocolHandler>(GetFileTaskRunner( |
| 487 {base::MayBlock(), base::TaskPriority::USER_BLOCKING, |
| 488 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}))); |
496 } | 489 } |
497 #endif // !BUILDFLAG(DISABLE_FILE_SUPPORT) | 490 #endif // !BUILDFLAG(DISABLE_FILE_SUPPORT) |
498 | 491 |
499 #if !BUILDFLAG(DISABLE_FTP_SUPPORT) | 492 #if !BUILDFLAG(DISABLE_FTP_SUPPORT) |
500 if (ftp_enabled_) { | 493 if (ftp_enabled_) { |
501 job_factory->SetProtocolHandler( | 494 job_factory->SetProtocolHandler( |
502 url::kFtpScheme, FtpProtocolHandler::Create(context->host_resolver())); | 495 url::kFtpScheme, FtpProtocolHandler::Create(context->host_resolver())); |
503 } | 496 } |
504 #endif // !BUILDFLAG(DISABLE_FTP_SUPPORT) | 497 #endif // !BUILDFLAG(DISABLE_FTP_SUPPORT) |
505 | 498 |
(...skipping 21 matching lines...) Expand all Loading... |
527 std::unique_ptr<ProxyService> URLRequestContextBuilder::CreateProxyService( | 520 std::unique_ptr<ProxyService> URLRequestContextBuilder::CreateProxyService( |
528 std::unique_ptr<ProxyConfigService> proxy_config_service, | 521 std::unique_ptr<ProxyConfigService> proxy_config_service, |
529 URLRequestContext* url_request_context, | 522 URLRequestContext* url_request_context, |
530 HostResolver* host_resolver, | 523 HostResolver* host_resolver, |
531 NetworkDelegate* network_delegate, | 524 NetworkDelegate* network_delegate, |
532 NetLog* net_log) { | 525 NetLog* net_log) { |
533 return ProxyService::CreateUsingSystemProxyResolver( | 526 return ProxyService::CreateUsingSystemProxyResolver( |
534 std::move(proxy_config_service), net_log); | 527 std::move(proxy_config_service), net_log); |
535 } | 528 } |
536 | 529 |
| 530 scoped_refptr<base::TaskRunner> URLRequestContextBuilder::GetFileTaskRunner( |
| 531 const base::TaskTraits& traits) { |
| 532 if (file_task_runner_) |
| 533 return file_task_runner_; |
| 534 return base::CreateTaskRunnerWithTraits(traits); |
| 535 } |
| 536 |
| 537 scoped_refptr<base::SequencedTaskRunner> |
| 538 URLRequestContextBuilder::GetFileSequencedTaskRunner( |
| 539 const base::TaskTraits& traits) { |
| 540 if (file_task_runner_) |
| 541 return file_task_runner_; |
| 542 return base::CreateSequencedTaskRunnerWithTraits(traits); |
| 543 } |
| 544 |
| 545 scoped_refptr<base::SingleThreadTaskRunner> |
| 546 URLRequestContextBuilder::GetFileSingleThreadTaskRunner( |
| 547 const base::TaskTraits& traits) { |
| 548 if (file_task_runner_) |
| 549 return file_task_runner_; |
| 550 return base::CreateSingleThreadTaskRunnerWithTraits(traits); |
| 551 } |
| 552 |
537 } // namespace net | 553 } // namespace net |
OLD | NEW |