15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_builder.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/thread_task_runner_handle.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread.h" 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "net/base/cache_type.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_delegate.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_verifier.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_network_layer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/data_protocol_handler.h" 31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h" 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/ftp_protocol_handler.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_storage.h" 36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicNetworkDelegate : public NetworkDelegate { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicNetworkDelegate() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BasicNetworkDelegate() {} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeURLRequest(URLRequest* request, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) OVERRIDE { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSendHeaders(URLRequest* request, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) OVERRIDE { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSendHeaders(URLRequest* request, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers) OVERRIDE {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders>* override_response_headers) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBeforeRedirect(URLRequest* request, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_location) OVERRIDE {} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnResponseStarted(URLRequest* request) OVERRIDE {} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRawBytesRead(const URLRequest& request, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read) OVERRIDE {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompleted(URLRequest* request, bool started) OVERRIDE {} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLRequestDestroyed(URLRequest* request) OVERRIDE {} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPACScriptError(int line_number, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& error) OVERRIDE {} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) OVERRIDE { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanGetCookies(const URLRequest& request, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CookieList& cookie_list) OVERRIDE { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanSetCookie(const URLRequest& request, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOptions* options) OVERRIDE { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanAccessFile(const net::URLRequest& request, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) const OVERRIDE { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSocketStreamConnect( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketStream* stream, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRequestWaitStateChange(const URLRequest& request, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestWaitState state) OVERRIDE { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicURLRequestContext : public URLRequestContext { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicURLRequestContext() 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : cache_thread_("Cache Thread"), 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_("File Thread"), 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) storage_(this) {} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextStorage* storage() { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &storage_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartCacheThread() { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread_.StartWithOptions( 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> cache_message_loop_proxy() { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(cache_thread_.IsRunning()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cache_thread_.message_loop_proxy(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFileThread() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_.StartWithOptions( 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop* file_message_loop() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(file_thread_.IsRunning()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_thread_.message_loop(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BasicURLRequestContext() {} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread file_thread_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextStorage storage_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BasicURLRequestContext); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextBuilder::HttpCacheParams::HttpCacheParams() 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(IN_MEMORY), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_size(0) {} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextBuilder::HttpCacheParams::~HttpCacheParams() {} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextBuilder::HttpNetworkSessionParams::HttpNetworkSessionParams() 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ignore_certificate_errors(false), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_mapping_rules(NULL), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_pipelining_enabled(false), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_fixed_http_port(0), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_fixed_https_port(0), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trusted_spdy_proxy() {} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextBuilder::HttpNetworkSessionParams::~HttpNetworkSessionParams() 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextBuilder::URLRequestContextBuilder() 188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : data_enabled_(false), 189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) file_enabled_(false), 190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT) 191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ftp_enabled_(false), 192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_cache_enabled_(true) {} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextBuilder::~URLRequestContextBuilder() {} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestContextBuilder::set_proxy_config_service( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfigService* proxy_config_service) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_config_service_.reset(proxy_config_service); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) || defined(OS_ANDROID) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContext* URLRequestContextBuilder::Build() { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicURLRequestContext* context = new BasicURLRequestContext; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextStorage* storage = context->storage(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_http_user_agent_settings(new StaticHttpUserAgentSettings( 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accept_language_, user_agent_)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!network_delegate_) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_.reset(new BasicNetworkDelegate); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkDelegate* network_delegate = network_delegate_.release(); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage->set_network_delegate(network_delegate); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_host_resolver(net::HostResolver::CreateDefaultResolver(NULL)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->StartFileThread(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(willchan): Switch to using this code when 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProxyService::CreateSystemProxyConfigService()'s signature doesn't suck. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfigService* proxy_config_service = proxy_config_service_.release(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfigService* proxy_config_service = 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyService::CreateSystemProxyConfigService( 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::ThreadTaskRunnerHandle::Get().get(), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->file_message_loop()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) || defined(OS_ANDROID) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_proxy_service( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyService::CreateUsingSystemProxyResolver( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_config_service, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, // TODO(willchan): Find a better constant somewhere. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->net_log())); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_ssl_config_service(new net::SSLConfigServiceDefaults); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_http_auth_handler_factory( 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpAuthHandlerRegistryFactory::CreateDefault( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->host_resolver())); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_cookie_store(new CookieMonster(NULL, NULL)); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_transport_security_state(new net::TransportSecurityState()); 240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch storage->set_http_server_properties( 241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<net::HttpServerProperties>( 242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new net::HttpServerPropertiesImpl())); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_cert_verifier(CertVerifier::CreateDefault()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession::Params network_session_params; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.host_resolver = context->host_resolver(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.cert_verifier = context->cert_verifier(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.transport_security_state = 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->transport_security_state(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.proxy_service = context->proxy_service(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.ssl_config_service = 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->ssl_config_service(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.http_auth_handler_factory = 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->http_auth_handler_factory(); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_session_params.network_delegate = network_delegate; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.http_server_properties = 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->http_server_properties(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.net_log = context->net_log(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.ignore_certificate_errors = 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session_params_.ignore_certificate_errors; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.host_mapping_rules = 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session_params_.host_mapping_rules; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.http_pipelining_enabled = 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session_params_.http_pipelining_enabled; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.testing_fixed_http_port = 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session_params_.testing_fixed_http_port; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.testing_fixed_https_port = 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session_params_.testing_fixed_https_port; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.trusted_spdy_proxy = 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session_params_.trusted_spdy_proxy; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpTransactionFactory* http_transaction_factory = NULL; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (http_cache_enabled_) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params.server_bound_cert_service = 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->server_bound_cert_service(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpCache::BackendFactory* http_cache_backend = NULL; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (http_cache_params_.type == HttpCacheParams::DISK) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->StartCacheThread(); 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) http_cache_backend = new HttpCache::DefaultBackend( 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISK_CACHE, 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::CACHE_BACKEND_DEFAULT, 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) http_cache_params_.path, 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) http_cache_params_.max_size, 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) context->cache_message_loop_proxy().get()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_cache_backend = 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_transaction_factory = new HttpCache( 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_params, http_cache_backend); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpNetworkSession> network_session( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::HttpNetworkSession(network_session_params)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) http_transaction_factory = new HttpNetworkLayer(network_session.get()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage->set_http_transaction_factory(http_transaction_factory); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) URLRequestJobFactoryImpl* job_factory = new URLRequestJobFactoryImpl; 301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (data_enabled_) 302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory->SetProtocolHandler("data", new DataProtocolHandler); 303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (file_enabled_) 304b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory->SetProtocolHandler("file", new FileProtocolHandler); 305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT) 306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (ftp_enabled_) { 307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ftp_transaction_factory_.reset( 308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new FtpNetworkLayer(context->host_resolver())); 309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory->SetProtocolHandler("ftp", 310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new FtpProtocolHandler(ftp_transaction_factory_.get())); 311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) storage->set_job_factory(job_factory); 314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(willchan): Support sdch. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 321