| Index: net/url_request/url_request_context_builder.cc
|
| diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
|
| index 93f5b1c0b74ba33ade0070726bc0a1061ea97d5d..5d5007d13c5862e4e7fc8bba139cd849d933ebf6 100644
|
| --- a/net/url_request/url_request_context_builder.cc
|
| +++ b/net/url_request/url_request_context_builder.cc
|
| @@ -24,14 +24,17 @@
|
| #include "net/http/http_network_layer.h"
|
| #include "net/http/http_network_session.h"
|
| #include "net/http/http_server_properties_impl.h"
|
| +#include "net/http/transport_security_persister.h"
|
| #include "net/http/transport_security_state.h"
|
| -#include "net/proxy/proxy_service.h"
|
| +#include "net/ssl/default_server_bound_cert_store.h"
|
| +#include "net/ssl/server_bound_cert_service.h"
|
| #include "net/ssl/ssl_config_service_defaults.h"
|
| #include "net/url_request/data_protocol_handler.h"
|
| #include "net/url_request/static_http_user_agent_settings.h"
|
| #include "net/url_request/url_request_context.h"
|
| #include "net/url_request/url_request_context_storage.h"
|
| #include "net/url_request/url_request_job_factory_impl.h"
|
| +#include "net/url_request/url_request_throttler_manager.h"
|
|
|
| #if !defined(DISABLE_FILE_SUPPORT)
|
| #include "net/url_request/file_protocol_handler.h"
|
| @@ -115,7 +118,9 @@ class BasicNetworkDelegate : public NetworkDelegate {
|
| }
|
|
|
| virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE {
|
| - return false;
|
| + // Returning true will only enable throttling if there's also a
|
| + // URLRequestThrottlerManager, which there isn't, by default.
|
| + return true;
|
| }
|
|
|
| virtual int OnBeforeSocketStreamConnect(
|
| @@ -138,7 +143,7 @@ class BasicURLRequestContext : public URLRequestContext {
|
|
|
| base::Thread* GetCacheThread() {
|
| if (!cache_thread_) {
|
| - cache_thread_.reset(new base::Thread("Cache Thread"));
|
| + cache_thread_.reset(new base::Thread("Network Cache Thread"));
|
| cache_thread_->StartWithOptions(
|
| base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
|
| }
|
| @@ -147,20 +152,29 @@ class BasicURLRequestContext : public URLRequestContext {
|
|
|
| base::Thread* GetFileThread() {
|
| if (!file_thread_) {
|
| - file_thread_.reset(new base::Thread("File Thread"));
|
| + file_thread_.reset(new base::Thread("Network File Thread"));
|
| file_thread_->StartWithOptions(
|
| base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0));
|
| }
|
| return file_thread_.get();
|
| }
|
|
|
| + void set_transport_security_persister(
|
| + scoped_ptr<TransportSecurityPersister> transport_security_persister) {
|
| + transport_security_persister = transport_security_persister.Pass();
|
| + }
|
| +
|
| protected:
|
| virtual ~BasicURLRequestContext() {}
|
|
|
| private:
|
| + // Threads should be torn down last.
|
| scoped_ptr<base::Thread> cache_thread_;
|
| scoped_ptr<base::Thread> file_thread_;
|
| +
|
| URLRequestContextStorage storage_;
|
| + scoped_ptr<TransportSecurityPersister> transport_security_persister_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(BasicURLRequestContext);
|
| };
|
|
|
| @@ -205,9 +219,14 @@ URLRequestContextBuilder::URLRequestContextBuilder()
|
|
|
| URLRequestContextBuilder::~URLRequestContextBuilder() {}
|
|
|
| -void URLRequestContextBuilder::set_proxy_config_service(
|
| - ProxyConfigService* proxy_config_service) {
|
| - proxy_config_service_.reset(proxy_config_service);
|
| +void URLRequestContextBuilder::EnableHttpCache(const HttpCacheParams& params) {
|
| + http_cache_enabled_ = true;
|
| + http_cache_params_ = params;
|
| +}
|
| +
|
| +void URLRequestContextBuilder::DisableHttpCache() {
|
| + http_cache_enabled_ = false;
|
| + http_cache_params_ = HttpCacheParams();
|
| }
|
|
|
| void URLRequestContextBuilder::SetSpdyAndQuicEnabled(bool spdy_enabled,
|
| @@ -228,32 +247,42 @@ URLRequestContext* URLRequestContextBuilder::Build() {
|
| NetworkDelegate* network_delegate = network_delegate_.release();
|
| storage->set_network_delegate(network_delegate);
|
|
|
| - if (!host_resolver_)
|
| - host_resolver_ = net::HostResolver::CreateDefaultResolver(NULL);
|
| - storage->set_host_resolver(host_resolver_.Pass());
|
| + if (net_log_) {
|
| + storage->set_net_log(net_log_.release());
|
| + } else {
|
| + storage->set_net_log(new net::NetLog);
|
| + }
|
|
|
| - storage->set_net_log(new net::NetLog);
|
| + if (!host_resolver_) {
|
| + host_resolver_ = net::HostResolver::CreateDefaultResolver(
|
| + context->net_log());
|
| + }
|
| + storage->set_host_resolver(host_resolver_.Pass());
|
|
|
| - // TODO(willchan): Switch to using this code when
|
| - // ProxyService::CreateSystemProxyConfigService()'s signature doesn't suck.
|
| -#if defined(OS_LINUX) || defined(OS_ANDROID)
|
| - ProxyConfigService* proxy_config_service = proxy_config_service_.release();
|
| -#else
|
| - ProxyConfigService* proxy_config_service = NULL;
|
| - if (proxy_config_service_) {
|
| - proxy_config_service = proxy_config_service_.release();
|
| - } else {
|
| - proxy_config_service =
|
| - ProxyService::CreateSystemProxyConfigService(
|
| - base::ThreadTaskRunnerHandle::Get().get(),
|
| - context->GetFileThread()->message_loop());
|
| + if (!proxy_service_) {
|
| + // TODO(willchan): Switch to using this code when
|
| + // ProxyService::CreateSystemProxyConfigService()'s signature doesn't suck.
|
| + #if defined(OS_LINUX) || defined(OS_ANDROID)
|
| + ProxyConfigService* proxy_config_service = proxy_config_service_.release();
|
| + #else
|
| + ProxyConfigService* proxy_config_service = NULL;
|
| + if (proxy_config_service_) {
|
| + proxy_config_service = proxy_config_service_.release();
|
| + } else {
|
| + proxy_config_service =
|
| + ProxyService::CreateSystemProxyConfigService(
|
| + base::ThreadTaskRunnerHandle::Get().get(),
|
| + context->GetFileThread()->message_loop());
|
| + }
|
| + #endif // defined(OS_LINUX) || defined(OS_ANDROID)
|
| + proxy_service_.reset(
|
| + ProxyService::CreateUsingSystemProxyResolver(
|
| + proxy_config_service,
|
| + 0, // This results in using the default value.
|
| + context->net_log()));
|
| }
|
| -#endif // defined(OS_LINUX) || defined(OS_ANDROID)
|
| - storage->set_proxy_service(
|
| - ProxyService::CreateUsingSystemProxyResolver(
|
| - proxy_config_service,
|
| - 4, // TODO(willchan): Find a better constant somewhere.
|
| - context->net_log()));
|
| + storage->set_proxy_service(proxy_service_.release());
|
| +
|
| storage->set_ssl_config_service(new net::SSLConfigServiceDefaults);
|
| HttpAuthHandlerRegistryFactory* http_auth_handler_registry_factory =
|
| net::HttpAuthHandlerRegistryFactory::CreateDefault(
|
| @@ -265,12 +294,33 @@ URLRequestContext* URLRequestContextBuilder::Build() {
|
| }
|
| storage->set_http_auth_handler_factory(http_auth_handler_registry_factory);
|
| storage->set_cookie_store(new CookieMonster(NULL, NULL));
|
| +
|
| + // TODO(mmenke): This always creates a file thread, even when it ends up
|
| + // not being used. Consider lazily creating the thread.
|
| + storage->set_server_bound_cert_service(
|
| + new ServerBoundCertService(
|
| + new DefaultServerBoundCertStore(NULL),
|
| + context->GetFileThread()->message_loop_proxy()));
|
| +
|
| storage->set_transport_security_state(new net::TransportSecurityState());
|
| + if (!transport_security_persister_path_.empty()) {
|
| + context->set_transport_security_persister(
|
| + make_scoped_ptr<TransportSecurityPersister>(
|
| + new TransportSecurityPersister(
|
| + context->transport_security_state(),
|
| + transport_security_persister_path_,
|
| + context->GetFileThread()->message_loop_proxy(),
|
| + false)));
|
| + }
|
| +
|
| storage->set_http_server_properties(
|
| scoped_ptr<net::HttpServerProperties>(
|
| new net::HttpServerPropertiesImpl()));
|
| storage->set_cert_verifier(CertVerifier::CreateDefault());
|
|
|
| + if (throttling_enabled_)
|
| + storage->set_throttler_manager(new URLRequestThrottlerManager());
|
| +
|
| net::HttpNetworkSession::Params network_session_params;
|
| network_session_params.host_resolver = context->host_resolver();
|
| network_session_params.cert_verifier = context->cert_verifier();
|
|
|