Index: net/proxy/proxy_config.cc |
=================================================================== |
--- net/proxy/proxy_config.cc (revision 12729) |
+++ net/proxy/proxy_config.cc (working copy) |
@@ -4,6 +4,9 @@ |
#include "net/proxy/proxy_config.h" |
+#include "base/string_tokenizer.h" |
+#include "base/string_util.h" |
+ |
namespace net { |
// static |
@@ -25,4 +28,55 @@ |
proxy_bypass_local_names == other.proxy_bypass_local_names; |
} |
+void ProxyConfig::ProxyRules::ParseFromString(const std::string& proxy_rules) { |
+ // Reset. |
+ type = TYPE_NO_RULES; |
+ single_proxy = ProxyServer(); |
+ proxy_for_http = ProxyServer(); |
+ proxy_for_https = ProxyServer(); |
+ proxy_for_ftp = ProxyServer(); |
+ |
+ StringTokenizer proxy_server_list(proxy_rules, ";"); |
+ while (proxy_server_list.GetNext()) { |
+ StringTokenizer proxy_server_for_scheme( |
+ proxy_server_list.token_begin(), proxy_server_list.token_end(), "="); |
+ |
+ while (proxy_server_for_scheme.GetNext()) { |
+ std::string url_scheme = proxy_server_for_scheme.token(); |
+ |
+ // If we fail to get the proxy server here, it means that |
+ // this is a regular proxy server configuration, i.e. proxies |
+ // are not configured per protocol. |
+ if (!proxy_server_for_scheme.GetNext()) { |
+ if (type == TYPE_PROXY_PER_SCHEME) |
+ continue; // Unexpected. |
+ single_proxy = ProxyServer::FromURI(url_scheme); |
+ type = TYPE_SINGLE_PROXY; |
+ return; |
+ } |
+ |
+ // Trim whitespace off the url scheme. |
+ TrimWhitespaceASCII(url_scheme, TRIM_ALL, &url_scheme); |
+ |
+ // Add it to the per-scheme mappings (if supported scheme). |
+ type = TYPE_PROXY_PER_SCHEME; |
+ if (const ProxyServer* entry = MapSchemeToProxy(url_scheme)) |
+ *const_cast<ProxyServer*>(entry) = |
+ ProxyServer::FromURI(proxy_server_for_scheme.token()); |
+ } |
+ } |
+} |
+ |
+const ProxyServer* ProxyConfig::ProxyRules::MapSchemeToProxy( |
+ const std::string& scheme) const { |
+ DCHECK(type == TYPE_PROXY_PER_SCHEME); |
+ if (scheme == "http") |
+ return &proxy_for_http; |
+ if (scheme == "https") |
+ return &proxy_for_https; |
+ if (scheme == "ftp") |
+ return &proxy_for_ftp; |
+ return NULL; // No mapping for this scheme. |
+} |
+ |
} // namespace net |