Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: net/proxy/proxy_config_service_linux.cc

Issue 10310179: Track sources of proxy settings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update copyright Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_config_service_linux.h" 5 #include "net/proxy/proxy_config_service_linux.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #if defined(USE_GCONF) 9 #if defined(USE_GCONF)
10 #include <gconf/gconf-client.h> 10 #include <gconf/gconf-client.h>
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 } 313 }
314 // Simulate a change to avoid possibly losing updates before this point. 314 // Simulate a change to avoid possibly losing updates before this point.
315 OnChangeNotification(); 315 OnChangeNotification();
316 return true; 316 return true;
317 } 317 }
318 318
319 virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE { 319 virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE {
320 return task_runner_; 320 return task_runner_;
321 } 321 }
322 322
323 virtual const char* GetDataSource() OVERRIDE { 323 virtual ProxyConfigSource GetConfigSource() OVERRIDE {
324 return "gconf"; 324 return PROXY_CONFIG_SOURCE_GCONF;
325 } 325 }
326 326
327 virtual bool GetString(StringSetting key, std::string* result) OVERRIDE { 327 virtual bool GetString(StringSetting key, std::string* result) OVERRIDE {
328 switch (key) { 328 switch (key) {
329 case PROXY_MODE: 329 case PROXY_MODE:
330 return GetStringByPath("/system/proxy/mode", result); 330 return GetStringByPath("/system/proxy/mode", result);
331 case PROXY_AUTOCONF_URL: 331 case PROXY_AUTOCONF_URL:
332 return GetStringByPath("/system/proxy/autoconfig_url", result); 332 return GetStringByPath("/system/proxy/autoconfig_url", result);
333 case PROXY_HTTP_HOST: 333 case PROXY_HTTP_HOST:
334 return GetStringByPath("/system/http_proxy/host", result); 334 return GetStringByPath("/system/http_proxy/host", result);
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 G_CALLBACK(OnGSettingsChangeNotification), this); 630 G_CALLBACK(OnGSettingsChangeNotification), this);
631 // Simulate a change to avoid possibly losing updates before this point. 631 // Simulate a change to avoid possibly losing updates before this point.
632 OnChangeNotification(); 632 OnChangeNotification();
633 return true; 633 return true;
634 } 634 }
635 635
636 virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE { 636 virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE {
637 return task_runner_; 637 return task_runner_;
638 } 638 }
639 639
640 virtual const char* GetDataSource() OVERRIDE { 640 virtual ProxyConfigSource GetConfigSource() OVERRIDE {
641 return "gsettings"; 641 return PROXY_CONFIG_SOURCE_GSETTINGS;
642 } 642 }
643 643
644 virtual bool GetString(StringSetting key, std::string* result) OVERRIDE { 644 virtual bool GetString(StringSetting key, std::string* result) OVERRIDE {
645 DCHECK(client_); 645 DCHECK(client_);
646 switch (key) { 646 switch (key) {
647 case PROXY_MODE: 647 case PROXY_MODE:
648 return GetStringByPath(client_, "mode", result); 648 return GetStringByPath(client_, "mode", result);
649 case PROXY_AUTOCONF_URL: 649 case PROXY_AUTOCONF_URL:
650 return GetStringByPath(client_, "autoconfig-url", result); 650 return GetStringByPath(client_, "autoconfig-url", result);
651 case PROXY_HTTP_HOST: 651 case PROXY_HTTP_HOST:
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 // Implement base::MessagePumpLibevent::Watcher. 1038 // Implement base::MessagePumpLibevent::Watcher.
1039 void OnFileCanReadWithoutBlocking(int fd) { 1039 void OnFileCanReadWithoutBlocking(int fd) {
1040 DCHECK_EQ(fd, inotify_fd_); 1040 DCHECK_EQ(fd, inotify_fd_);
1041 DCHECK(MessageLoop::current() == file_loop_); 1041 DCHECK(MessageLoop::current() == file_loop_);
1042 OnChangeNotification(); 1042 OnChangeNotification();
1043 } 1043 }
1044 void OnFileCanWriteWithoutBlocking(int fd) { 1044 void OnFileCanWriteWithoutBlocking(int fd) {
1045 NOTREACHED(); 1045 NOTREACHED();
1046 } 1046 }
1047 1047
1048 virtual const char* GetDataSource() OVERRIDE { 1048 virtual ProxyConfigSource GetConfigSource() OVERRIDE {
1049 return "KDE"; 1049 return PROXY_CONFIG_SOURCE_KDE;
1050 } 1050 }
1051 1051
1052 virtual bool GetString(StringSetting key, std::string* result) OVERRIDE { 1052 virtual bool GetString(StringSetting key, std::string* result) OVERRIDE {
1053 string_map_type::iterator it = string_table_.find(key); 1053 string_map_type::iterator it = string_table_.find(key);
1054 if (it == string_table_.end()) 1054 if (it == string_table_.end())
1055 return false; 1055 return false;
1056 *result = it->second; 1056 *result = it->second;
1057 return true; 1057 return true;
1058 } 1058 }
1059 virtual bool GetBool(BoolSetting key, bool* result) OVERRIDE { 1059 virtual bool GetBool(BoolSetting key, bool* result) OVERRIDE {
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1627 // and only fall back to gconf if env vars were unset. But 1627 // and only fall back to gconf if env vars were unset. But
1628 // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it 1628 // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it
1629 // does so even if the proxy mode is set to auto, which would 1629 // does so even if the proxy mode is set to auto, which would
1630 // mislead us. 1630 // mislead us.
1631 1631
1632 bool got_config = false; 1632 bool got_config = false;
1633 if (setting_getter_.get() && 1633 if (setting_getter_.get() &&
1634 setting_getter_->Init(glib_thread_task_runner, file_loop) && 1634 setting_getter_->Init(glib_thread_task_runner, file_loop) &&
1635 GetConfigFromSettings(&cached_config_)) { 1635 GetConfigFromSettings(&cached_config_)) {
1636 cached_config_.set_id(1); // Mark it as valid. 1636 cached_config_.set_id(1); // Mark it as valid.
1637 cached_config_.set_source(setting_getter_->GetConfigSource());
1637 VLOG(1) << "Obtained proxy settings from " 1638 VLOG(1) << "Obtained proxy settings from "
1638 << setting_getter_->GetDataSource(); 1639 << ProxyConfigSourceToString(cached_config_.source());
1639 1640
1640 // If gconf proxy mode is "none", meaning direct, then we take 1641 // If gconf proxy mode is "none", meaning direct, then we take
1641 // that to be a valid config and will not check environment 1642 // that to be a valid config and will not check environment
1642 // variables. The alternative would have been to look for a proxy 1643 // variables. The alternative would have been to look for a proxy
1643 // whereever we can find one. 1644 // whereever we can find one.
1644 got_config = true; 1645 got_config = true;
1645 1646
1646 // Keep a copy of the config for use from this thread for 1647 // Keep a copy of the config for use from this thread for
1647 // comparison with updated settings when we get notifications. 1648 // comparison with updated settings when we get notifications.
1648 reference_config_ = cached_config_; 1649 reference_config_ = cached_config_;
(...skipping 19 matching lines...) Expand all
1668 } 1669 }
1669 } 1670 }
1670 } 1671 }
1671 1672
1672 if (!got_config) { 1673 if (!got_config) {
1673 // We fall back on environment variables. 1674 // We fall back on environment variables.
1674 // 1675 //
1675 // Consulting environment variables doesn't need to be done from the 1676 // Consulting environment variables doesn't need to be done from the
1676 // default glib main loop, but it's a tiny enough amount of work. 1677 // default glib main loop, but it's a tiny enough amount of work.
1677 if (GetConfigFromEnv(&cached_config_)) { 1678 if (GetConfigFromEnv(&cached_config_)) {
1679 cached_config_.set_source(PROXY_CONFIG_SOURCE_ENV);
1678 cached_config_.set_id(1); // Mark it as valid. 1680 cached_config_.set_id(1); // Mark it as valid.
1679 VLOG(1) << "Obtained proxy settings from environment variables"; 1681 VLOG(1) << "Obtained proxy settings from environment variables";
1680 } 1682 }
1681 } 1683 }
1682 } 1684 }
1683 1685
1684 // Depending on the SettingGetter in use, this method will be called 1686 // Depending on the SettingGetter in use, this method will be called
1685 // on either the UI thread (GConf) or the file thread (KDE). 1687 // on either the UI thread (GConf) or the file thread (KDE).
1686 void ProxyConfigServiceLinux::Delegate::SetUpNotifications() { 1688 void ProxyConfigServiceLinux::Delegate::SetUpNotifications() {
1687 scoped_refptr<base::SingleThreadTaskRunner> required_loop = 1689 scoped_refptr<base::SingleThreadTaskRunner> required_loop =
(...skipping 13 matching lines...) Expand all
1701 1703
1702 ProxyConfigService::ConfigAvailability 1704 ProxyConfigService::ConfigAvailability
1703 ProxyConfigServiceLinux::Delegate::GetLatestProxyConfig( 1705 ProxyConfigServiceLinux::Delegate::GetLatestProxyConfig(
1704 ProxyConfig* config) { 1706 ProxyConfig* config) {
1705 // This is called from the IO thread. 1707 // This is called from the IO thread.
1706 DCHECK(!io_thread_task_runner_ || 1708 DCHECK(!io_thread_task_runner_ ||
1707 io_thread_task_runner_->BelongsToCurrentThread()); 1709 io_thread_task_runner_->BelongsToCurrentThread());
1708 1710
1709 // Simply return the last proxy configuration that glib_default_loop 1711 // Simply return the last proxy configuration that glib_default_loop
1710 // notified us of. 1712 // notified us of.
1711 *config = cached_config_.is_valid() ? 1713 if (cached_config_.is_valid()) {
1712 cached_config_ : ProxyConfig::CreateDirect(); 1714 *config = cached_config_;
1715 } else {
1716 *config = ProxyConfig::CreateDirect();
1717 config->set_source(PROXY_CONFIG_SOURCE_SYSTEM_FAILED);
1718 }
1713 1719
1714 // We return CONFIG_VALID to indicate that *config was filled in. It is always 1720 // We return CONFIG_VALID to indicate that *config was filled in. It is always
1715 // going to be available since we initialized eagerly on the UI thread. 1721 // going to be available since we initialized eagerly on the UI thread.
1716 // TODO(eroman): do lazy initialization instead, so we no longer need 1722 // TODO(eroman): do lazy initialization instead, so we no longer need
1717 // to construct ProxyConfigServiceLinux on the UI thread. 1723 // to construct ProxyConfigServiceLinux on the UI thread.
1718 // In which case, we may return false here. 1724 // In which case, we may return false here.
1719 return CONFIG_VALID; 1725 return CONFIG_VALID;
1720 } 1726 }
1721 1727
1722 // Depending on the SettingGetter in use, this method will be called 1728 // Depending on the SettingGetter in use, this method will be called
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1803 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) { 1809 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) {
1804 delegate_->RemoveObserver(observer); 1810 delegate_->RemoveObserver(observer);
1805 } 1811 }
1806 1812
1807 ProxyConfigService::ConfigAvailability 1813 ProxyConfigService::ConfigAvailability
1808 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) { 1814 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) {
1809 return delegate_->GetLatestProxyConfig(config); 1815 return delegate_->GetLatestProxyConfig(config);
1810 } 1816 }
1811 1817
1812 } // namespace net 1818 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698