Index: components/data_reduction_proxy/common/data_reduction_proxy_headers.cc |
diff --git a/components/data_reduction_proxy/common/data_reduction_proxy_headers.cc b/components/data_reduction_proxy/common/data_reduction_proxy_headers.cc |
index b5c6119080948ba3618b2c0d02b51fcb521eb860..37b4c5f01b6a4433186ef5693bc14f8b9a63600f 100644 |
--- a/components/data_reduction_proxy/common/data_reduction_proxy_headers.cc |
+++ b/components/data_reduction_proxy/common/data_reduction_proxy_headers.cc |
@@ -6,6 +6,7 @@ |
#include <string> |
+#include "base/rand_util.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_piece.h" |
#include "base/strings/string_util.h" |
@@ -20,10 +21,20 @@ using net::ProxyService; |
namespace data_reduction_proxy { |
-bool GetDataReductionProxyBypassDuration( |
+namespace { |
+ |
+// Sets a random bypass duration between 1 and 5 minutes. |
+void SetRandBypassDuration(DataReductionProxyInfo* data_reduction_proxy_info) { |
bengr
2014/07/18 19:41:44
I still think this can be a base:TimeDelta*
bengr
2014/07/18 19:41:44
DCHECK that this isn't NULL.
Not at Google. Contact bengr
2014/07/21 17:46:26
Done.
Not at Google. Contact bengr
2014/07/21 17:46:26
Done.
|
+ data_reduction_proxy_info->bypass_duration = TimeDelta::FromMilliseconds( |
+ base::RandInt(1 * 60 * 1000, 5 * 60 * 1000)); |
+} |
+ |
+} // namespace anonymous |
+ |
+bool ParseHeadersAndSetProxyInfoBypassDuration( |
const net::HttpResponseHeaders* headers, |
const std::string& action_prefix, |
- base::TimeDelta* duration) { |
+ DataReductionProxyInfo* proxy_info) { |
void* iter = NULL; |
std::string value; |
std::string name = "chrome-proxy"; |
@@ -39,7 +50,13 @@ bool GetDataReductionProxyBypassDuration( |
&seconds) || seconds < 0) { |
continue; // In case there is a well formed instruction. |
} |
- *duration = TimeDelta::FromSeconds(seconds); |
+ if (seconds != 0) { |
+ proxy_info->bypass_duration = TimeDelta::FromSeconds(seconds); |
+ } else { |
+ // Server deferred to us to choose a duration. Default to a range from |
+ // one to five minutes. |
+ SetRandBypassDuration(proxy_info); |
+ } |
return true; |
} |
} |
@@ -47,11 +64,11 @@ bool GetDataReductionProxyBypassDuration( |
return false; |
} |
-bool GetDataReductionProxyInfo(const net::HttpResponseHeaders* headers, |
- DataReductionProxyInfo* proxy_info) { |
+bool ParseHeadersAndSetProxyInfo(const net::HttpResponseHeaders* headers, |
+ DataReductionProxyInfo* proxy_info) { |
DCHECK(proxy_info); |
proxy_info->bypass_all = false; |
- proxy_info->bypass_duration = TimeDelta(); |
+ |
// Support header of the form Chrome-Proxy: bypass|block=<duration>, where |
// <duration> is the number of seconds to wait before retrying |
// the proxy. If the duration is 0, then the default proxy retry delay |
@@ -62,15 +79,15 @@ bool GetDataReductionProxyInfo(const net::HttpResponseHeaders* headers, |
// 'block' takes precedence over 'bypass', so look for it first. |
// TODO(bengr): Reduce checks for 'block' and 'bypass' to a single loop. |
- if (GetDataReductionProxyBypassDuration( |
- headers, "block=", &proxy_info->bypass_duration)) { |
+ if (ParseHeadersAndSetProxyInfoBypassDuration( |
bengr
2014/07/18 19:41:44
You're in a file with the name "headers" it it, so
Not at Google. Contact bengr
2014/07/21 17:46:26
My attempt was to make it less ambiguous. I had in
|
+ headers, "block=", proxy_info)) { |
proxy_info->bypass_all = true; |
return true; |
} |
// Next, look for 'bypass'. |
- if (GetDataReductionProxyBypassDuration( |
- headers, "bypass=", &proxy_info->bypass_duration)) { |
+ if (ParseHeadersAndSetProxyInfoBypassDuration( |
+ headers, "bypass=", proxy_info)) { |
return true; |
} |
return false; |
@@ -110,7 +127,7 @@ GetDataReductionProxyBypassType( |
const net::HttpResponseHeaders* headers, |
DataReductionProxyInfo* data_reduction_proxy_info) { |
DCHECK(data_reduction_proxy_info); |
- if (GetDataReductionProxyInfo(headers, data_reduction_proxy_info)) { |
+ if (ParseHeadersAndSetProxyInfo(headers, data_reduction_proxy_info)) { |
// A chrome-proxy response header is only present in a 502. For proper |
// reporting, this check must come before the 5xx checks below. |
const TimeDelta& duration = data_reduction_proxy_info->bypass_duration; |
@@ -120,21 +137,31 @@ GetDataReductionProxyBypassType( |
return ProxyService::MEDIUM_BYPASS; |
return ProxyService::LONG_BYPASS; |
} |
+ |
// Fall back if a 500, 502 or 503 is returned. |
- if (headers->response_code() == net::HTTP_INTERNAL_SERVER_ERROR) |
- return ProxyService::STATUS_500_HTTP_INTERNAL_SERVER_ERROR; |
- if (headers->response_code() == net::HTTP_BAD_GATEWAY) |
- return ProxyService::STATUS_502_HTTP_BAD_GATEWAY; |
- if (headers->response_code() == net::HTTP_SERVICE_UNAVAILABLE) |
- return ProxyService::STATUS_503_HTTP_SERVICE_UNAVAILABLE; |
+ if (headers->response_code() == net::HTTP_INTERNAL_SERVER_ERROR || |
+ headers->response_code() == net::HTTP_BAD_GATEWAY || |
+ headers->response_code() == net::HTTP_SERVICE_UNAVAILABLE) { |
+ SetRandBypassDuration(data_reduction_proxy_info); |
+ |
+ if (headers->response_code() == net::HTTP_INTERNAL_SERVER_ERROR) |
+ return ProxyService::STATUS_500_HTTP_INTERNAL_SERVER_ERROR; |
+ if (headers->response_code() == net::HTTP_BAD_GATEWAY) |
+ return ProxyService::STATUS_502_HTTP_BAD_GATEWAY; |
+ if (headers->response_code() == net::HTTP_SERVICE_UNAVAILABLE) |
+ return ProxyService::STATUS_503_HTTP_SERVICE_UNAVAILABLE; |
+ } |
+ |
// TODO(kundaji): Bypass if Proxy-Authenticate header value cannot be |
// interpreted by data reduction proxy. |
if (headers->response_code() == net::HTTP_PROXY_AUTHENTICATION_REQUIRED && |
!headers->HasHeader("Proxy-Authenticate")) { |
+ SetRandBypassDuration(data_reduction_proxy_info); |
return ProxyService::MALFORMED_407; |
} |
if (!HasDataReductionProxyViaHeader(headers) && |
(headers->response_code() != net::HTTP_NOT_MODIFIED)) { |
+ SetRandBypassDuration(data_reduction_proxy_info); |
// A Via header might not be present in a 304. Since the goal of a 304 |
// response is to minimize information transfer, a sender in general |
// should not generate representation metadata other than Cache-Control, |