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