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