diff options
author | joaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-13 13:09:42 +0000 |
---|---|---|
committer | joaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-13 13:09:42 +0000 |
commit | a0974cac36f01c70f63f09e8b4c2cbf8dc9bd3c2 (patch) | |
tree | b209c4591da063890759a30707c9dce3220b353e /chrome/browser/policy/device_management_service.cc | |
parent | 7fb0d58958805925537b7f39b71f1bb9327bbfa7 (diff) | |
download | chromium_src-a0974cac36f01c70f63f09e8b4c2cbf8dc9bd3c2.zip chromium_src-a0974cac36f01c70f63f09e8b4c2cbf8dc9bd3c2.tar.gz chromium_src-a0974cac36f01c70f63f09e8b4c2cbf8dc9bd3c2.tar.bz2 |
Retry contacting the dmserver if the first attempt failed due to a misconfigured proxy.
BUG=chromium-os:19431
TEST=See bug description
Review URL: http://codereview.chromium.org/7827022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100905 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/policy/device_management_service.cc')
-rw-r--r-- | chrome/browser/policy/device_management_service.cc | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/chrome/browser/policy/device_management_service.cc b/chrome/browser/policy/device_management_service.cc index 6e30ff0..e9b2921 100644 --- a/chrome/browser/policy/device_management_service.cc +++ b/chrome/browser/policy/device_management_service.cc @@ -12,6 +12,7 @@ #include "net/base/cookie_monster.h" #include "net/base/host_resolver.h" #include "net/base/load_flags.h" +#include "net/base/net_errors.h" #include "net/base/ssl_config_service_defaults.h" #include "net/http/http_auth_handler_factory.h" #include "net/http/http_network_layer.h" @@ -136,7 +137,7 @@ void DeviceManagementService::Initialize() { initialized_ = true; while (!queued_jobs_.empty()) { - StartJob(queued_jobs_.front()); + StartJob(queued_jobs_.front(), false); queued_jobs_.pop_front(); } } @@ -160,7 +161,7 @@ DeviceManagementService::DeviceManagementService( void DeviceManagementService::AddJob(DeviceManagementJob* job) { if (initialized_) - StartJob(job); + StartJob(job, false); else queued_jobs_.push_back(job); } @@ -182,12 +183,14 @@ void DeviceManagementService::RemoveJob(DeviceManagementJob* job) { queued_jobs_.erase(elem); } -void DeviceManagementService::StartJob(DeviceManagementJob* job) { +void DeviceManagementService::StartJob(DeviceManagementJob* job, + bool bypass_proxy) { URLFetcher* fetcher = URLFetcher::Create(0, job->GetURL(server_url_), URLFetcher::POST, this); fetcher->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES | - net::LOAD_DISABLE_CACHE); + net::LOAD_DISABLE_CACHE | + (bypass_proxy ? net::LOAD_BYPASS_PROXY : 0)); fetcher->set_request_context(request_context_getter_.get()); job->ConfigureRequest(fetcher); pending_jobs_[fetcher] = job; @@ -205,7 +208,27 @@ void DeviceManagementService::OnURLFetchComplete( if (entry != pending_jobs_.end()) { DeviceManagementJob* job = entry->second; pending_jobs_.erase(entry); - job->HandleResponse(status, response_code, cookies, data); + + // Retry the job if it failed due to a broken proxy, by bypassing the + // proxy on the next try. Don't retry if this URLFetcher already bypassed + // the proxy. + int error = status.error(); + if (!status.is_success() && + ((source->load_flags() & net::LOAD_BYPASS_PROXY) == 0) && + (error == net::ERR_PROXY_CONNECTION_FAILED || + error == net::ERR_TUNNEL_CONNECTION_FAILED || + error == net::ERR_PROXY_AUTH_UNSUPPORTED || + error == net::ERR_HTTPS_PROXY_TUNNEL_RESPONSE || + error == net::ERR_MANDATORY_PROXY_CONFIGURATION_FAILED || + error == net::ERR_PROXY_CERTIFICATE_INVALID || + error == net::ERR_SOCKS_CONNECTION_FAILED || + error == net::ERR_SOCKS_CONNECTION_HOST_UNREACHABLE)) { + LOG(WARNING) << "Proxy failed while contacting dmserver. Retrying " + << "without using the proxy."; + StartJob(job, true); + } else { + job->HandleResponse(status, response_code, cookies, data); + } } else { NOTREACHED() << "Callback from foreign URL fetcher"; } |