Commit 89f8c0d0 authored by Eric Orth's avatar Eric Orth Committed by Commit Bot

Use a shared HostResolverManager in Chromecast

Each individual URLRequestContext gets its own HostResolver instance.

Also, because that HostResolver becomes a dependency of the
HttpNetworkSession, constructed a new session for the media context
rather than reusing the session from the main context and built the
whole context from scratch rather than relying on the dangerous
URLRequestContext::CopyFrom(). Saved the sessions to a unique_ptr
rather than leaking it as was done previously.

Bug: 934402
Change-Id: I1c61f58406c2df66786da72146c4eb2631f6450c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1529518Reviewed-by: default avatarLuke Halliwell <halliwell@chromium.org>
Reviewed-by: default avatarAsanka Herath <asanka@chromium.org>
Commit-Queue: Eric Orth <ericorth@chromium.org>
Cr-Commit-Position: refs/heads/master@{#648703}
parent 1cd147a1
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "net/cert_net/nss_ocsp.h" #include "net/cert_net/nss_ocsp.h"
#include "net/cookies/cookie_store.h" #include "net/cookies/cookie_store.h"
#include "net/dns/host_resolver.h" #include "net/dns/host_resolver.h"
#include "net/dns/host_resolver_manager.h"
#include "net/http/http_auth_handler_factory.h" #include "net/http/http_auth_handler_factory.h"
#include "net/http/http_network_layer.h" #include "net/http/http_network_layer.h"
#include "net/http/http_server_properties_impl.h" #include "net/http/http_server_properties_impl.h"
...@@ -233,9 +234,8 @@ void URLRequestContextFactory::InitializeSystemContextDependencies() { ...@@ -233,9 +234,8 @@ void URLRequestContextFactory::InitializeSystemContextDependencies() {
if (system_dependencies_initialized_) if (system_dependencies_initialized_)
return; return;
// TODO(crbug.com/934402): Use a shared HostResolverManager instead of a host_resolver_manager_ = std::make_unique<net::HostResolverManager>(
// global HostResolver. net::HostResolver::Options(), nullptr);
host_resolver_ = net::HostResolver::CreateStandaloneResolver(nullptr);
cert_verifier_ = net::CertVerifier::CreateDefault(); cert_verifier_ = net::CertVerifier::CreateDefault();
ssl_config_service_.reset(new net::SSLConfigServiceDefaults); ssl_config_service_.reset(new net::SSLConfigServiceDefaults);
transport_security_state_.reset(new net::TransportSecurityState()); transport_security_state_.reset(new net::TransportSecurityState());
...@@ -252,6 +252,10 @@ void URLRequestContextFactory::InitializeSystemContextDependencies() { ...@@ -252,6 +252,10 @@ void URLRequestContextFactory::InitializeSystemContextDependencies() {
proxy_resolution_service_ = proxy_resolution_service_ =
net::ProxyResolutionService::CreateUsingSystemProxyResolver( net::ProxyResolutionService::CreateUsingSystemProxyResolver(
std::move(proxy_config_service_), nullptr); std::move(proxy_config_service_), nullptr);
system_host_resolver_ =
net::HostResolver::CreateResolver(host_resolver_manager_.get());
system_dependencies_initialized_ = true; system_dependencies_initialized_ = true;
} }
...@@ -300,15 +304,18 @@ void URLRequestContextFactory::InitializeMainContextDependencies( ...@@ -300,15 +304,18 @@ void URLRequestContextFactory::InitializeMainContextDependencies(
main_job_factory_ = std::move(top_job_factory); main_job_factory_ = std::move(top_job_factory);
main_host_resolver_ =
net::HostResolver::CreateResolver(host_resolver_manager_.get());
main_dependencies_initialized_ = true; main_dependencies_initialized_ = true;
} }
void URLRequestContextFactory::InitializeMediaContextDependencies( void URLRequestContextFactory::InitializeMediaContextDependencies() {
net::HttpTransactionFactory* transaction_factory) {
if (media_dependencies_initialized_) if (media_dependencies_initialized_)
return; return;
media_transaction_factory_.reset(transaction_factory); media_host_resolver_ =
net::HostResolver::CreateResolver(host_resolver_manager_.get());
media_dependencies_initialized_ = true; media_dependencies_initialized_ = true;
} }
...@@ -338,6 +345,18 @@ void URLRequestContextFactory::PopulateNetworkSessionParams( ...@@ -338,6 +345,18 @@ void URLRequestContextFactory::PopulateNetworkSessionParams(
<< session_params->disable_idle_sockets_close_on_memory_pressure; << session_params->disable_idle_sockets_close_on_memory_pressure;
} }
std::unique_ptr<net::HttpNetworkSession>
URLRequestContextFactory::CreateNetworkSession(
const net::URLRequestContext* context) {
net::HttpNetworkSession::Params session_params;
net::HttpNetworkSession::Context session_context;
PopulateNetworkSessionParams(IgnoreCertificateErrors(), &session_params);
net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
context, &session_context);
return std::make_unique<net::HttpNetworkSession>(session_params,
session_context);
}
net::URLRequestContext* URLRequestContextFactory::CreateSystemRequestContext() { net::URLRequestContext* URLRequestContextFactory::CreateSystemRequestContext() {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
InitializeSystemContextDependencies(); InitializeSystemContextDependencies();
...@@ -347,15 +366,12 @@ net::URLRequestContext* URLRequestContextFactory::CreateSystemRequestContext() { ...@@ -347,15 +366,12 @@ net::URLRequestContext* URLRequestContextFactory::CreateSystemRequestContext() {
net::URLRequestContext* system_context = new net::URLRequestContext(); net::URLRequestContext* system_context = new net::URLRequestContext();
ConfigureURLRequestContext(system_context, system_job_factory_, ConfigureURLRequestContext(system_context, system_job_factory_,
system_cookie_store_, system_network_delegate_); system_cookie_store_, system_network_delegate_,
system_host_resolver_);
net::HttpNetworkSession::Params session_params; system_network_session_ = CreateNetworkSession(system_context);
net::HttpNetworkSession::Context session_context; system_transaction_factory_ =
PopulateNetworkSessionParams(IgnoreCertificateErrors(), &session_params); std::make_unique<net::HttpNetworkLayer>(system_network_session_.get());
net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
system_context, &session_context);
system_transaction_factory_.reset(new net::HttpNetworkLayer(
new net::HttpNetworkSession(session_params, session_context)));
system_context->set_http_transaction_factory( system_context->set_http_transaction_factory(
system_transaction_factory_.get()); system_transaction_factory_.get());
...@@ -366,18 +382,20 @@ net::URLRequestContext* URLRequestContextFactory::CreateMediaRequestContext() { ...@@ -366,18 +382,20 @@ net::URLRequestContext* URLRequestContextFactory::CreateMediaRequestContext() {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
DCHECK(main_getter_.get()) DCHECK(main_getter_.get())
<< "Getting MediaRequestContext before MainRequestContext"; << "Getting MediaRequestContext before MainRequestContext";
net::URLRequestContext* main_context = main_getter_->GetURLRequestContext();
// Set non caching backend. InitializeMediaContextDependencies();
net::HttpNetworkSession* main_session =
main_transaction_factory_->GetSession();
InitializeMediaContextDependencies(
new net::HttpNetworkLayer(main_session));
// Reuse main context dependencies except HostResolver and
// HttpTransactionFactory.
net::URLRequestContext* media_context = new net::URLRequestContext(); net::URLRequestContext* media_context = new net::URLRequestContext();
media_context->CopyFrom(main_context); ConfigureURLRequestContext(media_context, main_job_factory_,
media_context->set_http_transaction_factory( main_cookie_store_, app_network_delegate_,
media_transaction_factory_.get()); media_host_resolver_);
media_network_session_ = CreateNetworkSession(media_context);
media_transaction_factory_ =
std::make_unique<net::HttpNetworkLayer>(media_network_session_.get());
media_context->set_http_transaction_factory(media_transaction_factory_.get());
return media_context; return media_context;
} }
...@@ -396,15 +414,12 @@ net::URLRequestContext* URLRequestContextFactory::CreateMainRequestContext( ...@@ -396,15 +414,12 @@ net::URLRequestContext* URLRequestContextFactory::CreateMainRequestContext(
net::URLRequestContext* main_context = new net::URLRequestContext(); net::URLRequestContext* main_context = new net::URLRequestContext();
ConfigureURLRequestContext(main_context, main_job_factory_, ConfigureURLRequestContext(main_context, main_job_factory_,
main_cookie_store_, app_network_delegate_); main_cookie_store_, app_network_delegate_,
main_host_resolver_);
net::HttpNetworkSession::Params session_params; main_network_session_ = CreateNetworkSession(main_context);
net::HttpNetworkSession::Context session_context; main_transaction_factory_ =
PopulateNetworkSessionParams(IgnoreCertificateErrors(), &session_params); std::make_unique<net::HttpNetworkLayer>(main_network_session_.get());
net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
main_context, &session_context);
main_transaction_factory_.reset(new net::HttpNetworkLayer(
new net::HttpNetworkSession(session_params, session_context)));
main_context->set_http_transaction_factory(main_transaction_factory_.get()); main_context->set_http_transaction_factory(main_transaction_factory_.get());
return main_context; return main_context;
...@@ -414,9 +429,9 @@ void URLRequestContextFactory::ConfigureURLRequestContext( ...@@ -414,9 +429,9 @@ void URLRequestContextFactory::ConfigureURLRequestContext(
net::URLRequestContext* context, net::URLRequestContext* context,
const std::unique_ptr<net::URLRequestJobFactory>& job_factory, const std::unique_ptr<net::URLRequestJobFactory>& job_factory,
const std::unique_ptr<net::CookieStore>& cookie_store, const std::unique_ptr<net::CookieStore>& cookie_store,
const std::unique_ptr<CastNetworkDelegate>& network_delegate) { const std::unique_ptr<CastNetworkDelegate>& network_delegate,
const std::unique_ptr<net::HostResolver>& host_resolver) {
// common settings // common settings
context->set_host_resolver(host_resolver_.get());
context->set_channel_id_service(channel_id_service_.get()); context->set_channel_id_service(channel_id_service_.get());
context->set_cert_verifier(cert_verifier_.get()); context->set_cert_verifier(cert_verifier_.get());
context->set_cert_transparency_verifier(cert_transparency_verifier_.get()); context->set_cert_transparency_verifier(cert_transparency_verifier_.get());
...@@ -433,6 +448,9 @@ void URLRequestContextFactory::ConfigureURLRequestContext( ...@@ -433,6 +448,9 @@ void URLRequestContextFactory::ConfigureURLRequestContext(
context->set_job_factory(job_factory.get()); context->set_job_factory(job_factory.get());
context->set_cookie_store(cookie_store.get()); context->set_cookie_store(cookie_store.get());
context->set_network_delegate(network_delegate.get()); context->set_network_delegate(network_delegate.get());
context->set_host_resolver(host_resolver.get());
host_resolver->SetRequestContext(context);
} }
void URLRequestContextFactory::InitializeNetworkDelegates() { void URLRequestContextFactory::InitializeNetworkDelegates() {
......
...@@ -20,6 +20,8 @@ class FilePath; ...@@ -20,6 +20,8 @@ class FilePath;
namespace net { namespace net {
class ChannelIDService; class ChannelIDService;
class CookieStore; class CookieStore;
class HostResolver;
class HostResolverManager;
class HttpTransactionFactory; class HttpTransactionFactory;
class HttpUserAgentSettings; class HttpUserAgentSettings;
class NetLog; class NetLog;
...@@ -60,10 +62,6 @@ class URLRequestContextFactory { ...@@ -60,10 +62,6 @@ class URLRequestContextFactory {
return app_network_delegate_.get(); return app_network_delegate_.get();
} }
net::HostResolver* host_resolver() const {
return host_resolver_.get();
}
// Initialize the CastNetworkDelegate objects. This needs to be done // Initialize the CastNetworkDelegate objects. This needs to be done
// after the CastService is created, but before any URL requests are made. // after the CastService is created, but before any URL requests are made.
void InitializeNetworkDelegates(); void InitializeNetworkDelegates();
...@@ -78,11 +76,13 @@ class URLRequestContextFactory { ...@@ -78,11 +76,13 @@ class URLRequestContextFactory {
void InitializeMainContextDependencies( void InitializeMainContextDependencies(
content::ProtocolHandlerMap* protocol_handlers, content::ProtocolHandlerMap* protocol_handlers,
content::URLRequestInterceptorScopedVector request_interceptors); content::URLRequestInterceptorScopedVector request_interceptors);
void InitializeMediaContextDependencies(net::HttpTransactionFactory* factory); void InitializeMediaContextDependencies();
void PopulateNetworkSessionParams( void PopulateNetworkSessionParams(
bool ignore_certificate_errors, bool ignore_certificate_errors,
net::HttpNetworkSession::Params* session_params); net::HttpNetworkSession::Params* session_params);
std::unique_ptr<net::HttpNetworkSession> CreateNetworkSession(
const net::URLRequestContext* context);
// These are called by the RequestContextGetters to create each // These are called by the RequestContextGetters to create each
// RequestContext. // RequestContext.
...@@ -99,7 +99,8 @@ class URLRequestContextFactory { ...@@ -99,7 +99,8 @@ class URLRequestContextFactory {
net::URLRequestContext* context, net::URLRequestContext* context,
const std::unique_ptr<net::URLRequestJobFactory>& job_factory, const std::unique_ptr<net::URLRequestJobFactory>& job_factory,
const std::unique_ptr<net::CookieStore>& cookie_store, const std::unique_ptr<net::CookieStore>& cookie_store,
const std::unique_ptr<CastNetworkDelegate>& network_delegate); const std::unique_ptr<CastNetworkDelegate>& network_delegate,
const std::unique_ptr<net::HostResolver>& host_resolver);
scoped_refptr<net::URLRequestContextGetter> system_getter_; scoped_refptr<net::URLRequestContextGetter> system_getter_;
scoped_refptr<net::URLRequestContextGetter> media_getter_; scoped_refptr<net::URLRequestContextGetter> media_getter_;
...@@ -113,7 +114,7 @@ class URLRequestContextFactory { ...@@ -113,7 +114,7 @@ class URLRequestContextFactory {
// The URLRequestContextStorage class manages dependent resources for a single // The URLRequestContextStorage class manages dependent resources for a single
// instance of URLRequestContext only. // instance of URLRequestContext only.
bool system_dependencies_initialized_; bool system_dependencies_initialized_;
std::unique_ptr<net::HostResolver> host_resolver_; std::unique_ptr<net::HostResolverManager> host_resolver_manager_;
std::unique_ptr<net::ChannelIDService> channel_id_service_; std::unique_ptr<net::ChannelIDService> channel_id_service_;
std::unique_ptr<net::CertVerifier> cert_verifier_; std::unique_ptr<net::CertVerifier> cert_verifier_;
std::unique_ptr<net::SSLConfigService> ssl_config_service_; std::unique_ptr<net::SSLConfigService> ssl_config_service_;
...@@ -125,17 +126,23 @@ class URLRequestContextFactory { ...@@ -125,17 +126,23 @@ class URLRequestContextFactory {
std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory_; std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory_;
std::unique_ptr<net::HttpServerProperties> http_server_properties_; std::unique_ptr<net::HttpServerProperties> http_server_properties_;
std::unique_ptr<net::HttpUserAgentSettings> http_user_agent_settings_; std::unique_ptr<net::HttpUserAgentSettings> http_user_agent_settings_;
std::unique_ptr<net::HttpNetworkSession> system_network_session_;
std::unique_ptr<net::HttpTransactionFactory> system_transaction_factory_; std::unique_ptr<net::HttpTransactionFactory> system_transaction_factory_;
std::unique_ptr<net::CookieStore> system_cookie_store_; std::unique_ptr<net::CookieStore> system_cookie_store_;
std::unique_ptr<net::URLRequestJobFactory> system_job_factory_; std::unique_ptr<net::URLRequestJobFactory> system_job_factory_;
std::unique_ptr<net::HostResolver> system_host_resolver_;
bool main_dependencies_initialized_; bool main_dependencies_initialized_;
std::unique_ptr<net::HttpNetworkSession> main_network_session_;
std::unique_ptr<net::HttpTransactionFactory> main_transaction_factory_; std::unique_ptr<net::HttpTransactionFactory> main_transaction_factory_;
std::unique_ptr<net::CookieStore> main_cookie_store_; std::unique_ptr<net::CookieStore> main_cookie_store_;
std::unique_ptr<net::URLRequestJobFactory> main_job_factory_; std::unique_ptr<net::URLRequestJobFactory> main_job_factory_;
std::unique_ptr<net::HostResolver> main_host_resolver_;
bool media_dependencies_initialized_; bool media_dependencies_initialized_;
std::unique_ptr<net::HttpNetworkSession> media_network_session_;
std::unique_ptr<net::HttpTransactionFactory> media_transaction_factory_; std::unique_ptr<net::HttpTransactionFactory> media_transaction_factory_;
std::unique_ptr<net::HostResolver> media_host_resolver_;
std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_impl_; std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_impl_;
......
...@@ -213,6 +213,10 @@ source_set("host_resolver_manager") { ...@@ -213,6 +213,10 @@ source_set("host_resolver_manager") {
# Whitelist-only access so we can keep track of all usage external to the # Whitelist-only access so we can keep track of all usage external to the
# network stack and network service. # network stack and network service.
friend = [ friend = [
# chromecast/browser/url_request_context_factory.cc
# URLRequestContext creation for chromecast.
"//chromecast/browser",
# Network stack/service. # Network stack/service.
"//net/*", "//net/*",
"//services/network/*", "//services/network/*",
......
...@@ -35,12 +35,6 @@ class ProcessMemoryDump; ...@@ -35,12 +35,6 @@ class ProcessMemoryDump;
} }
} }
namespace chromecast {
namespace shell {
class URLRequestContextFactory;
}
} // namespace chromecast
namespace safe_browsing { namespace safe_browsing {
class SafeBrowsingURLRequestContextGetter; class SafeBrowsingURLRequestContextGetter;
} // namespace safe_browsing } // namespace safe_browsing
...@@ -311,7 +305,6 @@ class NET_EXPORT URLRequestContext ...@@ -311,7 +305,6 @@ class NET_EXPORT URLRequestContext
// Whitelist legacy usage of now-deprecated CopyFrom(). // Whitelist legacy usage of now-deprecated CopyFrom().
friend class ::ChromeBrowserStateImplIOData; friend class ::ChromeBrowserStateImplIOData;
friend class ::ProfileImplIOData; friend class ::ProfileImplIOData;
friend class chromecast::shell::URLRequestContextFactory;
friend class safe_browsing::SafeBrowsingURLRequestContextGetter; friend class safe_browsing::SafeBrowsingURLRequestContextGetter;
// Copies the state from |other| into this context. // Copies the state from |other| into this context.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment