Commit 1d0c8293 authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

DRP: Add GetPageIdFromRequestHeaders to DRP Request Options

Also refactors GetSessionKeyFromRequestHeaders to be static and return a
bool to indicate success, setting a passed pointer to the parsed session
key.

This is needed to support Lite Page Redirect pingbacks, in order to
get the DRP session id and page id that were used on a navigation.

Bug: 864665
Change-Id: Iefa1d6e39b58a0b71dbc1976ef1a0a2ba4712e73
Reviewed-on: https://chromium-review.googlesource.com/c/1345424
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609973}
parent 476edd35
...@@ -311,7 +311,9 @@ bool DataReductionProxyConfigServiceClient::ShouldRetryDueToAuthFailure( ...@@ -311,7 +311,9 @@ bool DataReductionProxyConfigServiceClient::ShouldRetryDueToAuthFailure(
// If the session key used in the request is different from the current // If the session key used in the request is different from the current
// session key, then the current session key does not need to be // session key, then the current session key does not need to be
// invalidated. // invalidated.
if (request_options_->GetSessionKeyFromRequestHeaders(request_headers) != base::Optional<std::string> session_key =
request_options_->GetSessionKeyFromRequestHeaders(request_headers);
if ((session_key.has_value() ? session_key.value() : std::string()) !=
request_options_->GetSecureSession()) { request_options_->GetSecureSession()) {
RecordAuthExpiredSessionKey(false); RecordAuthExpiredSessionKey(false);
return true; return true;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/optional.h"
#include "base/rand_util.h" #include "base/rand_util.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/strings/safe_sprintf.h" #include "base/strings/safe_sprintf.h"
...@@ -38,6 +39,17 @@ std::string FormatOption(const std::string& name, const std::string& value) { ...@@ -38,6 +39,17 @@ std::string FormatOption(const std::string& name, const std::string& value) {
return name + "=" + value; return name + "=" + value;
} }
bool ParseChromeProxyHeader(const net::HttpRequestHeaders& request_headers,
base::StringPairs* kv_pairs) {
std::string chrome_proxy_header_value;
return request_headers.GetHeader(chrome_proxy_header(),
&chrome_proxy_header_value) &&
base::SplitStringIntoKeyValuePairs(chrome_proxy_header_value,
'=', // Key-value delimiter
',', // Key-value pair delimiter
kv_pairs);
}
} // namespace } // namespace
const char kSecureSessionHeaderOption[] = "s"; const char kSecureSessionHeaderOption[] = "s";
...@@ -248,20 +260,13 @@ void DataReductionProxyRequestOptions::RegenerateRequestHeaderValue() { ...@@ -248,20 +260,13 @@ void DataReductionProxyRequestOptions::RegenerateRequestHeaderValue() {
} }
} }
std::string DataReductionProxyRequestOptions::GetSessionKeyFromRequestHeaders( // static
const net::HttpRequestHeaders& request_headers) const { base::Optional<std::string>
std::string chrome_proxy_header_value; DataReductionProxyRequestOptions::GetSessionKeyFromRequestHeaders(
const net::HttpRequestHeaders& request_headers) {
base::StringPairs kv_pairs; base::StringPairs kv_pairs;
// Return if the request does not have request headers or if they can't be if (!ParseChromeProxyHeader(request_headers, &kv_pairs))
// parsed into key-value pairs. return base::nullopt;
if (!request_headers.GetHeader(chrome_proxy_header(),
&chrome_proxy_header_value) ||
!base::SplitStringIntoKeyValuePairs(chrome_proxy_header_value,
'=', // Key-value delimiter
',', // Key-value pair delimiter
&kv_pairs)) {
return "";
}
for (const auto& kv_pair : kv_pairs) { for (const auto& kv_pair : kv_pairs) {
// Delete leading and trailing white space characters from the key before // Delete leading and trailing white space characters from the key before
...@@ -272,7 +277,32 @@ std::string DataReductionProxyRequestOptions::GetSessionKeyFromRequestHeaders( ...@@ -272,7 +277,32 @@ std::string DataReductionProxyRequestOptions::GetSessionKeyFromRequestHeaders(
.as_string(); .as_string();
} }
} }
return ""; return base::nullopt;
}
// static
base::Optional<uint64_t>
DataReductionProxyRequestOptions::GetPageIdFromRequestHeaders(
const net::HttpRequestHeaders& request_headers) {
base::StringPairs kv_pairs;
if (!ParseChromeProxyHeader(request_headers, &kv_pairs))
return base::nullopt;
for (const auto& kv_pair : kv_pairs) {
// Delete leading and trailing white space characters from the key before
// comparing.
if (base::TrimWhitespaceASCII(kv_pair.first, base::TRIM_ALL) ==
kPageIdOption) {
uint64_t page_id;
if (base::StringToUint64(
base::TrimWhitespaceASCII(kv_pair.second, base::TRIM_ALL)
.as_string(),
&page_id)) {
return page_id;
}
}
}
return base::nullopt;
} }
uint64_t DataReductionProxyRequestOptions::GeneratePageId() { uint64_t DataReductionProxyRequestOptions::GeneratePageId() {
......
...@@ -94,8 +94,12 @@ class DataReductionProxyRequestOptions { ...@@ -94,8 +94,12 @@ class DataReductionProxyRequestOptions {
void Invalidate(); void Invalidate();
// Parses |request_headers| and returns the value of the session key. // Parses |request_headers| and returns the value of the session key.
std::string GetSessionKeyFromRequestHeaders( static base::Optional<std::string> GetSessionKeyFromRequestHeaders(
const net::HttpRequestHeaders& request_headers) const; const net::HttpRequestHeaders& request_headers);
// Parses |request_headers| and returns the value of the page id.
static base::Optional<uint64_t> GetPageIdFromRequestHeaders(
const net::HttpRequestHeaders& request_headers);
// Creates and returns a new unique page ID (unique per session). // Creates and returns a new unique page ID (unique per session).
uint64_t GeneratePageId(); uint64_t GeneratePageId();
......
...@@ -367,20 +367,22 @@ TEST_F(DataReductionProxyRequestOptionsTest, GetSessionKeyFromRequestHeaders) { ...@@ -367,20 +367,22 @@ TEST_F(DataReductionProxyRequestOptionsTest, GetSessionKeyFromRequestHeaders) {
std::string chrome_proxy_header_key; std::string chrome_proxy_header_key;
std::string chrome_proxy_header_value; std::string chrome_proxy_header_value;
std::string expected_session_key; std::string expected_session_key;
bool expect_result;
} tests[] = { } tests[] = {
{"chrome-proxy", "something=something_else, s=123, key=value", "123"}, {"chrome-proxy", "something=something_else, s=123, key=value", "123",
true},
{"chrome-proxy", "something=something_else, s= 123 456 , key=value", {"chrome-proxy", "something=something_else, s= 123 456 , key=value",
"123 456"}, "123 456", true},
{"chrome-proxy", "something=something_else, s=123456, key=value", {"chrome-proxy", "something=something_else, s=123456, key=value",
"123456"}, "123456", true},
{"chrome-proxy", "something=something else, s=123456, key=value", {"chrome-proxy", "something=something else, s=123456, key=value",
"123456"}, "123456", true},
{"chrome-proxy", "something=something else, s=123456 ", "123456"}, {"chrome-proxy", "something=something else, s=123456 ", "123456", true},
{"chrome-proxy", "something=something_else, s=, key=value", ""}, {"chrome-proxy", "something=something_else, s=, key=value", "", false},
{"chrome-proxy", "something=something_else, key=value", ""}, {"chrome-proxy", "something=something_else, key=value", "", false},
{"chrome-proxy", "s=123", "123"}, {"chrome-proxy", "s=123", "123", true},
{"chrome-proxy", " s = 123 ", "123"}, {"chrome-proxy", " s = 123 ", "123", true},
{"some_other_header", "s=123", ""}, {"some_other_header", "s=123", "", false},
}; };
for (const auto& test : tests) { for (const auto& test : tests) {
...@@ -390,12 +392,56 @@ TEST_F(DataReductionProxyRequestOptionsTest, GetSessionKeyFromRequestHeaders) { ...@@ -390,12 +392,56 @@ TEST_F(DataReductionProxyRequestOptionsTest, GetSessionKeyFromRequestHeaders) {
test.chrome_proxy_header_value); test.chrome_proxy_header_value);
request_headers.SetHeader("some_random_header_after", "some_random_key"); request_headers.SetHeader("some_random_header_after", "some_random_key");
std::string session_key = base::Optional<std::string> session_key =
request_options()->GetSessionKeyFromRequestHeaders(request_headers); request_options()->GetSessionKeyFromRequestHeaders(request_headers);
EXPECT_EQ(test.expect_result, session_key.has_value());
if (test.expect_result) {
EXPECT_EQ(test.expected_session_key, session_key) EXPECT_EQ(test.expected_session_key, session_key)
<< test.chrome_proxy_header_key << ":" << test.chrome_proxy_header_key << ":"
<< test.chrome_proxy_header_value; << test.chrome_proxy_header_value;
} }
}
}
TEST_F(DataReductionProxyRequestOptionsTest, GetPageIdFromRequestHeaders) {
const struct {
std::string chrome_proxy_header_key;
std::string chrome_proxy_header_value;
uint64_t expected_page_id;
bool expect_result;
} tests[] = {
{"chrome-proxy", "something=something_else, pid=123, key=value", 123,
true},
{"chrome-proxy", "something=something_else, pid= 123 , key=value", 123,
true},
{"chrome-proxy", "something=something_else, pid=123456, key=value",
123456, true},
{"chrome-proxy", "something=something else, pid=123456, key=value",
123456, true},
{"chrome-proxy", "something=something else, pid=123456 ", 123456, true},
{"chrome-proxy", "something=something_else, pid=, key=value", 0, false},
{"chrome-proxy", "something=something_else, key=value", 0, false},
{"chrome-proxy", "pid=123", 123, true},
{"chrome-proxy", " pid = 123 ", 123, true},
{"some_other_header", "pid=123", 0, false},
};
for (const auto& test : tests) {
net::HttpRequestHeaders request_headers;
request_headers.SetHeader("some_random_header_before", "some_random_key");
request_headers.SetHeader(test.chrome_proxy_header_key,
test.chrome_proxy_header_value);
request_headers.SetHeader("some_random_header_after", "some_random_key");
base::Optional<uint64_t> page_id =
request_options()->GetPageIdFromRequestHeaders(request_headers);
EXPECT_EQ(test.expect_result, page_id.has_value());
if (test.expect_result) {
EXPECT_EQ(test.expected_page_id, page_id)
<< test.chrome_proxy_header_key << ":"
<< test.chrome_proxy_header_value;
}
}
} }
TEST_F(DataReductionProxyRequestOptionsTest, PageIdIncrementing) { TEST_F(DataReductionProxyRequestOptionsTest, PageIdIncrementing) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment