OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/values.h" | |
12 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
13 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/values.h" |
14 #include "googleurl/src/gurl.h" | 14 #include "googleurl/src/gurl.h" |
| 15 #include "net/base/net_errors.h" |
15 #include "net/base/net_log.h" | 16 #include "net/base/net_log.h" |
16 #include "net/base/net_errors.h" | |
17 #include "net/base/net_util.h" | 17 #include "net/base/net_util.h" |
18 #include "net/proxy/init_proxy_resolver.h" | 18 #include "net/proxy/init_proxy_resolver.h" |
19 #include "net/proxy/multi_threaded_proxy_resolver.h" | 19 #include "net/proxy/multi_threaded_proxy_resolver.h" |
20 #include "net/proxy/proxy_config_service_fixed.h" | 20 #include "net/proxy/proxy_config_service_fixed.h" |
| 21 #include "net/proxy/proxy_resolver.h" |
| 22 #include "net/proxy/proxy_resolver_js_bindings.h" |
| 23 #include "net/proxy/proxy_resolver_v8.h" |
21 #include "net/proxy/proxy_script_fetcher.h" | 24 #include "net/proxy/proxy_script_fetcher.h" |
| 25 #include "net/proxy/sync_host_resolver_bridge.h" |
| 26 #include "net/url_request/url_request_context.h" |
| 27 |
22 #if defined(OS_WIN) | 28 #if defined(OS_WIN) |
23 #include "net/proxy/proxy_config_service_win.h" | 29 #include "net/proxy/proxy_config_service_win.h" |
24 #include "net/proxy/proxy_resolver_winhttp.h" | 30 #include "net/proxy/proxy_resolver_winhttp.h" |
25 #elif defined(OS_MACOSX) | 31 #elif defined(OS_MACOSX) |
26 #include "net/proxy/proxy_config_service_mac.h" | 32 #include "net/proxy/proxy_config_service_mac.h" |
27 #include "net/proxy/proxy_resolver_mac.h" | 33 #include "net/proxy/proxy_resolver_mac.h" |
28 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) | 34 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) |
29 #include "net/proxy/proxy_config_service_linux.h" | 35 #include "net/proxy/proxy_config_service_linux.h" |
30 #endif | 36 #endif |
31 #include "net/proxy/proxy_resolver.h" | |
32 #include "net/proxy/proxy_resolver_js_bindings.h" | |
33 #include "net/proxy/proxy_resolver_v8.h" | |
34 #include "net/proxy/sync_host_resolver_bridge.h" | |
35 #include "net/url_request/url_request_context.h" | |
36 | 37 |
37 using base::TimeDelta; | 38 using base::TimeDelta; |
38 using base::TimeTicks; | 39 using base::TimeTicks; |
39 | 40 |
40 namespace net { | 41 namespace net { |
41 | 42 |
42 namespace { | 43 namespace { |
43 | 44 |
44 const size_t kMaxNumNetLogEntries = 100; | 45 const size_t kMaxNumNetLogEntries = 100; |
45 const size_t kDefaultNumPacThreads = 4; | 46 const size_t kDefaultNumPacThreads = 4; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 // things. It is entirely possible that the value is insuficient for other | 83 // things. It is entirely possible that the value is insuficient for other |
83 // setups. | 84 // setups. |
84 const int64 kNumMillisToStallAfterNetworkChanges = 2000; | 85 const int64 kNumMillisToStallAfterNetworkChanges = 2000; |
85 | 86 |
86 // Config getter that always returns direct settings. | 87 // Config getter that always returns direct settings. |
87 class ProxyConfigServiceDirect : public ProxyConfigService { | 88 class ProxyConfigServiceDirect : public ProxyConfigService { |
88 public: | 89 public: |
89 // ProxyConfigService implementation: | 90 // ProxyConfigService implementation: |
90 virtual void AddObserver(Observer* observer) {} | 91 virtual void AddObserver(Observer* observer) {} |
91 virtual void RemoveObserver(Observer* observer) {} | 92 virtual void RemoveObserver(Observer* observer) {} |
92 virtual bool GetLatestProxyConfig(ProxyConfig* config) { | 93 virtual ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) { |
93 *config = ProxyConfig::CreateDirect(); | 94 *config = ProxyConfig::CreateDirect(); |
94 return true; | 95 return CONFIG_VALID; |
95 } | 96 } |
96 }; | 97 }; |
97 | 98 |
98 // Proxy resolver that fails every time. | 99 // Proxy resolver that fails every time. |
99 class ProxyResolverNull : public ProxyResolver { | 100 class ProxyResolverNull : public ProxyResolver { |
100 public: | 101 public: |
101 ProxyResolverNull() : ProxyResolver(false /*expects_pac_bytes*/) {} | 102 ProxyResolverNull() : ProxyResolver(false /*expects_pac_bytes*/) {} |
102 | 103 |
103 // ProxyResolver implementation: | 104 // ProxyResolver implementation: |
104 virtual int GetProxyForURL(const GURL& url, | 105 virtual int GetProxyForURL(const GURL& url, |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 return; | 621 return; |
621 } | 622 } |
622 | 623 |
623 // Otherwise we need to first fetch the configuration. | 624 // Otherwise we need to first fetch the configuration. |
624 current_state_ = STATE_WAITING_FOR_PROXY_CONFIG; | 625 current_state_ = STATE_WAITING_FOR_PROXY_CONFIG; |
625 | 626 |
626 // Retrieve the current proxy configuration from the ProxyConfigService. | 627 // Retrieve the current proxy configuration from the ProxyConfigService. |
627 // If a configuration is not available yet, we will get called back later | 628 // If a configuration is not available yet, we will get called back later |
628 // by our ProxyConfigService::Observer once it changes. | 629 // by our ProxyConfigService::Observer once it changes. |
629 ProxyConfig config; | 630 ProxyConfig config; |
630 bool has_config = config_service_->GetLatestProxyConfig(&config); | 631 ProxyConfigService::ConfigAvailability availability = |
631 if (has_config) | 632 config_service_->GetLatestProxyConfig(&config); |
632 OnProxyConfigChanged(config); | 633 if (availability != ProxyConfigService::CONFIG_PENDING) |
| 634 OnProxyConfigChanged(config, availability); |
633 } | 635 } |
634 | 636 |
635 void ProxyService::OnInitProxyResolverComplete(int result) { | 637 void ProxyService::OnInitProxyResolverComplete(int result) { |
636 DCHECK_EQ(STATE_WAITING_FOR_INIT_PROXY_RESOLVER, current_state_); | 638 DCHECK_EQ(STATE_WAITING_FOR_INIT_PROXY_RESOLVER, current_state_); |
637 DCHECK(init_proxy_resolver_.get()); | 639 DCHECK(init_proxy_resolver_.get()); |
638 DCHECK(fetched_config_.HasAutomaticSettings()); | 640 DCHECK(fetched_config_.HasAutomaticSettings()); |
639 init_proxy_resolver_.reset(); | 641 init_proxy_resolver_.reset(); |
640 | 642 |
641 if (result != OK) { | 643 if (result != OK) { |
642 VLOG(1) << "Failed configuring with PAC script, falling-back to manual " | 644 VLOG(1) << "Failed configuring with PAC script, falling-back to manual " |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 | 788 |
787 // static | 789 // static |
788 ProxyConfigService* ProxyService::CreateSystemProxyConfigService( | 790 ProxyConfigService* ProxyService::CreateSystemProxyConfigService( |
789 MessageLoop* io_loop, MessageLoop* file_loop) { | 791 MessageLoop* io_loop, MessageLoop* file_loop) { |
790 #if defined(OS_WIN) | 792 #if defined(OS_WIN) |
791 return new ProxyConfigServiceWin(); | 793 return new ProxyConfigServiceWin(); |
792 #elif defined(OS_MACOSX) | 794 #elif defined(OS_MACOSX) |
793 return new ProxyConfigServiceMac(io_loop); | 795 return new ProxyConfigServiceMac(io_loop); |
794 #elif defined(OS_CHROMEOS) | 796 #elif defined(OS_CHROMEOS) |
795 NOTREACHED() << "ProxyConfigService for ChromeOS should be created in " | 797 NOTREACHED() << "ProxyConfigService for ChromeOS should be created in " |
796 << "chrome_url_request_context.cc::CreateProxyConfigService."; | 798 << "profile_io_data.cc::CreateProxyConfigService."; |
797 return NULL; | 799 return NULL; |
798 #elif defined(OS_LINUX) | 800 #elif defined(OS_LINUX) |
799 ProxyConfigServiceLinux* linux_config_service | 801 ProxyConfigServiceLinux* linux_config_service = |
800 = new ProxyConfigServiceLinux(); | 802 new ProxyConfigServiceLinux(); |
801 | 803 |
802 // Assume we got called from the UI loop, which runs the default | 804 // Assume we got called from the UI loop, which runs the default |
803 // glib main loop, so the current thread is where we should be | 805 // glib main loop, so the current thread is where we should be |
804 // running gconf calls from. | 806 // running gconf calls from. |
805 MessageLoop* glib_default_loop = MessageLoopForUI::current(); | 807 MessageLoop* glib_default_loop = MessageLoopForUI::current(); |
806 | 808 |
807 // The file loop should be a MessageLoopForIO on Linux. | 809 // The file loop should be a MessageLoopForIO on Linux. |
808 DCHECK_EQ(MessageLoop::TYPE_IO, file_loop->type()); | 810 DCHECK_EQ(MessageLoop::TYPE_IO, file_loop->type()); |
809 | 811 |
810 // Synchronously fetch the current proxy config (since we are | 812 // Synchronously fetch the current proxy config (since we are |
811 // running on glib_default_loop). Additionally register for | 813 // running on glib_default_loop). Additionally register for |
812 // notifications (delivered in either |glib_default_loop| or | 814 // notifications (delivered in either |glib_default_loop| or |
813 // |file_loop|) to keep us updated when the proxy config changes. | 815 // |file_loop|) to keep us updated when the proxy config changes. |
814 linux_config_service->SetupAndFetchInitialConfig(glib_default_loop, io_loop, | 816 linux_config_service->SetupAndFetchInitialConfig(glib_default_loop, io_loop, |
815 static_cast<MessageLoopForIO*>(file_loop)); | 817 static_cast<MessageLoopForIO*>(file_loop)); |
816 | 818 |
817 return linux_config_service; | 819 return linux_config_service; |
818 #else | 820 #else |
819 LOG(WARNING) << "Failed to choose a system proxy settings fetcher " | 821 LOG(WARNING) << "Failed to choose a system proxy settings fetcher " |
820 "for this platform."; | 822 "for this platform."; |
821 return new ProxyConfigServiceNull(); | 823 return new ProxyConfigServiceNull(); |
822 #endif | 824 #endif |
823 } | 825 } |
824 | 826 |
825 void ProxyService::OnProxyConfigChanged(const ProxyConfig& config) { | 827 void ProxyService::OnProxyConfigChanged( |
| 828 const ProxyConfig& config, |
| 829 ProxyConfigService::ConfigAvailability availability) { |
| 830 // Retrieve the current proxy configuration from the ProxyConfigService. |
| 831 // If a configuration is not available yet, we will get called back later |
| 832 // by our ProxyConfigService::Observer once it changes. |
| 833 ProxyConfig effective_config; |
| 834 switch (availability) { |
| 835 case ProxyConfigService::CONFIG_PENDING: |
| 836 // ProxyConfigService implementors should never pass CONFIG_PENDING. |
| 837 NOTREACHED() << "Proxy config change with CONFIG_PENDING availability!"; |
| 838 return; |
| 839 case ProxyConfigService::CONFIG_VALID: |
| 840 effective_config = config; |
| 841 break; |
| 842 case ProxyConfigService::CONFIG_UNSET: |
| 843 effective_config = ProxyConfig::CreateDirect(); |
| 844 break; |
| 845 } |
| 846 |
826 // Emit the proxy settings change to the NetLog stream. | 847 // Emit the proxy settings change to the NetLog stream. |
827 if (net_log_) { | 848 if (net_log_) { |
828 scoped_refptr<NetLog::EventParameters> params( | 849 scoped_refptr<NetLog::EventParameters> params( |
829 new ProxyConfigChangedNetLogParam(fetched_config_, config)); | 850 new ProxyConfigChangedNetLogParam(fetched_config_, effective_config)); |
830 net_log_->AddEntry(net::NetLog::TYPE_PROXY_CONFIG_CHANGED, | 851 net_log_->AddEntry(net::NetLog::TYPE_PROXY_CONFIG_CHANGED, |
831 base::TimeTicks::Now(), | 852 base::TimeTicks::Now(), |
832 NetLog::Source(), | 853 NetLog::Source(), |
833 NetLog::PHASE_NONE, | 854 NetLog::PHASE_NONE, |
834 params); | 855 params); |
835 } | 856 } |
836 | 857 |
837 // Set the new configuration as the most recently fetched one. | 858 // Set the new configuration as the most recently fetched one. |
838 fetched_config_ = config; | 859 fetched_config_ = effective_config; |
839 fetched_config_.set_id(1); // Needed for a later DCHECK of is_valid(). | 860 fetched_config_.set_id(1); // Needed for a later DCHECK of is_valid(). |
840 | 861 |
841 InitializeUsingLastFetchedConfig(); | 862 InitializeUsingLastFetchedConfig(); |
842 } | 863 } |
843 | 864 |
844 void ProxyService::InitializeUsingLastFetchedConfig() { | 865 void ProxyService::InitializeUsingLastFetchedConfig() { |
845 ResetProxyConfig(false); | 866 ResetProxyConfig(false); |
846 | 867 |
847 DCHECK(fetched_config_.is_valid()); | 868 DCHECK(fetched_config_.is_valid()); |
848 | 869 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 OnCompletion(result_); | 964 OnCompletion(result_); |
944 } | 965 } |
945 } | 966 } |
946 | 967 |
947 void SyncProxyServiceHelper::OnCompletion(int rv) { | 968 void SyncProxyServiceHelper::OnCompletion(int rv) { |
948 result_ = rv; | 969 result_ = rv; |
949 event_.Signal(); | 970 event_.Signal(); |
950 } | 971 } |
951 | 972 |
952 } // namespace net | 973 } // namespace net |
OLD | NEW |