17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 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)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "remoting/base/url_request_context.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_verifier.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "remoting/base/vlog_net_log.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_win.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_mac.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_linux.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Config getter that always returns direct settings.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyConfigServiceDirect : public net::ProxyConfigService {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProxyConfigService implementation:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddObserver(Observer* observer) OVERRIDE {}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveObserver(Observer* observer) OVERRIDE {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ConfigAvailability GetLatestProxyConfig(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::ProxyConfig* config) OVERRIDE {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *config = net::ProxyConfig::CreateDirect();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CONFIG_VALID;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::ProxyConfigService* CreateSystemProxyConfigService(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* ui_task_runner,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* io_thread_task_runner) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(ui_task_runner->BelongsToCurrentThread());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new net::ProxyConfigServiceWin();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new net::ProxyConfigServiceMac(io_thread_task_runner);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "ChromeOS is not a supported target for Chromoting host";
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sergeyu): Currently ProxyConfigServiceLinux depends on
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // base::OneShotTimer that doesn't work properly on main NPAPI
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread. Fix that and uncomment the code below.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::ProxyConfigServiceLinux* linux_config_service =
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     new net::ProxyConfigServiceLinux();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // linux_config_service->SetupAndFetchInitialConfig(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     ui_message_loop_, io_message_loop->message_loop_proxy(),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     file_message_loop);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return linux_config_service;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ProxyConfigServiceDirect();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(WARNING) << "Failed to choose a system proxy settings fetcher "
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "for this platform.";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ProxyConfigServiceDirect();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(willchan): This is largely copied from service_url_request_context.cc,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which is in turn copied from some test code. Move it somewhere reusable.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContext::URLRequestContext(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::ProxyConfigService> proxy_config_service)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : storage_(this) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<VlogNetLog> net_log(new VlogNetLog());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_host_resolver(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostResolver::CreateDefaultResolver(net_log.get()));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_proxy_service(net::ProxyService::CreateUsingSystemProxyResolver(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy_config_service.release(), 0u, net_log.get()));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_cert_verifier(net::CertVerifier::CreateDefault());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_ssl_config_service(new net::SSLConfigServiceDefaults);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_http_auth_handler_factory(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HttpAuthHandlerFactory::CreateDefault(host_resolver()));
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  storage_.set_http_server_properties(
94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      scoped_ptr<net::HttpServerProperties>(
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          new net::HttpServerPropertiesImpl()));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_transport_security_state(new net::TransportSecurityState);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession::Params session_params;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.host_resolver = host_resolver();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.cert_verifier = cert_verifier();
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  session_params.transport_security_state = transport_security_state();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.proxy_service = proxy_service();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.ssl_config_service = ssl_config_service();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.http_auth_handler_factory = http_auth_handler_factory();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.http_server_properties = http_server_properties();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  session_params.net_log = net_log.get();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpNetworkSession> network_session(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpNetworkSession(session_params));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_http_transaction_factory(
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new net::HttpNetworkLayer(network_session.get()));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.set_net_log(net_log.release());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContext::~URLRequestContext() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextGetter::URLRequestContextGetter(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> network_task_runner)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : network_task_runner_(network_task_runner) {
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  proxy_config_service_.reset(CreateSystemProxyConfigService(
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ui_task_runner.get(), network_task_runner_.get()));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContext* URLRequestContextGetter::GetURLRequestContext() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url_request_context_.get()) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_request_context_.reset(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new URLRequestContext(proxy_config_service_.Pass()));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return url_request_context_.get();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<base::SingleThreadTaskRunner>
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextGetter::GetNetworkTaskRunner() const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return network_task_runner_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContextGetter::~URLRequestContextGetter() {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
142