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 | |
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')
4 files changed, 33 insertions, 10 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"; } diff --git a/chrome/browser/policy/device_management_service.h b/chrome/browser/policy/device_management_service.h index 5df5223..d2c5122 100644 --- a/chrome/browser/policy/device_management_service.h +++ b/chrome/browser/policy/device_management_service.h @@ -74,7 +74,7 @@ class DeviceManagementService : public URLFetcher::Delegate { protected: // Starts the given job. - virtual void StartJob(DeviceManagementJob* job); + virtual void StartJob(DeviceManagementJob* job, bool bypass_proxy); private: typedef std::map<const URLFetcher*, DeviceManagementJob*> JobFetcherMap; diff --git a/chrome/browser/policy/enterprise_metrics_browsertest.cc b/chrome/browser/policy/enterprise_metrics_browsertest.cc index 91a73d1..7ee8158 100644 --- a/chrome/browser/policy/enterprise_metrics_browsertest.cc +++ b/chrome/browser/policy/enterprise_metrics_browsertest.cc @@ -91,7 +91,7 @@ class DeviceManagementBackendTestHelper { const std::string& data) { net::ResponseCookies cookies; net::URLRequestStatus url_request_status(status, 0); - EXPECT_CALL(service_, StartJob(_)) + EXPECT_CALL(service_, StartJob(_,_)) .WillOnce(MockDeviceManagementServiceRespondToJob( url_request_status, response_code, cookies, data)); } diff --git a/chrome/browser/policy/mock_device_management_service.h b/chrome/browser/policy/mock_device_management_service.h index 5c9a62e..ce29980 100644 --- a/chrome/browser/policy/mock_device_management_service.h +++ b/chrome/browser/policy/mock_device_management_service.h @@ -54,7 +54,7 @@ class MockDeviceManagementService : public DeviceManagementService { virtual ~MockDeviceManagementService(); MOCK_METHOD0(CreateBackend, DeviceManagementBackend*()); - MOCK_METHOD1(StartJob, void(DeviceManagementJob*)); + MOCK_METHOD2(StartJob, void(DeviceManagementJob*, bool)); // This method bypasses the mocked version and calls the superclass' // CreateBackend(), returning a "real" backend. @@ -64,8 +64,8 @@ class MockDeviceManagementService : public DeviceManagementService { // This method bypasses the mocked version and calls the superclass' // StartJob. - void StartJobNotMocked(DeviceManagementJob* job) { - DeviceManagementService::StartJob(job); + void StartJobNotMocked(DeviceManagementJob* job, bool bypass_proxy) { + DeviceManagementService::StartJob(job, bypass_proxy); } private: |