| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/proxy/proxy_service.h" | 5 #include "net/proxy/proxy_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/bind.h" | 10 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 11 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 12 #include "base/location.h" | 13 #include "base/location.h" |
| 13 #include "base/logging.h" | 14 #include "base/logging.h" |
| 14 #include "base/macros.h" | 15 #include "base/macros.h" |
| 15 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
| 16 #include "base/metrics/histogram_macros.h" | 17 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 scoped_ptr<base::Value> NetLogProxyConfigChangedCallback( | 297 scoped_ptr<base::Value> NetLogProxyConfigChangedCallback( |
| 297 const ProxyConfig* old_config, | 298 const ProxyConfig* old_config, |
| 298 const ProxyConfig* new_config, | 299 const ProxyConfig* new_config, |
| 299 NetLogCaptureMode /* capture_mode */) { | 300 NetLogCaptureMode /* capture_mode */) { |
| 300 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 301 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 301 // The "old_config" is optional -- the first notification will not have | 302 // The "old_config" is optional -- the first notification will not have |
| 302 // any "previous" configuration. | 303 // any "previous" configuration. |
| 303 if (old_config->is_valid()) | 304 if (old_config->is_valid()) |
| 304 dict->Set("old_config", old_config->ToValue()); | 305 dict->Set("old_config", old_config->ToValue()); |
| 305 dict->Set("new_config", new_config->ToValue()); | 306 dict->Set("new_config", new_config->ToValue()); |
| 306 return dict.Pass(); | 307 return std::move(dict); |
| 307 } | 308 } |
| 308 | 309 |
| 309 scoped_ptr<base::Value> NetLogBadProxyListCallback( | 310 scoped_ptr<base::Value> NetLogBadProxyListCallback( |
| 310 const ProxyRetryInfoMap* retry_info, | 311 const ProxyRetryInfoMap* retry_info, |
| 311 NetLogCaptureMode /* capture_mode */) { | 312 NetLogCaptureMode /* capture_mode */) { |
| 312 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 313 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 313 base::ListValue* list = new base::ListValue(); | 314 base::ListValue* list = new base::ListValue(); |
| 314 | 315 |
| 315 for (ProxyRetryInfoMap::const_iterator iter = retry_info->begin(); | 316 for (ProxyRetryInfoMap::const_iterator iter = retry_info->begin(); |
| 316 iter != retry_info->end(); ++iter) { | 317 iter != retry_info->end(); ++iter) { |
| 317 list->Append(new base::StringValue(iter->first)); | 318 list->Append(new base::StringValue(iter->first)); |
| 318 } | 319 } |
| 319 dict->Set("bad_proxy_list", list); | 320 dict->Set("bad_proxy_list", list); |
| 320 return dict.Pass(); | 321 return std::move(dict); |
| 321 } | 322 } |
| 322 | 323 |
| 323 // Returns NetLog parameters on a successfuly proxy resolution. | 324 // Returns NetLog parameters on a successfuly proxy resolution. |
| 324 scoped_ptr<base::Value> NetLogFinishedResolvingProxyCallback( | 325 scoped_ptr<base::Value> NetLogFinishedResolvingProxyCallback( |
| 325 const ProxyInfo* result, | 326 const ProxyInfo* result, |
| 326 NetLogCaptureMode /* capture_mode */) { | 327 NetLogCaptureMode /* capture_mode */) { |
| 327 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 328 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 328 dict->SetString("pac_string", result->ToPacString()); | 329 dict->SetString("pac_string", result->ToPacString()); |
| 329 return dict.Pass(); | 330 return std::move(dict); |
| 330 } | 331 } |
| 331 | 332 |
| 332 #if defined(OS_CHROMEOS) | 333 #if defined(OS_CHROMEOS) |
| 333 class UnsetProxyConfigService : public ProxyConfigService { | 334 class UnsetProxyConfigService : public ProxyConfigService { |
| 334 public: | 335 public: |
| 335 UnsetProxyConfigService() {} | 336 UnsetProxyConfigService() {} |
| 336 ~UnsetProxyConfigService() override {} | 337 ~UnsetProxyConfigService() override {} |
| 337 | 338 |
| 338 void AddObserver(Observer* observer) override {} | 339 void AddObserver(Observer* observer) override {} |
| 339 void RemoveObserver(Observer* observer) override {} | 340 void RemoveObserver(Observer* observer) override {} |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 // Time when the request was created. Stored here rather than in |results_| | 917 // Time when the request was created. Stored here rather than in |results_| |
| 917 // because the time in |results_| will be cleared. | 918 // because the time in |results_| will be cleared. |
| 918 TimeTicks creation_time_; | 919 TimeTicks creation_time_; |
| 919 }; | 920 }; |
| 920 | 921 |
| 921 // ProxyService --------------------------------------------------------------- | 922 // ProxyService --------------------------------------------------------------- |
| 922 | 923 |
| 923 ProxyService::ProxyService(scoped_ptr<ProxyConfigService> config_service, | 924 ProxyService::ProxyService(scoped_ptr<ProxyConfigService> config_service, |
| 924 scoped_ptr<ProxyResolverFactory> resolver_factory, | 925 scoped_ptr<ProxyResolverFactory> resolver_factory, |
| 925 NetLog* net_log) | 926 NetLog* net_log) |
| 926 : resolver_factory_(resolver_factory.Pass()), | 927 : resolver_factory_(std::move(resolver_factory)), |
| 927 next_config_id_(1), | 928 next_config_id_(1), |
| 928 current_state_(STATE_NONE), | 929 current_state_(STATE_NONE), |
| 929 net_log_(net_log), | 930 net_log_(net_log), |
| 930 stall_proxy_auto_config_delay_( | 931 stall_proxy_auto_config_delay_( |
| 931 TimeDelta::FromMilliseconds(kDelayAfterNetworkChangesMs)), | 932 TimeDelta::FromMilliseconds(kDelayAfterNetworkChangesMs)), |
| 932 quick_check_enabled_(true) { | 933 quick_check_enabled_(true) { |
| 933 NetworkChangeNotifier::AddIPAddressObserver(this); | 934 NetworkChangeNotifier::AddIPAddressObserver(this); |
| 934 NetworkChangeNotifier::AddDNSObserver(this); | 935 NetworkChangeNotifier::AddDNSObserver(this); |
| 935 ResetConfigService(config_service.Pass()); | 936 ResetConfigService(std::move(config_service)); |
| 936 } | 937 } |
| 937 | 938 |
| 938 // static | 939 // static |
| 939 scoped_ptr<ProxyService> ProxyService::CreateUsingSystemProxyResolver( | 940 scoped_ptr<ProxyService> ProxyService::CreateUsingSystemProxyResolver( |
| 940 scoped_ptr<ProxyConfigService> proxy_config_service, | 941 scoped_ptr<ProxyConfigService> proxy_config_service, |
| 941 size_t num_pac_threads, | 942 size_t num_pac_threads, |
| 942 NetLog* net_log) { | 943 NetLog* net_log) { |
| 943 DCHECK(proxy_config_service); | 944 DCHECK(proxy_config_service); |
| 944 | 945 |
| 945 if (!ProxyResolverFactoryForSystem::IsSupported()) { | 946 if (!ProxyResolverFactoryForSystem::IsSupported()) { |
| 946 VLOG(1) << "PAC support disabled because there is no system implementation"; | 947 VLOG(1) << "PAC support disabled because there is no system implementation"; |
| 947 return CreateWithoutProxyResolver(proxy_config_service.Pass(), net_log); | 948 return CreateWithoutProxyResolver(std::move(proxy_config_service), net_log); |
| 948 } | 949 } |
| 949 | 950 |
| 950 if (num_pac_threads == 0) | 951 if (num_pac_threads == 0) |
| 951 num_pac_threads = kDefaultNumPacThreads; | 952 num_pac_threads = kDefaultNumPacThreads; |
| 952 | 953 |
| 953 return make_scoped_ptr(new ProxyService( | 954 return make_scoped_ptr(new ProxyService( |
| 954 proxy_config_service.Pass(), | 955 std::move(proxy_config_service), |
| 955 make_scoped_ptr(new ProxyResolverFactoryForSystem(num_pac_threads)), | 956 make_scoped_ptr(new ProxyResolverFactoryForSystem(num_pac_threads)), |
| 956 net_log)); | 957 net_log)); |
| 957 } | 958 } |
| 958 | 959 |
| 959 // static | 960 // static |
| 960 scoped_ptr<ProxyService> ProxyService::CreateWithoutProxyResolver( | 961 scoped_ptr<ProxyService> ProxyService::CreateWithoutProxyResolver( |
| 961 scoped_ptr<ProxyConfigService> proxy_config_service, | 962 scoped_ptr<ProxyConfigService> proxy_config_service, |
| 962 NetLog* net_log) { | 963 NetLog* net_log) { |
| 963 return make_scoped_ptr(new ProxyService( | 964 return make_scoped_ptr(new ProxyService( |
| 964 proxy_config_service.Pass(), | 965 std::move(proxy_config_service), |
| 965 make_scoped_ptr(new ProxyResolverFactoryForNullResolver), net_log)); | 966 make_scoped_ptr(new ProxyResolverFactoryForNullResolver), net_log)); |
| 966 } | 967 } |
| 967 | 968 |
| 968 // static | 969 // static |
| 969 scoped_ptr<ProxyService> ProxyService::CreateFixed(const ProxyConfig& pc) { | 970 scoped_ptr<ProxyService> ProxyService::CreateFixed(const ProxyConfig& pc) { |
| 970 // TODO(eroman): This isn't quite right, won't work if |pc| specifies | 971 // TODO(eroman): This isn't quite right, won't work if |pc| specifies |
| 971 // a PAC script. | 972 // a PAC script. |
| 972 return CreateUsingSystemProxyResolver( | 973 return CreateUsingSystemProxyResolver( |
| 973 make_scoped_ptr(new ProxyConfigServiceFixed(pc)), 0, NULL); | 974 make_scoped_ptr(new ProxyConfigServiceFixed(pc)), 0, NULL); |
| 974 } | 975 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 994 | 995 |
| 995 // static | 996 // static |
| 996 scoped_ptr<ProxyService> ProxyService::CreateFixedFromPacResult( | 997 scoped_ptr<ProxyService> ProxyService::CreateFixedFromPacResult( |
| 997 const std::string& pac_string) { | 998 const std::string& pac_string) { |
| 998 // We need the settings to contain an "automatic" setting, otherwise the | 999 // We need the settings to contain an "automatic" setting, otherwise the |
| 999 // ProxyResolver dependency we give it will never be used. | 1000 // ProxyResolver dependency we give it will never be used. |
| 1000 scoped_ptr<ProxyConfigService> proxy_config_service( | 1001 scoped_ptr<ProxyConfigService> proxy_config_service( |
| 1001 new ProxyConfigServiceFixed(ProxyConfig::CreateAutoDetect())); | 1002 new ProxyConfigServiceFixed(ProxyConfig::CreateAutoDetect())); |
| 1002 | 1003 |
| 1003 return make_scoped_ptr(new ProxyService( | 1004 return make_scoped_ptr(new ProxyService( |
| 1004 proxy_config_service.Pass(), | 1005 std::move(proxy_config_service), |
| 1005 make_scoped_ptr(new ProxyResolverFactoryForPacResult(pac_string)), NULL)); | 1006 make_scoped_ptr(new ProxyResolverFactoryForPacResult(pac_string)), NULL)); |
| 1006 } | 1007 } |
| 1007 | 1008 |
| 1008 int ProxyService::ResolveProxy(const GURL& raw_url, | 1009 int ProxyService::ResolveProxy(const GURL& raw_url, |
| 1009 int load_flags, | 1010 int load_flags, |
| 1010 ProxyInfo* result, | 1011 ProxyInfo* result, |
| 1011 const CompletionCallback& callback, | 1012 const CompletionCallback& callback, |
| 1012 PacRequest** pac_request, | 1013 PacRequest** pac_request, |
| 1013 NetworkDelegate* network_delegate, | 1014 NetworkDelegate* network_delegate, |
| 1014 const BoundNetLog& net_log) { | 1015 const BoundNetLog& net_log) { |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1439 net_log.EndEvent(NetLog::TYPE_PROXY_SERVICE); | 1440 net_log.EndEvent(NetLog::TYPE_PROXY_SERVICE); |
| 1440 return result_code; | 1441 return result_code; |
| 1441 } | 1442 } |
| 1442 | 1443 |
| 1443 void ProxyService::SetProxyScriptFetchers( | 1444 void ProxyService::SetProxyScriptFetchers( |
| 1444 ProxyScriptFetcher* proxy_script_fetcher, | 1445 ProxyScriptFetcher* proxy_script_fetcher, |
| 1445 scoped_ptr<DhcpProxyScriptFetcher> dhcp_proxy_script_fetcher) { | 1446 scoped_ptr<DhcpProxyScriptFetcher> dhcp_proxy_script_fetcher) { |
| 1446 DCHECK(CalledOnValidThread()); | 1447 DCHECK(CalledOnValidThread()); |
| 1447 State previous_state = ResetProxyConfig(false); | 1448 State previous_state = ResetProxyConfig(false); |
| 1448 proxy_script_fetcher_.reset(proxy_script_fetcher); | 1449 proxy_script_fetcher_.reset(proxy_script_fetcher); |
| 1449 dhcp_proxy_script_fetcher_ = dhcp_proxy_script_fetcher.Pass(); | 1450 dhcp_proxy_script_fetcher_ = std::move(dhcp_proxy_script_fetcher); |
| 1450 if (previous_state != STATE_NONE) | 1451 if (previous_state != STATE_NONE) |
| 1451 ApplyProxyConfigIfAvailable(); | 1452 ApplyProxyConfigIfAvailable(); |
| 1452 } | 1453 } |
| 1453 | 1454 |
| 1454 ProxyScriptFetcher* ProxyService::GetProxyScriptFetcher() const { | 1455 ProxyScriptFetcher* ProxyService::GetProxyScriptFetcher() const { |
| 1455 DCHECK(CalledOnValidThread()); | 1456 DCHECK(CalledOnValidThread()); |
| 1456 return proxy_script_fetcher_.get(); | 1457 return proxy_script_fetcher_.get(); |
| 1457 } | 1458 } |
| 1458 | 1459 |
| 1459 ProxyService::State ProxyService::ResetProxyConfig(bool reset_fetched_config) { | 1460 ProxyService::State ProxyService::ResetProxyConfig(bool reset_fetched_config) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1477 void ProxyService::ResetConfigService( | 1478 void ProxyService::ResetConfigService( |
| 1478 scoped_ptr<ProxyConfigService> new_proxy_config_service) { | 1479 scoped_ptr<ProxyConfigService> new_proxy_config_service) { |
| 1479 DCHECK(CalledOnValidThread()); | 1480 DCHECK(CalledOnValidThread()); |
| 1480 State previous_state = ResetProxyConfig(true); | 1481 State previous_state = ResetProxyConfig(true); |
| 1481 | 1482 |
| 1482 // Release the old configuration service. | 1483 // Release the old configuration service. |
| 1483 if (config_service_.get()) | 1484 if (config_service_.get()) |
| 1484 config_service_->RemoveObserver(this); | 1485 config_service_->RemoveObserver(this); |
| 1485 | 1486 |
| 1486 // Set the new configuration service. | 1487 // Set the new configuration service. |
| 1487 config_service_ = new_proxy_config_service.Pass(); | 1488 config_service_ = std::move(new_proxy_config_service); |
| 1488 config_service_->AddObserver(this); | 1489 config_service_->AddObserver(this); |
| 1489 | 1490 |
| 1490 if (previous_state != STATE_NONE) | 1491 if (previous_state != STATE_NONE) |
| 1491 ApplyProxyConfigIfAvailable(); | 1492 ApplyProxyConfigIfAvailable(); |
| 1492 } | 1493 } |
| 1493 | 1494 |
| 1494 void ProxyService::ForceReloadProxyConfig() { | 1495 void ProxyService::ForceReloadProxyConfig() { |
| 1495 DCHECK(CalledOnValidThread()); | 1496 DCHECK(CalledOnValidThread()); |
| 1496 ResetProxyConfig(false); | 1497 ResetProxyConfig(false); |
| 1497 ApplyProxyConfigIfAvailable(); | 1498 ApplyProxyConfigIfAvailable(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1522 scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner = | 1523 scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner = |
| 1523 base::ThreadTaskRunnerHandle::Get(); | 1524 base::ThreadTaskRunnerHandle::Get(); |
| 1524 | 1525 |
| 1525 // Synchronously fetch the current proxy config (since we are running on | 1526 // Synchronously fetch the current proxy config (since we are running on |
| 1526 // glib_default_loop). Additionally register for notifications (delivered in | 1527 // glib_default_loop). Additionally register for notifications (delivered in |
| 1527 // either |glib_default_loop| or |file_task_runner|) to keep us updated when | 1528 // either |glib_default_loop| or |file_task_runner|) to keep us updated when |
| 1528 // the proxy config changes. | 1529 // the proxy config changes. |
| 1529 linux_config_service->SetupAndFetchInitialConfig( | 1530 linux_config_service->SetupAndFetchInitialConfig( |
| 1530 glib_thread_task_runner, io_task_runner, file_task_runner); | 1531 glib_thread_task_runner, io_task_runner, file_task_runner); |
| 1531 | 1532 |
| 1532 return linux_config_service.Pass(); | 1533 return std::move(linux_config_service); |
| 1533 #elif defined(OS_ANDROID) | 1534 #elif defined(OS_ANDROID) |
| 1534 return make_scoped_ptr(new ProxyConfigServiceAndroid( | 1535 return make_scoped_ptr(new ProxyConfigServiceAndroid( |
| 1535 io_task_runner, base::ThreadTaskRunnerHandle::Get())); | 1536 io_task_runner, base::ThreadTaskRunnerHandle::Get())); |
| 1536 #else | 1537 #else |
| 1537 LOG(WARNING) << "Failed to choose a system proxy settings fetcher " | 1538 LOG(WARNING) << "Failed to choose a system proxy settings fetcher " |
| 1538 "for this platform."; | 1539 "for this platform."; |
| 1539 return make_scoped_ptr(new ProxyConfigServiceDirect()); | 1540 return make_scoped_ptr(new ProxyConfigServiceDirect()); |
| 1540 #endif | 1541 #endif |
| 1541 } | 1542 } |
| 1542 | 1543 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1648 State previous_state = ResetProxyConfig(false); | 1649 State previous_state = ResetProxyConfig(false); |
| 1649 if (previous_state != STATE_NONE) | 1650 if (previous_state != STATE_NONE) |
| 1650 ApplyProxyConfigIfAvailable(); | 1651 ApplyProxyConfigIfAvailable(); |
| 1651 } | 1652 } |
| 1652 | 1653 |
| 1653 void ProxyService::OnDNSChanged() { | 1654 void ProxyService::OnDNSChanged() { |
| 1654 OnIPAddressChanged(); | 1655 OnIPAddressChanged(); |
| 1655 } | 1656 } |
| 1656 | 1657 |
| 1657 } // namespace net | 1658 } // namespace net |
| OLD | NEW |