| Index: net/proxy/proxy_service.cc
|
| ===================================================================
|
| --- net/proxy/proxy_service.cc (revision 37149)
|
| +++ net/proxy/proxy_service.cc (working copy)
|
| @@ -157,16 +157,7 @@
|
| resolve_job_ = NULL;
|
| config_id_ = ProxyConfig::INVALID_ID;
|
|
|
| - // Notify the service of the completion.
|
| - service_->DidCompletePacRequest(results_->config_id_, result_code);
|
| -
|
| - // Clean up the results list.
|
| - if (result_code == OK)
|
| - results_->RemoveBadProxies(service_->proxy_retry_info_);
|
| -
|
| - LoadLog::EndEvent(load_log_, LoadLog::TYPE_PROXY_SERVICE);
|
| -
|
| - return result_code;
|
| + return service_->DidFinishResolvingProxy(results_, result_code, load_log_);
|
| }
|
|
|
| LoadLog* load_log() const { return load_log_; }
|
| @@ -210,7 +201,6 @@
|
| : config_service_(config_service),
|
| resolver_(resolver),
|
| next_config_id_(1),
|
| - config_is_bad_(false),
|
| should_use_proxy_resolver_(false),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(init_proxy_resolver_callback_(
|
| this, &ProxyService::OnInitProxyResolverComplete)) {
|
| @@ -280,10 +270,8 @@
|
| // using a direct connection, or when the config is bad.
|
| UpdateConfigIfOld();
|
| int rv = TryToCompleteSynchronously(url, result);
|
| - if (rv != ERR_IO_PENDING) {
|
| - LoadLog::EndEvent(load_log, LoadLog::TYPE_PROXY_SERVICE);
|
| - return rv;
|
| - }
|
| + if (rv != ERR_IO_PENDING)
|
| + return DidFinishResolvingProxy(result, rv, load_log);
|
|
|
| scoped_refptr<PacRequest> req =
|
| new PacRequest(this, url, result, callback, load_log);
|
| @@ -317,25 +305,14 @@
|
|
|
| DCHECK(config_.id() != ProxyConfig::INVALID_ID);
|
|
|
| - // Fallback to a "direct" (no proxy) connection if the current configuration
|
| - // is known to be bad.
|
| - if (config_is_bad_) {
|
| - // Reset this flag to false in case the ProxyInfo object is being
|
| - // re-used by the caller.
|
| - result->config_was_tried_ = false;
|
| - } else {
|
| - // Remember that we are trying to use the current proxy configuration.
|
| - result->config_was_tried_ = true;
|
| + if (should_use_proxy_resolver_ || IsInitializingProxyResolver()) {
|
| + // May need to go through ProxyResolver for this.
|
| + return ERR_IO_PENDING;
|
| + }
|
|
|
| - if (should_use_proxy_resolver_ || IsInitializingProxyResolver()) {
|
| - // May need to go through ProxyResolver for this.
|
| - return ERR_IO_PENDING;
|
| - }
|
| -
|
| - if (!config_.proxy_rules.empty()) {
|
| - ApplyProxyRules(url, config_.proxy_rules, result);
|
| - return OK;
|
| - }
|
| + if (!config_.proxy_rules.empty()) {
|
| + ApplyProxyRules(url, config_.proxy_rules, result);
|
| + return OK;
|
| }
|
|
|
| // otherwise, we have no proxy config
|
| @@ -454,12 +431,6 @@
|
| if (result->config_id_ != config_.id()) {
|
| // A new configuration!
|
| re_resolve = true;
|
| - } else if (!result->config_was_tried_) {
|
| - // We never tried the proxy configuration since we thought it was bad,
|
| - // but because we failed to establish a connection, let's try the proxy
|
| - // configuration again to see if it will work now.
|
| - config_is_bad_ = false;
|
| - re_resolve = true;
|
| }
|
| }
|
| if (re_resolve) {
|
| @@ -469,27 +440,13 @@
|
| return ResolveProxy(url, result, callback, pac_request, load_log);
|
| }
|
|
|
| - // We don't have new proxy settings to try, fallback to the next proxy
|
| + // We don't have new proxy settings to try, try to fallback to the next proxy
|
| // in the list.
|
| - bool was_direct = result->is_direct();
|
| - if (!was_direct && result->Fallback(&proxy_retry_info_))
|
| - return OK;
|
| + bool did_fallback = result->Fallback(&proxy_retry_info_);
|
|
|
| - // TODO(eroman): Hmm, this doesn't seem right. For starters just because
|
| - // auto_detect is true doesn't mean we are actually using it.
|
| - if (!config_.auto_detect && !config_.proxy_rules.empty()) {
|
| - // If auto detect is on, then we should try a DIRECT connection
|
| - // as the attempt to reach the proxy failed.
|
| - return ERR_FAILED;
|
| - }
|
| -
|
| - // If we already tried a direct connection, then just give up.
|
| - if (was_direct)
|
| - return ERR_FAILED;
|
| -
|
| - // Try going direct.
|
| - result->UseDirect();
|
| - return OK;
|
| + // Return synchronous failure if there is nothing left to fall-back to.
|
| + // TODO(eroman): This is a yucky API, clean it up.
|
| + return did_fallback ? OK : ERR_FAILED;
|
| }
|
|
|
| void ProxyService::CancelPacRequest(PacRequest* req) {
|
| @@ -511,6 +468,17 @@
|
| pending_requests_.erase(it);
|
| }
|
|
|
| +int ProxyService::DidFinishResolvingProxy(ProxyInfo* result,
|
| + int result_code,
|
| + LoadLog* load_log) {
|
| + // Clean up the results list.
|
| + if (result_code == OK)
|
| + result->DeprioritizeBadProxies(proxy_retry_info_);
|
| +
|
| + LoadLog::EndEvent(load_log, LoadLog::TYPE_PROXY_SERVICE);
|
| + return result_code;
|
| +}
|
| +
|
| void ProxyService::SetProxyScriptFetcher(
|
| ProxyScriptFetcher* proxy_script_fetcher) {
|
| proxy_script_fetcher_.reset(proxy_script_fetcher);
|
| @@ -527,18 +495,6 @@
|
| resolver_->PurgeMemory();
|
| }
|
|
|
| -void ProxyService::DidCompletePacRequest(int config_id, int result_code) {
|
| - // If we get an error that indicates a bad PAC config, then we should
|
| - // remember that, and not try the PAC config again for a while.
|
| -
|
| - // Our config may have already changed.
|
| - if (result_code == OK || config_id != config_.id())
|
| - return;
|
| -
|
| - // Remember that this configuration doesn't work.
|
| - config_is_bad_ = true;
|
| -}
|
| -
|
| // static
|
| ProxyConfigService* ProxyService::CreateSystemProxyConfigService(
|
| MessageLoop* io_loop, MessageLoop* file_loop) {
|
| @@ -613,7 +569,6 @@
|
| config_.set_id(next_config_id_++);
|
|
|
| // Reset state associated with latest config.
|
| - config_is_bad_ = false;
|
| proxy_retry_info_.clear();
|
|
|
| // Cancel any PAC fetching / ProxyResolver::SetPacScript() which was
|
|
|