Home | History | Annotate | Download | only in base
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "remoting/base/url_request_context.h"
      6 
      7 #include "base/message_loop/message_loop_proxy.h"
      8 #include "net/cert/cert_verifier.h"
      9 #include "net/dns/host_resolver.h"
     10 #include "net/http/http_auth_handler_factory.h"
     11 #include "net/http/http_network_layer.h"
     12 #include "net/http/http_network_session.h"
     13 #include "net/http/http_server_properties_impl.h"
     14 #include "net/http/transport_security_state.h"
     15 #include "net/proxy/proxy_config_service.h"
     16 #include "net/proxy/proxy_service.h"
     17 #include "net/ssl/ssl_config_service_defaults.h"
     18 #include "remoting/base/vlog_net_log.h"
     19 
     20 #if defined(OS_WIN)
     21 #include "net/proxy/proxy_config_service_win.h"
     22 #elif defined(OS_MACOSX)
     23 #include "net/proxy/proxy_config_service_mac.h"
     24 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
     25 #include "net/proxy/proxy_config_service_linux.h"
     26 #endif
     27 
     28 namespace remoting {
     29 
     30 namespace {
     31 
     32 // Config getter that always returns direct settings.
     33 class ProxyConfigServiceDirect : public net::ProxyConfigService {
     34  public:
     35   // ProxyConfigService implementation:
     36   virtual void AddObserver(Observer* observer) OVERRIDE {}
     37   virtual void RemoveObserver(Observer* observer) OVERRIDE {}
     38   virtual ConfigAvailability GetLatestProxyConfig(
     39       net::ProxyConfig* config) OVERRIDE {
     40     *config = net::ProxyConfig::CreateDirect();
     41     return CONFIG_VALID;
     42   }
     43 };
     44 
     45 net::ProxyConfigService* CreateSystemProxyConfigService(
     46     base::SingleThreadTaskRunner* ui_task_runner,
     47     base::SingleThreadTaskRunner* io_thread_task_runner) {
     48   DCHECK(ui_task_runner->BelongsToCurrentThread());
     49 
     50 #if defined(OS_WIN)
     51   return new net::ProxyConfigServiceWin();
     52 #elif defined(OS_MACOSX)
     53   return new net::ProxyConfigServiceMac(io_thread_task_runner);
     54 #elif defined(OS_CHROMEOS)
     55   NOTREACHED() << "ChromeOS is not a supported target for Chromoting host";
     56   return NULL;
     57 #elif defined(OS_LINUX)
     58   // TODO(sergeyu): Currently ProxyConfigServiceLinux depends on
     59   // base::OneShotTimer that doesn't work properly on main NPAPI
     60   // thread. Fix that and uncomment the code below.
     61   //
     62   // net::ProxyConfigServiceLinux* linux_config_service =
     63   //     new net::ProxyConfigServiceLinux();
     64   // linux_config_service->SetupAndFetchInitialConfig(
     65   //     ui_message_loop_, io_message_loop->message_loop_proxy(),
     66   //     file_message_loop);
     67 
     68   // return linux_config_service;
     69   return new ProxyConfigServiceDirect();
     70 #else
     71   LOG(WARNING) << "Failed to choose a system proxy settings fetcher "
     72                   "for this platform.";
     73   return new ProxyConfigServiceDirect();
     74 #endif
     75 }
     76 
     77 }  // namespace
     78 
     79 // TODO(willchan): This is largely copied from service_url_request_context.cc,
     80 // which is in turn copied from some test code. Move it somewhere reusable.
     81 URLRequestContext::URLRequestContext(
     82     scoped_ptr<net::ProxyConfigService> proxy_config_service)
     83     : storage_(this) {
     84   scoped_ptr<VlogNetLog> net_log(new VlogNetLog());
     85   storage_.set_host_resolver(
     86       net::HostResolver::CreateDefaultResolver(net_log.get()));
     87   storage_.set_proxy_service(net::ProxyService::CreateUsingSystemProxyResolver(
     88       proxy_config_service.release(), 0u, net_log.get()));
     89   storage_.set_cert_verifier(net::CertVerifier::CreateDefault());
     90   storage_.set_ssl_config_service(new net::SSLConfigServiceDefaults);
     91   storage_.set_http_auth_handler_factory(
     92       net::HttpAuthHandlerFactory::CreateDefault(host_resolver()));
     93   storage_.set_http_server_properties(
     94       scoped_ptr<net::HttpServerProperties>(
     95           new net::HttpServerPropertiesImpl()));
     96   storage_.set_transport_security_state(new net::TransportSecurityState);
     97 
     98   net::HttpNetworkSession::Params session_params;
     99   session_params.host_resolver = host_resolver();
    100   session_params.cert_verifier = cert_verifier();
    101   session_params.transport_security_state = transport_security_state();
    102   session_params.proxy_service = proxy_service();
    103   session_params.ssl_config_service = ssl_config_service();
    104   session_params.http_auth_handler_factory = http_auth_handler_factory();
    105   session_params.http_server_properties = http_server_properties();
    106   session_params.net_log = net_log.get();
    107   scoped_refptr<net::HttpNetworkSession> network_session(
    108       new net::HttpNetworkSession(session_params));
    109   storage_.set_http_transaction_factory(
    110       new net::HttpNetworkLayer(network_session.get()));
    111   storage_.set_net_log(net_log.release());
    112 }
    113 
    114 URLRequestContext::~URLRequestContext() {
    115 }
    116 
    117 URLRequestContextGetter::URLRequestContextGetter(
    118     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
    119     scoped_refptr<base::SingleThreadTaskRunner> network_task_runner)
    120     : network_task_runner_(network_task_runner) {
    121   proxy_config_service_.reset(CreateSystemProxyConfigService(
    122       ui_task_runner.get(), network_task_runner_.get()));
    123 }
    124 
    125 net::URLRequestContext* URLRequestContextGetter::GetURLRequestContext() {
    126   if (!url_request_context_.get()) {
    127     url_request_context_.reset(
    128         new URLRequestContext(proxy_config_service_.Pass()));
    129   }
    130   return url_request_context_.get();
    131 }
    132 
    133 scoped_refptr<base::SingleThreadTaskRunner>
    134 URLRequestContextGetter::GetNetworkTaskRunner() const {
    135   return network_task_runner_;
    136 }
    137 
    138 URLRequestContextGetter::~URLRequestContextGetter() {
    139 }
    140 
    141 }  // namespace remoting
    142