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 e48afc366876e3aed082e133548044b45713a1f2..4a50ad2f8749be342faa7f37d6ecf0d523b962e3 100644 |
--- a/components/data_reduction_proxy/common/data_reduction_proxy_headers.cc |
+++ b/components/data_reduction_proxy/common/data_reduction_proxy_headers.cc |
@@ -23,10 +23,35 @@ namespace data_reduction_proxy { |
const char* kDataReductionProxyViaValues[] = {"Chrome-Compression-Proxy", |
"Chrome Compression Proxy"}; |
+bool GetDataReductionProxyActionValue( |
+ const net::HttpResponseHeaders* headers, |
+ const std::string& action_prefix, |
+ std::string* action_value) { |
+ DCHECK(action_prefix.size()); |
+ void* iter = NULL; |
+ std::string value; |
+ std::string name = "chrome-proxy"; |
+ |
+ while (headers->EnumerateHeader(&iter, name, &value)) { |
+ if (value.size() > action_prefix.size()) { |
+ if (LowerCaseEqualsASCII(value.begin(), |
+ value.begin() + action_prefix.size(), |
+ action_prefix.c_str()) && |
+ value[action_prefix.size()] == '=') { |
+ if (action_value) |
+ *action_value = value.substr(action_prefix.size() + 1); |
+ return true; |
+ } |
+ } |
+ } |
+ return false; |
+} |
+ |
bool GetDataReductionProxyBypassDuration( |
bolian
2014/07/14 22:42:43
why doesn't this one call GetDataReductionProxyAct
xingx
2014/07/14 22:51:08
Need to discuss with Ben: my function (above) retu
|
const net::HttpResponseHeaders* headers, |
const std::string& action_prefix, |
base::TimeDelta* duration) { |
+ DCHECK(action_prefix.size()); |
void* iter = NULL; |
std::string value; |
std::string name = "chrome-proxy"; |
@@ -35,10 +60,12 @@ bool GetDataReductionProxyBypassDuration( |
if (value.size() > action_prefix.size()) { |
if (LowerCaseEqualsASCII(value.begin(), |
value.begin() + action_prefix.size(), |
- action_prefix.c_str())) { |
+ action_prefix.c_str()) && |
+ value[action_prefix.size()] == '=') { |
int64 seconds; |
if (!base::StringToInt64( |
- StringPiece(value.begin() + action_prefix.size(), value.end()), |
+ StringPiece(value.begin() + action_prefix.size() + 1, |
+ value.end()), |
&seconds) || seconds < 0) { |
continue; // In case there is a well formed instruction. |
} |
@@ -66,14 +93,14 @@ 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)) { |
+ headers, "block", &proxy_info->bypass_duration)) { |
proxy_info->bypass_all = true; |
return true; |
} |
// Next, look for 'bypass'. |
if (GetDataReductionProxyBypassDuration( |
- headers, "bypass=", &proxy_info->bypass_duration)) { |
+ headers, "bypass", &proxy_info->bypass_duration)) { |
return true; |
} |
return false; |