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