summaryrefslogtreecommitdiffstats
path: root/net/proxy/proxy_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/proxy/proxy_service.cc')
-rw-r--r--net/proxy/proxy_service.cc70
1 files changed, 33 insertions, 37 deletions
diff --git a/net/proxy/proxy_service.cc b/net/proxy/proxy_service.cc
index 937d98f..40f4bd3 100644
--- a/net/proxy/proxy_service.cc
+++ b/net/proxy/proxy_service.cc
@@ -8,7 +8,6 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
-#include "base/string_tokenizer.h"
#include "base/string_util.h"
#include "googleurl/src/gurl.h"
#include "net/base/net_errors.h"
@@ -294,42 +293,7 @@ int ProxyService::TryToCompleteSynchronously(const GURL& url,
result->config_was_tried_ = true;
if (!config_.proxy_rules.empty()) {
- if (ShouldBypassProxyForURL(url)) {
- result->UseDirect();
- } else {
- // If proxies are specified on a per protocol basis, the proxy server
- // field contains a list the format of which is as below:-
- // "scheme1=url:port;scheme2=url:port", etc.
- std::string url_scheme = url.scheme();
-
- StringTokenizer proxy_server_list(config_.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()) {
- const std::string& proxy_server_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()) {
- result->UseNamedProxy(proxy_server_scheme);
- return OK;
- }
-
- if (proxy_server_scheme == url_scheme) {
- result->UseNamedProxy(proxy_server_for_scheme.token());
- return OK;
- }
- }
- }
- // We failed to find a matching proxy server for the current URL
- // scheme. Default to direct.
- result->UseDirect();
- }
+ ApplyProxyRules(url, config_.proxy_rules, result);
return OK;
}
@@ -351,6 +315,38 @@ int ProxyService::TryToCompleteSynchronously(const GURL& url,
return OK;
}
+void ProxyService::ApplyProxyRules(const GURL& url,
+ const ProxyConfig::ProxyRules& proxy_rules,
+ ProxyInfo* result) {
+ DCHECK(!proxy_rules.empty());
+
+ if (ShouldBypassProxyForURL(url)) {
+ result->UseDirect();
+ return;
+ }
+
+ switch (proxy_rules.type) {
+ case ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY:
+ result->UseProxyServer(proxy_rules.single_proxy);
+ break;
+ case ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME: {
+ const ProxyServer* entry = proxy_rules.MapSchemeToProxy(url.scheme());
+ if (entry) {
+ result->UseProxyServer(*entry);
+ } else {
+ // We failed to find a matching proxy server for the current URL
+ // scheme. Default to direct.
+ result->UseDirect();
+ }
+ break;
+ }
+ default:
+ result->UseDirect();
+ NOTREACHED();
+ break;
+ }
+}
+
void ProxyService::InitPacThread() {
if (!pac_thread_.get()) {
pac_thread_.reset(new base::Thread("pac-thread"));