url_request_context_factory.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/shell/browser/url_request_context_factory.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/macros.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/path_service.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/threading/worker_pool.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/shell/browser/cast_http_user_agent_settings.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_context.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/cookie_store_factory.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/content_switches.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/url_constants.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/cert/cert_verifier.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/cookies/cookie_store.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/dns/host_resolver.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_auth_handler_factory.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_cache.h" 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_network_layer.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_server_properties_impl.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_stream_factory.h" 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/ocsp/nss_ocsp.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/proxy/proxy_service.h" 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/socket/next_proto.h" 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/ssl/default_server_bound_cert_store.h" 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/ssl/server_bound_cert_service.h" 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/ssl/ssl_config_service_defaults.h" 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/data_protocol_handler.h" 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_context.h" 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_context_getter.h" 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_intercepting_job_factory.h" 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_job_factory_impl.h" 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace chromecast { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace shell { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kCookieStoreFile[] = "Cookies"; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Private classes to expose URLRequestContextGetter that call back to the 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// URLRequestContextFactory to create the URLRequestContext on demand. 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The URLRequestContextFactory::URLRequestContextGetter class is used for both 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// the system and media URLRequestCotnexts. 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass URLRequestContextFactory::URLRequestContextGetter 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : public net::URLRequestContextGetter { 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch URLRequestContextGetter(URLRequestContextFactory* factory, bool is_media) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : is_media_(is_media), 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_(factory) { 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE { 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!request_context_) { 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_media_) { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_context_.reset(factory_->CreateMediaRequestContext()); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_context_.reset(factory_->CreateSystemRequestContext()); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set request context used by NSS for Crl requests. 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::SetURLRequestContextForNSSHttpIO(request_context_.get()); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return request_context_.get(); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual scoped_refptr<base::SingleThreadTaskRunner> 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetNetworkTaskRunner() const OVERRIDE { 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return content::BrowserThread::GetMessageLoopProxyForThread( 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserThread::IO); 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~URLRequestContextGetter() {} 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool is_media_; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch URLRequestContextFactory* const factory_; 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLRequestContext> request_context_; 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(URLRequestContextGetter); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The URLRequestContextFactory::MainURLRequestContextGetter class is used for 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// the main URLRequestContext. 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass URLRequestContextFactory::MainURLRequestContextGetter 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : public net::URLRequestContextGetter { 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MainURLRequestContextGetter( 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch URLRequestContextFactory* factory, 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::ProtocolHandlerMap* protocol_handlers, 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::URLRequestInterceptorScopedVector request_interceptors) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : browser_context_(browser_context), 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_(factory), 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_interceptors_(request_interceptors.Pass()) { 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::swap(protocol_handlers_, *protocol_handlers); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE { 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!request_context_) { 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_context_.reset(factory_->CreateMainRequestContext( 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_context_, &protocol_handlers_, request_interceptors_.Pass())); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protocol_handlers_.clear(); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return request_context_.get(); 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual scoped_refptr<base::SingleThreadTaskRunner> 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetNetworkTaskRunner() const OVERRIDE { 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return content::BrowserThread::GetMessageLoopProxyForThread( 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserThread::IO); 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~MainURLRequestContextGetter() {} 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* const browser_context_; 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch URLRequestContextFactory* const factory_; 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::ProtocolHandlerMap protocol_handlers_; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::URLRequestInterceptorScopedVector request_interceptors_; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLRequestContext> request_context_; 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(MainURLRequestContextGetter); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 132116680a4aac90f2aa7413d9095a592090648e557Ben MurdochURLRequestContextFactory::URLRequestContextFactory() 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : system_dependencies_initialized_(false), 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_dependencies_initialized_(false), 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_dependencies_initialized_(false) { 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 138116680a4aac90f2aa7413d9095a592090648e557Ben MurdochURLRequestContextFactory::~URLRequestContextFactory() { 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid URLRequestContextFactory::InitializeOnUIThread() { 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Cast http user agent settings must be initialized in UI thread 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // because it registers itself to pref notification observer which is not 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // thread safe. 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_user_agent_settings_.reset(new CastHttpUserAgentSettings()); 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContextGetter* URLRequestContextFactory::CreateMainGetter( 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::ProtocolHandlerMap* protocol_handlers, 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::URLRequestInterceptorScopedVector request_interceptors) { 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!main_getter_) << "Main URLRequestContextGetter already initialized"; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_getter_ = new MainURLRequestContextGetter(this, 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_context, 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protocol_handlers, 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_interceptors.Pass()); 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return main_getter_.get(); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContextGetter* URLRequestContextFactory::GetMainGetter() { 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(main_getter_); 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return main_getter_.get(); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContextGetter* URLRequestContextFactory::GetSystemGetter() { 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!system_getter_) { 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_getter_ = new URLRequestContextGetter(this, false); 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return system_getter_.get(); 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContextGetter* URLRequestContextFactory::GetMediaGetter() { 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!media_getter_) { 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_getter_ = new URLRequestContextGetter(this, true); 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return media_getter_.get(); 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid URLRequestContextFactory::InitializeSystemContextDependencies() { 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (system_dependencies_initialized_) 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_resolver_ = net::HostResolver::CreateDefaultResolver(NULL); 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(lcwu): http://crbug.com/392352. For performance and security reasons, 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // a persistent (on-disk) HttpServerProperties and ServerBoundCertService 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // might be desirable in the future. 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch server_bound_cert_service_.reset(new net::ServerBoundCertService( 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new net::DefaultServerBoundCertStore(NULL), 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WorkerPool::GetTaskRunner(true))); 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cert_verifier_.reset(net::CertVerifier::CreateDefault()); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ssl_config_service_ = new net::SSLConfigServiceDefaults; 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch transport_security_state_.reset(new net::TransportSecurityState()); 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_auth_handler_factory_.reset( 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpAuthHandlerFactory::CreateDefault(host_resolver_.get())); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_server_properties_.reset(new net::HttpServerPropertiesImpl); 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch proxy_service_.reset(net::ProxyService::CreateUsingSystemProxyResolver( 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ProxyService::CreateSystemProxyConfigService( 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserThread::GetMessageLoopProxyForThread( 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserThread::IO).get(), 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserThread::UnsafeGetMessageLoopForThread( 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserThread::FILE)), 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NULL)); 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_dependencies_initialized_ = true; 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid URLRequestContextFactory::InitializeMainContextDependencies( 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpTransactionFactory* transaction_factory, 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::ProtocolHandlerMap* protocol_handlers, 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::URLRequestInterceptorScopedVector request_interceptors) { 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (main_dependencies_initialized_) 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_transaction_factory_.reset(transaction_factory); 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLRequestJobFactoryImpl> job_factory( 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new net::URLRequestJobFactoryImpl()); 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Keep ProtocolHandlers added in sync with 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // CastContentBrowserClient::IsHandledURL(). 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool set_protocol = false; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (content::ProtocolHandlerMap::iterator it = protocol_handlers->begin(); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch it != protocol_handlers->end(); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++it) { 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch set_protocol = job_factory->SetProtocolHandler( 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch it->first, it->second.release()); 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(set_protocol); 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch set_protocol = job_factory->SetProtocolHandler( 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url::kDataScheme, 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new net::DataProtocolHandler); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(set_protocol); 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set up interceptors in the reverse order. 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLRequestJobFactory> top_job_factory = 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch job_factory.PassAs<net::URLRequestJobFactory>(); 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (content::URLRequestInterceptorScopedVector::reverse_iterator i = 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_interceptors.rbegin(); 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch i != request_interceptors.rend(); 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++i) { 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch top_job_factory.reset(new net::URLRequestInterceptingJobFactory( 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch top_job_factory.Pass(), make_scoped_ptr(*i))); 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_interceptors.weak_clear(); 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_job_factory_.reset(top_job_factory.release()); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_dependencies_initialized_ = true; 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid URLRequestContextFactory::InitializeMediaContextDependencies( 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpTransactionFactory* transaction_factory) { 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (media_dependencies_initialized_) 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_transaction_factory_.reset(transaction_factory); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_dependencies_initialized_ = true; 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid URLRequestContextFactory::PopulateNetworkSessionParams( 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool ignore_certificate_errors, 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpNetworkSession::Params* params) { 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->host_resolver = host_resolver_.get(); 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->cert_verifier = cert_verifier_.get(); 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->server_bound_cert_service = server_bound_cert_service_.get(); 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->ssl_config_service = ssl_config_service_.get(); 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->transport_security_state = transport_security_state_.get(); 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->http_auth_handler_factory = http_auth_handler_factory_.get(); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->http_server_properties = http_server_properties_->GetWeakPtr(); 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->ignore_certificate_errors = ignore_certificate_errors; 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->proxy_service = proxy_service_.get(); 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(lcwu): http://crbug.com/329681. Remove this once spdy is enabled 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // by default at the content level. 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->next_protos = net::NextProtosSpdy31(); 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params->use_alternate_protocols = true; 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContext* URLRequestContextFactory::CreateSystemRequestContext() { 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeSystemContextDependencies(); 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpNetworkSession::Params system_params; 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PopulateNetworkSessionParams(false, &system_params); 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_transaction_factory_.reset(new net::HttpNetworkLayer( 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new net::HttpNetworkSession(system_params))); 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLRequestContext* system_context = new net::URLRequestContext(); 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_host_resolver(host_resolver_.get()); 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_server_bound_cert_service( 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch server_bound_cert_service_.get()); 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_cert_verifier(cert_verifier_.get()); 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_proxy_service(proxy_service_.get()); 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_ssl_config_service(ssl_config_service_.get()); 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_transport_security_state( 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch transport_security_state_.get()); 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_http_auth_handler_factory( 302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_auth_handler_factory_.get()); 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_http_server_properties( 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_server_properties_->GetWeakPtr()); 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_http_transaction_factory( 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_transaction_factory_.get()); 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_http_user_agent_settings( 308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_user_agent_settings_.get()); 309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch system_context->set_cookie_store( 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::CreateCookieStore(content::CookieStoreConfig())); 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return system_context; 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 314116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContext* URLRequestContextFactory::CreateMediaRequestContext() { 315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(main_getter_) 317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << "Getting MediaRequestContext before MainRequestContext"; 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLRequestContext* main_context = main_getter_->GetURLRequestContext(); 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set non caching backend. 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpNetworkSession* main_session = 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_transaction_factory_->GetSession(); 323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeMediaContextDependencies( 324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new net::HttpNetworkLayer(main_session)); 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLRequestContext* media_context = new net::URLRequestContext(); 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_context->CopyFrom(main_context); 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_context->set_http_transaction_factory( 329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media_transaction_factory_.get()); 330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return media_context; 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 333116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnet::URLRequestContext* URLRequestContextFactory::CreateMainRequestContext( 334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::ProtocolHandlerMap* protocol_handlers, 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::URLRequestInterceptorScopedVector request_interceptors) { 337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeSystemContextDependencies(); 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpCache::BackendFactory* main_backend = 341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpCache::DefaultBackend::InMemory(16 * 1024 * 1024); 342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool ignore_certificate_errors = false; 344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (cmd_line->HasSwitch(switches::kIgnoreCertificateErrors)) { 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ignore_certificate_errors = true; 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpNetworkSession::Params network_session_params; 349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PopulateNetworkSessionParams(ignore_certificate_errors, 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &network_session_params); 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeMainContextDependencies( 352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new net::HttpCache(network_session_params, main_backend), 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protocol_handlers, 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request_interceptors.Pass()); 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::CookieStoreConfig cookie_config( 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_context->GetPath().Append(kCookieStoreFile), 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::CookieStoreConfig::PERSISTANT_SESSION_COOKIES, 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NULL, NULL); 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cookie_config.background_task_runner = 361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<base::SequencedTaskRunner>(); 362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<net::CookieStore> cookie_store = 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::CreateCookieStore(cookie_config); 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLRequestContext* main_context = new net::URLRequestContext(); 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_host_resolver(host_resolver_.get()); 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_server_bound_cert_service( 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch server_bound_cert_service_.get()); 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_cert_verifier(cert_verifier_.get()); 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_proxy_service(proxy_service_.get()); 371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_ssl_config_service(ssl_config_service_.get()); 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_transport_security_state(transport_security_state_.get()); 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_http_auth_handler_factory( 374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_auth_handler_factory_.get()); 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_http_server_properties( 376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_server_properties_->GetWeakPtr()); 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_cookie_store(cookie_store.get()); 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_http_user_agent_settings( 379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_user_agent_settings_.get()); 380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_http_transaction_factory( 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_transaction_factory_.get()); 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_context->set_job_factory(main_job_factory_.get()); 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return main_context; 385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace shell 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace chromecast 389