| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 <gconf/gconf-client.h> | 7 #include <gconf/gconf-client.h> |
| 8 #include <gdk/gdk.h> | 8 #include <gdk/gdk.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 | 10 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 } | 107 } |
| 108 return false; | 108 return false; |
| 109 } | 109 } |
| 110 | 110 |
| 111 bool ProxyConfigServiceLinux::GetProxyFromEnvVar( | 111 bool ProxyConfigServiceLinux::GetProxyFromEnvVar( |
| 112 const char* variable, ProxyServer* result_server) { | 112 const char* variable, ProxyServer* result_server) { |
| 113 return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP, | 113 return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP, |
| 114 result_server); | 114 result_server); |
| 115 } | 115 } |
| 116 | 116 |
| 117 namespace { | |
| 118 | |
| 119 // Returns true if the given string represents an IP address. | |
| 120 bool IsIPAddress(const std::string& domain) { | |
| 121 // From GURL::HostIsIPAddress() | |
| 122 url_canon::RawCanonOutputT<char, 128> ignored_output; | |
| 123 url_parse::Component ignored_component; | |
| 124 url_parse::Component domain_comp(0, domain.size()); | |
| 125 return url_canon::CanonicalizeIPAddress(domain.c_str(), domain_comp, | |
| 126 &ignored_output, | |
| 127 &ignored_component); | |
| 128 } | |
| 129 | |
| 130 } // namespace | |
| 131 | |
| 132 void ProxyConfigServiceLinux::ParseNoProxyList(const std::string& no_proxy, | |
| 133 ProxyConfig* config) { | |
| 134 if (no_proxy.empty()) | |
| 135 return; | |
| 136 // Traditional semantics: | |
| 137 // A single "*" is specifically allowed and unproxies anything. | |
| 138 // "*" wildcards other than a single "*" entry are not universally | |
| 139 // supported. We will support them, as we get * wildcards for free | |
| 140 // (see MatchPattern() called from ProxyService::ShouldBypassProxyForURL()). | |
| 141 // no_proxy is a comma-separated list of <trailing_domain>[:<port>]. | |
| 142 // If no port is specified then any port matches. | |
| 143 // The historical definition has trailing_domain match using a simple | |
| 144 // string "endswith" test, so that the match need not correspond to a | |
| 145 // "." boundary. For example: "google.com" matches "igoogle.com" too. | |
| 146 // Seems like that could be confusing, but we'll obey tradition. | |
| 147 // IP CIDR patterns are supposed to be supported too. We intend | |
| 148 // to do this in proxy_service.cc, but it's currently a TODO. | |
| 149 // See: http://crbug.com/9835. | |
| 150 StringTokenizer no_proxy_list(no_proxy, ","); | |
| 151 while (no_proxy_list.GetNext()) { | |
| 152 std::string bypass_entry = no_proxy_list.token(); | |
| 153 TrimWhitespaceASCII(bypass_entry, TRIM_ALL, &bypass_entry); | |
| 154 if (bypass_entry.empty()) | |
| 155 continue; | |
| 156 if (bypass_entry.at(0) != '*') { | |
| 157 // Insert a wildcard * to obtain an endsWith match, unless the | |
| 158 // entry looks like it might be an IP or CIDR. | |
| 159 // First look for either a :<port> or CIDR mask length suffix. | |
| 160 std::string::const_iterator begin = bypass_entry.begin(); | |
| 161 std::string::const_iterator scan = bypass_entry.end() - 1; | |
| 162 while (scan > begin && IsAsciiDigit(*scan)) | |
| 163 --scan; | |
| 164 std::string potential_ip; | |
| 165 if (*scan == '/' || *scan == ':') | |
| 166 potential_ip = std::string(begin, scan - 1); | |
| 167 else | |
| 168 potential_ip = bypass_entry; | |
| 169 if (!IsIPAddress(potential_ip)) { | |
| 170 // Do insert a wildcard. | |
| 171 bypass_entry.insert(0, "*"); | |
| 172 } | |
| 173 // TODO(sdoyon): When CIDR matching is implemented in | |
| 174 // proxy_service.cc, consider making config->proxy_bypass more | |
| 175 // sophisticated to avoid parsing out the string on every | |
| 176 // request. | |
| 177 } | |
| 178 config->proxy_bypass.push_back(bypass_entry); | |
| 179 } | |
| 180 } | |
| 181 | |
| 182 bool ProxyConfigServiceLinux::GetConfigFromEnv(ProxyConfig* config) { | 117 bool ProxyConfigServiceLinux::GetConfigFromEnv(ProxyConfig* config) { |
| 183 // Check for automatic configuration first, in | 118 // Check for automatic configuration first, in |
| 184 // "auto_proxy". Possibly only the "environment_proxy" firefox | 119 // "auto_proxy". Possibly only the "environment_proxy" firefox |
| 185 // extension has ever used this, but it still sounds like a good | 120 // extension has ever used this, but it still sounds like a good |
| 186 // idea. | 121 // idea. |
| 187 std::string auto_proxy; | 122 std::string auto_proxy; |
| 188 if (env_var_getter_->Getenv("auto_proxy", &auto_proxy)) { | 123 if (env_var_getter_->Getenv("auto_proxy", &auto_proxy)) { |
| 189 if (auto_proxy.empty()) { | 124 if (auto_proxy.empty()) { |
| 190 // Defined and empty => autodetect | 125 // Defined and empty => autodetect |
| 191 config->auto_detect = true; | 126 config->auto_detect = true; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 // Look for the proxy bypass list. | 170 // Look for the proxy bypass list. |
| 236 std::string no_proxy; | 171 std::string no_proxy; |
| 237 env_var_getter_->Getenv("no_proxy", &no_proxy); | 172 env_var_getter_->Getenv("no_proxy", &no_proxy); |
| 238 if (config->proxy_rules.empty()) { | 173 if (config->proxy_rules.empty()) { |
| 239 // Having only "no_proxy" set, presumably to "*", makes it | 174 // Having only "no_proxy" set, presumably to "*", makes it |
| 240 // explicit that env vars do specify a configuration: having no | 175 // explicit that env vars do specify a configuration: having no |
| 241 // rules specified only means the user explicitly asks for direct | 176 // rules specified only means the user explicitly asks for direct |
| 242 // connections. | 177 // connections. |
| 243 return !no_proxy.empty(); | 178 return !no_proxy.empty(); |
| 244 } | 179 } |
| 245 ParseNoProxyList(no_proxy, config); | 180 config->ParseNoProxyList(no_proxy); |
| 246 return true; | 181 return true; |
| 247 } | 182 } |
| 248 | 183 |
| 249 namespace { | 184 namespace { |
| 250 | 185 |
| 251 class GConfSettingGetterImpl | 186 class GConfSettingGetterImpl |
| 252 : public ProxyConfigServiceLinux::GConfSettingGetter { | 187 : public ProxyConfigServiceLinux::GConfSettingGetter { |
| 253 public: | 188 public: |
| 254 GConfSettingGetterImpl() : client_(NULL) {} | 189 GConfSettingGetterImpl() : client_(NULL) {} |
| 255 virtual ~GConfSettingGetterImpl() { | 190 virtual ~GConfSettingGetterImpl() { |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 if (!ok) { | 485 if (!ok) { |
| 551 ok = GetConfigFromEnv(config); | 486 ok = GetConfigFromEnv(config); |
| 552 if (ok) | 487 if (ok) |
| 553 LOG(INFO) << "ProxyConfigServiceLinux: obtained proxy setting " | 488 LOG(INFO) << "ProxyConfigServiceLinux: obtained proxy setting " |
| 554 "from environment variables"; | 489 "from environment variables"; |
| 555 } | 490 } |
| 556 return ok ? OK : ERR_FAILED; | 491 return ok ? OK : ERR_FAILED; |
| 557 } | 492 } |
| 558 | 493 |
| 559 } // namespace net | 494 } // namespace net |
| OLD | NEW |