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 "chrome/service/net/service_url_request_context.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/utsname.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/service_process.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_verifier.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h" 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_throttler_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copied from webkit/glue/user_agent.cc. We don't want to pull in a dependency 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on webkit/glue which also pulls in the renderer. Also our user-agent is 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// totally different from the user-agent used by the browser, just the 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OS-specific parts are common. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BuildOSCpuInfo() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string os_cpu; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 os_major_version = 0; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 os_minor_version = 0; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 os_bugfix_version = 0; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SysInfo::OperatingSystemVersionNumbers(&os_major_version, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &os_minor_version, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &os_bugfix_version); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should work on any Posix system. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct utsname unixinfo; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uname(&unixinfo); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cputype; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // special case for biarch systems 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(unixinfo.machine, "x86_64") == 0 && 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(void*) == sizeof(int32)) { // NOLINT 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cputype.assign("i686 (x86_64)"); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cputype.assign(unixinfo.machine); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringAppendF( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &os_cpu, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Windows NT %d.%d", 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_major_version, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_minor_version 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Intel Mac OS X %d_%d_%d", 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_major_version, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_minor_version, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_bugfix_version 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "CrOS %s %d.%d.%d", 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cputype.c_str(), // e.g. i686 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_major_version, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_minor_version, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_bugfix_version 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s %s", 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unixinfo.sysname, // e.g. Linux 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cputype.c_str() // e.g. i686 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); // NOLINT 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return os_cpu; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string MakeUserAgentForServiceProcess() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string user_agent; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo version_info; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!version_info.is_valid()) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Unable to create chrome::VersionInfo object"; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extra_version_info; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!version_info.IsOfficialBuild()) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_version_info = "-devel"; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringAppendF(&user_agent, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Chrome Service %s(%s)%s %s ", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version_info.Version().c_str(), 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version_info.LastChange().c_str(), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_version_info.c_str(), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildOSCpuInfo().c_str()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_agent; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ServiceURLRequestContext::ServiceURLRequestContext( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& user_agent, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ProxyConfigService* net_proxy_config_service) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : storage_(this) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_host_resolver(net::HostResolver::CreateDefaultResolver(NULL)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_proxy_service(net::ProxyService::CreateUsingSystemProxyResolver( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_proxy_config_service, 0u, NULL)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_cert_verifier(net::CertVerifier::CreateDefault()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_ssl_config_service(new net::SSLConfigServiceDefaults); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_http_auth_handler_factory( 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpAuthHandlerFactory::CreateDefault(host_resolver())); 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch storage_.set_http_server_properties( 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<net::HttpServerProperties>( 122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new net::HttpServerPropertiesImpl())); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_transport_security_state(new net::TransportSecurityState); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_throttler_manager(new net::URLRequestThrottlerManager); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession::Params session_params; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.host_resolver = host_resolver(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.cert_verifier = cert_verifier(); 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) session_params.transport_security_state = transport_security_state(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.proxy_service = proxy_service(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.ssl_config_service = ssl_config_service(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.http_auth_handler_factory = http_auth_handler_factory(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.http_server_properties = http_server_properties(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpNetworkSession> network_session( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::HttpNetworkSession(session_params)); 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) storage_.set_http_transaction_factory(new net::HttpCache( 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_session.get(), net::HttpCache::DefaultBackend::InMemory(0))); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In-memory cookie store. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_cookie_store(new net::CookieMonster(NULL, NULL)); 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) storage_.set_job_factory(new net::URLRequestJobFactoryImpl()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_http_user_agent_settings(new net::StaticHttpUserAgentSettings( 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "en-us,fr", user_agent)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ServiceURLRequestContext::~ServiceURLRequestContext() { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ServiceURLRequestContextGetter::ServiceURLRequestContextGetter() 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : network_task_runner_( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_service_process->io_thread()->message_loop_proxy()) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build the default user agent. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_agent_ = MakeUserAgentForServiceProcess(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sanjeevr): Change CreateSystemProxyConfigService to accept a 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MessageLoopProxy* instead of MessageLoop*. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(g_service_process); 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) proxy_config_service_.reset(net::ProxyService::CreateSystemProxyConfigService( 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) g_service_process->io_thread()->message_loop_proxy().get(), 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) g_service_process->file_thread()->message_loop())); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContext* 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ServiceURLRequestContextGetter::GetURLRequestContext() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url_request_context_.get()) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_request_context_.reset( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ServiceURLRequestContext(user_agent_, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_config_service_.release())); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url_request_context_.get(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<base::SingleThreadTaskRunner> 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ServiceURLRequestContextGetter::GetNetworkTaskRunner() const { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_task_runner_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ServiceURLRequestContextGetter::~ServiceURLRequestContextGetter() {} 177