summaryrefslogtreecommitdiffstats
path: root/chrome/browser/policy/device_management_service.cc
diff options
context:
space:
mode:
authorjoaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-13 13:09:42 +0000
committerjoaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-13 13:09:42 +0000
commita0974cac36f01c70f63f09e8b4c2cbf8dc9bd3c2 (patch)
treeb209c4591da063890759a30707c9dce3220b353e /chrome/browser/policy/device_management_service.cc
parent7fb0d58958805925537b7f39b71f1bb9327bbfa7 (diff)
downloadchromium_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.cc33
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";
}