io_thread.cc 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright (c) 2017 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "atom/browser/io_thread.h"
  5. #include <utility>
  6. #include "atom/browser/net/url_request_context_getter.h"
  7. #include "components/net_log/chrome_net_log.h"
  8. #include "content/public/browser/browser_thread.h"
  9. #include "content/public/browser/network_service_instance.h"
  10. #include "net/cert/caching_cert_verifier.h"
  11. #include "net/cert/cert_verifier.h"
  12. #include "net/cert/cert_verify_proc.h"
  13. #include "net/cert/multi_threaded_cert_verifier.h"
  14. #include "net/proxy_resolution/proxy_resolution_service.h"
  15. #include "net/url_request/url_request_context.h"
  16. #include "services/network/network_service.h"
  17. #include "services/network/public/cpp/features.h"
  18. #include "services/network/url_request_context_builder_mojo.h"
  19. using content::BrowserThread;
  20. IOThread::IOThread(net_log::ChromeNetLog* net_log,
  21. SystemNetworkContextManager* system_network_context_manager)
  22. : net_log_(net_log) {
  23. BrowserThread::SetIOThreadDelegate(this);
  24. system_network_context_manager->SetUp(
  25. &network_context_request_, &network_context_params_,
  26. &http_auth_static_params_, &http_auth_dynamic_params_);
  27. }
  28. IOThread::~IOThread() {
  29. BrowserThread::SetIOThreadDelegate(nullptr);
  30. }
  31. void IOThread::RegisterURLRequestContextGetter(
  32. atom::URLRequestContextGetter* getter) {
  33. base::AutoLock lock(lock_);
  34. DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
  35. DCHECK_EQ(0u, request_context_getters_.count(getter));
  36. request_context_getters_.insert(getter);
  37. }
  38. void IOThread::DeregisterURLRequestContextGetter(
  39. atom::URLRequestContextGetter* getter) {
  40. base::AutoLock lock(lock_);
  41. DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
  42. DCHECK_EQ(1u, request_context_getters_.count(getter));
  43. request_context_getters_.erase(getter);
  44. }
  45. void IOThread::Init() {
  46. if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
  47. std::unique_ptr<network::URLRequestContextBuilderMojo> builder =
  48. std::make_unique<network::URLRequestContextBuilderMojo>();
  49. // Enable file:// support.
  50. builder->set_file_enabled(true);
  51. auto cert_verifier = std::make_unique<net::CachingCertVerifier>(
  52. std::make_unique<net::MultiThreadedCertVerifier>(
  53. net::CertVerifyProc::CreateDefault(nullptr)));
  54. builder->SetCertVerifier(std::move(cert_verifier));
  55. // Create the network service, so that shared host resolver
  56. // gets created which is required to set the auth preferences below.
  57. network::NetworkService* network_service = content::GetNetworkServiceImpl();
  58. network_service->SetUpHttpAuth(std::move(http_auth_static_params_));
  59. network_service->ConfigureHttpAuthPrefs(
  60. std::move(http_auth_dynamic_params_));
  61. system_network_context_ = network_service->CreateNetworkContextWithBuilder(
  62. std::move(network_context_request_), std::move(network_context_params_),
  63. std::move(builder), &system_request_context_);
  64. }
  65. }
  66. void IOThread::CleanUp() {
  67. if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
  68. system_request_context_->proxy_resolution_service()->OnShutdown();
  69. base::AutoLock lock(lock_);
  70. for (auto* getter : request_context_getters_) {
  71. getter->NotifyContextShuttingDown();
  72. }
  73. system_network_context_.reset();
  74. }
  75. if (net_log_)
  76. net_log_->ShutDownBeforeThreadPool();
  77. }