Chromium Code Reviews| Index: net/proxy/init_proxy_resolver.cc |
| diff --git a/net/proxy/init_proxy_resolver.cc b/net/proxy/init_proxy_resolver.cc |
| index 90911688b2618340fc5272ca86a004b941280d10..48b2c8c686d6728cc0b243a5ea3cd2b0db57241a 100644 |
| --- a/net/proxy/init_proxy_resolver.cc |
| +++ b/net/proxy/init_proxy_resolver.cc |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -10,6 +10,8 @@ |
| #include "base/string_util.h" |
| #include "net/base/net_log.h" |
| #include "net/base/net_errors.h" |
| +#include "net/proxy/dhcp_proxy_script_fetcher.h" |
| +#include "net/proxy/dhcp_proxy_script_fetcher_factory.h" |
| #include "net/proxy/proxy_config.h" |
| #include "net/proxy/proxy_resolver.h" |
| #include "net/proxy/proxy_script_fetcher.h" |
| @@ -30,15 +32,16 @@ namespace net { |
| // http://code.google.com/p/chromium/issues/detail?id=18575#c20 |
| static const char kWpadUrl[] = "http://wpad/wpad.dat"; |
| -InitProxyResolver::InitProxyResolver(ProxyResolver* resolver, |
| - ProxyScriptFetcher* proxy_script_fetcher, |
| - NetLog* net_log) |
| +InitProxyResolver::InitProxyResolver( |
| + ProxyResolver* resolver, |
| + URLProxyScriptFetcher* proxy_script_fetcher, |
| + NetLog* net_log) |
| : resolver_(resolver), |
| proxy_script_fetcher_(proxy_script_fetcher), |
| ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_( |
| this, &InitProxyResolver::OnIOCompletion)), |
| user_callback_(NULL), |
| - current_pac_url_index_(0u), |
| + current_pac_source_index_(0u), |
| next_state_(STATE_NONE), |
| net_log_(BoundNetLog::Make( |
| net_log, NetLog::SOURCE_INIT_PROXY_RESOLVER)), |
| @@ -67,8 +70,8 @@ int InitProxyResolver::Init(const ProxyConfig& config, |
| effective_config_ = effective_config; |
| - pac_urls_ = BuildPacUrlsFallbackList(config); |
| - DCHECK(!pac_urls_.empty()); |
| + pac_sources_ = BuildPacSourcesFallbackList(config); |
| + DCHECK(!pac_sources_.empty()); |
| next_state_ = STATE_WAIT; |
| @@ -81,17 +84,26 @@ int InitProxyResolver::Init(const ProxyConfig& config, |
| return rv; |
| } |
| +DhcpProxyScriptFetcher* InitProxyResolver::ImplCreateDhcpProxyScriptFetcher( |
| + URLRequestContext* url_request_context) { |
| + return DhcpProxyScriptFetcherFactory::GetInstance()->Create( |
| + url_request_context); |
| +} |
| + |
| // Initialize the fallback rules. |
| -// (1) WPAD (DNS). |
| -// (2) Custom PAC URL. |
| -InitProxyResolver::UrlList InitProxyResolver::BuildPacUrlsFallbackList( |
| +// (1) WPAD (DHCP). |
| +// (2) WPAD (DNS). |
| +// (3) Custom PAC URL. |
| +InitProxyResolver::PacSourceList InitProxyResolver::BuildPacSourcesFallbackList( |
| const ProxyConfig& config) const { |
| - UrlList pac_urls; |
| - if (config.auto_detect()) |
| - pac_urls.push_back(PacURL(true, GURL())); |
| + PacSourceList pac_sources; |
| + if (config.auto_detect()) { |
| + pac_sources.push_back(PacSource(PacSource::WPAD_DHCP, GURL())); |
| + pac_sources.push_back(PacSource(PacSource::WPAD_DNS, GURL())); |
| + } |
| if (config.has_pac_url()) |
| - pac_urls.push_back(PacURL(false, config.pac_url())); |
| - return pac_urls; |
| + pac_sources.push_back(PacSource(PacSource::CUSTOM, config.pac_url())); |
| + return pac_sources; |
| } |
| void InitProxyResolver::OnIOCompletion(int result) { |
| @@ -174,24 +186,43 @@ int InitProxyResolver::DoFetchPacScript() { |
| next_state_ = STATE_FETCH_PAC_SCRIPT_COMPLETE; |
| - const PacURL& pac_url = current_pac_url(); |
| + const PacSource& pac_source = current_pac_source(); |
| - const GURL effective_pac_url = |
| - pac_url.auto_detect ? GURL(kWpadUrl) : pac_url.url; |
| + std::string source_field; |
|
eroman
2011/04/21 05:22:48
I suggest moving this code into a helper function.
Jói
2011/05/03 21:20:59
Done.
|
| + GURL effective_pac_url; |
| + switch (pac_source.type) { |
| + case PacSource::WPAD_DHCP: |
| + source_field = "WPAD DHCP"; |
| + break; |
| + case PacSource::WPAD_DNS: |
| + effective_pac_url = GURL(kWpadUrl); |
| + source_field = "WPAD DNS: "; |
| + source_field += effective_pac_url.possibly_invalid_spec(); |
| + break; |
| + case PacSource::CUSTOM: |
| + effective_pac_url = pac_source.url; |
| + source_field = "Custom PAC URL: "; |
| + source_field += effective_pac_url.possibly_invalid_spec(); |
| + break; |
| + } |
| net_log_.BeginEvent( |
| NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT, |
| - make_scoped_refptr(new NetLogStringParameter( |
| - "url", effective_pac_url.possibly_invalid_spec()))); |
| + make_scoped_refptr(new NetLogStringParameter("source", source_field))); |
| if (!proxy_script_fetcher_) { |
| net_log_.AddEvent(NetLog::TYPE_INIT_PROXY_RESOLVER_HAS_NO_FETCHER, NULL); |
| return ERR_UNEXPECTED; |
| } |
| - return proxy_script_fetcher_->Fetch(effective_pac_url, |
| - &pac_script_, |
| - &io_callback_); |
| + if (pac_source.type == PacSource::WPAD_DHCP) { |
| + dhcp_proxy_script_fetcher_.reset(ImplCreateDhcpProxyScriptFetcher( |
|
eroman
2011/04/21 05:22:48
Can this instead be a dependency to InitProxyResol
Jói
2011/05/03 21:20:59
Done.
|
| + proxy_script_fetcher_->GetRequestContext())); |
| + return dhcp_proxy_script_fetcher_->Fetch(&pac_script_, &io_callback_); |
| + } else { |
| + proxy_script_fetcher_->SetURL(effective_pac_url); |
|
eroman
2011/04/21 05:22:48
Why split off SetURL() as separate from Fetch() ?
Jói
2011/05/03 21:20:59
Reverted as discussed.
|
| + return proxy_script_fetcher_->Fetch(&pac_script_, &io_callback_); |
| + } |
| } |
| int InitProxyResolver::DoFetchPacScriptComplete(int result) { |
| @@ -200,7 +231,7 @@ int InitProxyResolver::DoFetchPacScriptComplete(int result) { |
| net_log_.EndEventWithNetErrorCode( |
| NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT, result); |
| if (result != OK) |
| - return TryToFallbackPacUrl(result); |
| + return TryToFallbackPacSource(result); |
| next_state_ = STATE_SET_PAC_SCRIPT; |
| return result; |
| @@ -209,7 +240,7 @@ int InitProxyResolver::DoFetchPacScriptComplete(int result) { |
| int InitProxyResolver::DoSetPacScript() { |
| net_log_.BeginEvent(NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT, NULL); |
| - const PacURL& pac_url = current_pac_url(); |
| + const PacSource& pac_source = current_pac_source(); |
| next_state_ = STATE_SET_PAC_SCRIPT_COMPLETE; |
| @@ -218,9 +249,9 @@ int InitProxyResolver::DoSetPacScript() { |
| if (resolver_->expects_pac_bytes()) { |
| script_data = ProxyResolverScriptData::FromUTF16(pac_script_); |
| } else { |
| - script_data = pac_url.auto_detect ? |
| - ProxyResolverScriptData::ForAutoDetect() : |
| - ProxyResolverScriptData::FromURL(pac_url.url); |
| + script_data = pac_source.type == PacSource::CUSTOM ? |
| + ProxyResolverScriptData::FromURL(pac_source.url) : |
| + ProxyResolverScriptData::ForAutoDetect(); |
| } |
| return resolver_->SetPacScript(script_data, &io_callback_); |
| @@ -230,38 +261,58 @@ int InitProxyResolver::DoSetPacScriptComplete(int result) { |
| net_log_.EndEventWithNetErrorCode( |
| NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT, result); |
| if (result != OK) |
| - return TryToFallbackPacUrl(result); |
| + return TryToFallbackPacSource(result); |
| // Let the caller know which automatic setting we ended up initializing the |
| // resolver for (there may have been multiple fallbacks to choose from.) |
| if (effective_config_) { |
| - if (current_pac_url().auto_detect && resolver_->expects_pac_bytes()) { |
| + if (current_pac_source().type == PacSource::CUSTOM) { |
| *effective_config_ = |
| - ProxyConfig::CreateFromCustomPacURL(GURL(kWpadUrl)); |
| - } else if (current_pac_url().auto_detect) { |
| - *effective_config_ = ProxyConfig::CreateAutoDetect(); |
| + ProxyConfig::CreateFromCustomPacURL(current_pac_source().url); |
| } else { |
| - *effective_config_ = |
| - ProxyConfig::CreateFromCustomPacURL(current_pac_url().url); |
| + if (resolver_->expects_pac_bytes()) { |
| + GURL auto_detected_url; |
| + |
| + switch (current_pac_source().type) { |
| + case PacSource::WPAD_DHCP: |
| + auto_detected_url = dhcp_proxy_script_fetcher_->GetPacURL(); |
| + break; |
| + |
| + case PacSource::WPAD_DNS: |
| + auto_detected_url = GURL(kWpadUrl); |
| + break; |
| + |
| + default: |
| + NOTREACHED(); |
| + } |
| + |
| + *effective_config_ = |
| + ProxyConfig::CreateFromCustomPacURL(auto_detected_url); |
| + } else { |
| + // The resolver does its own resolution so we cannot know the |
| + // URL. Just do the best we can and state that the configuration |
| + // is to auto-detect proxy settings. |
| + *effective_config_ = ProxyConfig::CreateAutoDetect(); |
| + } |
| } |
| } |
| return result; |
| } |
| -int InitProxyResolver::TryToFallbackPacUrl(int error) { |
| +int InitProxyResolver::TryToFallbackPacSource(int error) { |
| DCHECK_LT(error, 0); |
| - if (current_pac_url_index_ + 1 >= pac_urls_.size()) { |
| + if (current_pac_source_index_ + 1 >= pac_sources_.size()) { |
| // Nothing left to fall back to. |
| return error; |
| } |
| // Advance to next URL in our list. |
| - ++current_pac_url_index_; |
| + ++current_pac_source_index_; |
| net_log_.AddEvent( |
| - NetLog::TYPE_INIT_PROXY_RESOLVER_FALLING_BACK_TO_NEXT_PAC_URL, NULL); |
| + NetLog::TYPE_INIT_PROXY_RESOLVER_FALLING_BACK_TO_NEXT_PAC_SOURCE, NULL); |
| next_state_ = GetStartState(); |
| @@ -273,9 +324,10 @@ InitProxyResolver::State InitProxyResolver::GetStartState() const { |
| STATE_FETCH_PAC_SCRIPT : STATE_SET_PAC_SCRIPT; |
| } |
| -const InitProxyResolver::PacURL& InitProxyResolver::current_pac_url() const { |
| - DCHECK_LT(current_pac_url_index_, pac_urls_.size()); |
| - return pac_urls_[current_pac_url_index_]; |
| +const InitProxyResolver::PacSource& |
| + InitProxyResolver::current_pac_source() const { |
| + DCHECK_LT(current_pac_source_index_, pac_sources_.size()); |
| + return pac_sources_[current_pac_source_index_]; |
| } |
| void InitProxyResolver::OnWaitTimerFired() { |