Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Unified Diff: chrome/browser/policy/device_management_service.cc

Issue 8054013: Recover from bad proxy settings pointing to non-proxy servers that reply anyway. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/device_management_service.cc
diff --git a/chrome/browser/policy/device_management_service.cc b/chrome/browser/policy/device_management_service.cc
index 9a51ae7828770237df779b57811e2298f3aa08aa..a73b2a5d98e742bd0f8eaa4719503f9f65e9cdb0 100644
--- a/chrome/browser/policy/device_management_service.cc
+++ b/chrome/browser/policy/device_management_service.cc
@@ -17,6 +17,7 @@
#include "net/base/net_errors.h"
#include "net/base/ssl_config_service_defaults.h"
#include "net/http/http_network_layer.h"
+#include "net/http/http_response_headers.h"
#include "net/proxy/proxy_service.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
@@ -27,6 +28,26 @@ namespace policy {
namespace {
+bool IsProxyError(const net::URLRequestStatus status) {
+ switch (status.error()) {
+ case net::ERR_PROXY_CONNECTION_FAILED:
+ case net::ERR_TUNNEL_CONNECTION_FAILED:
+ case net::ERR_PROXY_AUTH_UNSUPPORTED:
+ case net::ERR_HTTPS_PROXY_TUNNEL_RESPONSE:
+ case net::ERR_MANDATORY_PROXY_CONFIGURATION_FAILED:
+ case net::ERR_PROXY_CERTIFICATE_INVALID:
+ case net::ERR_SOCKS_CONNECTION_FAILED:
+ case net::ERR_SOCKS_CONNECTION_HOST_UNREACHABLE:
+ return true;
+ }
+ return false;
+}
+
+bool IsProtobufMimeType(const URLFetcher* source) {
+ return source->response_headers()->HasHeaderValue(
+ "content-type", "application/x-protobuffer");
+}
+
// Custom request context implementation that allows to override the user agent,
// amongst others. Wraps a baseline request context from which we reuse the
// networking components.
@@ -214,19 +235,22 @@ void DeviceManagementService::OnURLFetchComplete(
// 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.";
+ bool retry = false;
+ if ((source->load_flags() & net::LOAD_BYPASS_PROXY) == 0) {
+ if (!status.is_success() && IsProxyError(status)) {
+ LOG(WARNING) << "Proxy failed while contacting dmserver.";
+ retry = true;
+ } else if (status.is_success() &&
+ source->was_fetched_via_proxy() &&
+ !IsProtobufMimeType(source)) {
+ LOG(WARNING) << "Got bad mime-type in response from dmserver that was "
Mattias Nissler (ping if slow) 2011/09/28 09:06:18 Please also put a comment here explaining what pro
Joao da Silva 2011/09/28 19:20:27 Done.
+ << "fetched via a proxy.";
+ retry = true;
+ }
+ }
+
+ if (retry) {
+ LOG(WARNING) << "Retrying dmserver request without using a proxy.";
StartJob(job, true);
} else {
job->HandleResponse(status, response_code, cookies, data);

Powered by Google App Engine
This is Rietveld 408576698