Commit 563dc476 authored by ttuttle@chromium.org's avatar ttuttle@chromium.org

Domain Reliability: Don't send proxy address, other fixes

Make sure the monitor does not collect the proxy's address if one was used.
(In the process, refactor RequestInfo to contain the whole HttpResponseInfo,
tighten up OnRequestLegComplete, and poke at unittests a bit.)

Also, count network errors as well as HTTP errors as failures (!).

BUG=356791

Review URL: https://codereview.chromium.org/267633002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269657 0039d316-1c4b-4281-b951-d872f2087c98
parent 727c5c93
...@@ -80,8 +80,6 @@ int GetIndex(DomainReliabilityConfig* config, const char* url_string) { ...@@ -80,8 +80,6 @@ int GetIndex(DomainReliabilityConfig* config, const char* url_string) {
return config->GetResourceIndexForUrl(GURL(url_string)); return config->GetResourceIndexForUrl(GURL(url_string));
} }
} // namespace
class DomainReliabilityConfigTest : public testing::Test { }; class DomainReliabilityConfigTest : public testing::Test { };
TEST_F(DomainReliabilityConfigTest, IsValid) { TEST_F(DomainReliabilityConfigTest, IsValid) {
...@@ -209,4 +207,5 @@ TEST_F(DomainReliabilityConfigTest, FromJSON) { ...@@ -209,4 +207,5 @@ TEST_F(DomainReliabilityConfigTest, FromJSON) {
config->collectors[0]->upload_url); config->collectors[0]->upload_url);
} }
} // namespace
} // namespace domain_reliability } // namespace domain_reliability
...@@ -141,9 +141,9 @@ void DomainReliabilityContext::OnBeacon(const GURL& url, ...@@ -141,9 +141,9 @@ void DomainReliabilityContext::OnBeacon(const GURL& url,
return; return;
DCHECK_GT(states_.size(), index); DCHECK_GT(states_.size(), index);
bool success = (beacon.status == "ok");
ResourceState* state = states_[index]; ResourceState* state = states_[index];
bool success = beacon.http_response_code >= 200 &&
beacon.http_response_code < 400;
if (success) if (success)
++state->successful_requests; ++state->successful_requests;
else else
......
...@@ -33,8 +33,6 @@ DomainReliabilityBeacon MakeBeacon(MockableTime* time) { ...@@ -33,8 +33,6 @@ DomainReliabilityBeacon MakeBeacon(MockableTime* time) {
return beacon; return beacon;
} }
} // namespace
class DomainReliabilityContextTest : public testing::Test { class DomainReliabilityContextTest : public testing::Test {
protected: protected:
DomainReliabilityContextTest() DomainReliabilityContextTest()
...@@ -211,4 +209,5 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) { ...@@ -211,4 +209,5 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) {
CallUploadCallback(true); CallUploadCallback(true);
} }
} // namespace
} // namespace domain_reliability } // namespace domain_reliability
...@@ -8,11 +8,12 @@ ...@@ -8,11 +8,12 @@
#include "components/domain_reliability/test_util.h" #include "components/domain_reliability/test_util.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
using base::TimeDelta; using base::TimeDelta;
using base::TimeTicks; using base::TimeTicks;
namespace domain_reliability {
class DomainReliabilityDispatcherTest : public testing::Test { class DomainReliabilityDispatcherTest : public testing::Test {
public: public:
DomainReliabilityDispatcherTest() : dispatcher_(&time_) {} DomainReliabilityDispatcherTest() : dispatcher_(&time_) {}
...@@ -58,4 +59,5 @@ TEST_F(DomainReliabilityDispatcherTest, TaskRunsAtDeadline) { ...@@ -58,4 +59,5 @@ TEST_F(DomainReliabilityDispatcherTest, TaskRunsAtDeadline) {
EXPECT_TRUE(callback.called()); EXPECT_TRUE(callback.called());
} }
} // namespace
} // namespace domain_reliability } // namespace domain_reliability
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "components/domain_reliability/baked_in_configs.h" #include "components/domain_reliability/baked_in_configs.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/http/http_response_headers.h"
#include "net/url_request/url_request.h" #include "net/url_request/url_request.h"
#include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
...@@ -122,7 +123,7 @@ void DomainReliabilityMonitor::OnCompleted(net::URLRequest* request, ...@@ -122,7 +123,7 @@ void DomainReliabilityMonitor::OnCompleted(net::URLRequest* request,
if (!started) if (!started)
return; return;
RequestInfo request_info(*request); RequestInfo request_info(*request);
if (request_info.DefinitelyReachedNetwork()) { if (request_info.AccessedNetwork()) {
OnRequestLegComplete(request_info); OnRequestLegComplete(request_info);
// A request was just using the network, so now is a good time to run any // A request was just using the network, so now is a good time to run any
// pending and eligible uploads. // pending and eligible uploads.
...@@ -141,21 +142,17 @@ DomainReliabilityMonitor::RequestInfo::RequestInfo( ...@@ -141,21 +142,17 @@ DomainReliabilityMonitor::RequestInfo::RequestInfo(
const net::URLRequest& request) const net::URLRequest& request)
: url(request.url()), : url(request.url()),
status(request.status()), status(request.status()),
response_code(-1), response_info(request.response_info()),
socket_address(request.GetSocketAddress()),
was_cached(request.was_cached()),
load_flags(request.load_flags()), load_flags(request.load_flags()),
is_upload(DomainReliabilityUploader::URLRequestIsUpload(request)) { is_upload(DomainReliabilityUploader::URLRequestIsUpload(request)) {
request.GetLoadTimingInfo(&load_timing_info); request.GetLoadTimingInfo(&load_timing_info);
// Can't get response code of a canceled request -- there's no transaction.
if (status.status() != net::URLRequestStatus::CANCELED)
response_code = request.GetResponseCode();
} }
DomainReliabilityMonitor::RequestInfo::~RequestInfo() {} DomainReliabilityMonitor::RequestInfo::~RequestInfo() {}
bool DomainReliabilityMonitor::RequestInfo::DefinitelyReachedNetwork() const { bool DomainReliabilityMonitor::RequestInfo::AccessedNetwork() const {
return status.status() != net::URLRequestStatus::CANCELED && !was_cached; return status.status() != net::URLRequestStatus::CANCELED &&
response_info.network_accessed;
} }
DomainReliabilityContext* DomainReliabilityMonitor::AddContext( DomainReliabilityContext* DomainReliabilityMonitor::AddContext(
...@@ -184,41 +181,42 @@ DomainReliabilityContext* DomainReliabilityMonitor::AddContext( ...@@ -184,41 +181,42 @@ DomainReliabilityContext* DomainReliabilityMonitor::AddContext(
void DomainReliabilityMonitor::OnRequestLegComplete( void DomainReliabilityMonitor::OnRequestLegComplete(
const RequestInfo& request) { const RequestInfo& request) {
if (!request.DefinitelyReachedNetwork()) int response_code;
return; if (request.response_info.headers)
response_code = request.response_info.headers->response_code();
// Don't monitor requests that are not sending cookies, since sending a beacon else
// for such requests may allow the server to correlate that request with the response_code = -1;
// user (by correlating a particular config). ContextMap::iterator context_it;
if (request.load_flags & net::LOAD_DO_NOT_SEND_COOKIES)
return;
// Don't monitor requests that were, themselves, Domain Reliability uploads,
// to avoid infinite chains of uploads.
if (request.is_upload)
return;
ContextMap::iterator it = contexts_.find(request.url.host());
if (it == contexts_.end())
return;
DomainReliabilityContext* context = it->second;
std::string beacon_status; std::string beacon_status;
bool got_status = GetDomainReliabilityBeaconStatus(
request.status.error(), // Ignore requests where:
request.response_code, // 1. There is no context for the request host.
&beacon_status); // 2. The request did not access the network.
if (!got_status) // 3. The request is not supposed to send cookies (to avoid associating the
// request with any potentially unique data in the config).
// 4. The request was itself a Domain Reliability upload (to avoid loops).
// 5. There is no defined beacon status for the error or HTTP response code
// (to avoid leaking network-local errors).
if ((context_it = contexts_.find(request.url.host())) == contexts_.end() ||
!request.AccessedNetwork() ||
(request.load_flags & net::LOAD_DO_NOT_SEND_COOKIES) ||
request.is_upload ||
!GetDomainReliabilityBeaconStatus(
request.status.error(), response_code, &beacon_status)) {
return; return;
}
DomainReliabilityBeacon beacon; DomainReliabilityBeacon beacon;
beacon.status = beacon_status; beacon.status = beacon_status;
beacon.chrome_error = request.status.error(); beacon.chrome_error = request.status.error();
beacon.server_ip = request.socket_address.host(); if (!request.response_info.was_fetched_via_proxy)
beacon.http_response_code = request.response_code; beacon.server_ip = request.response_info.socket_address.host();
else
beacon.server_ip.clear();
beacon.http_response_code = response_code;
beacon.start_time = request.load_timing_info.request_start; beacon.start_time = request.load_timing_info.request_start;
beacon.elapsed = time_->NowTicks() - beacon.start_time; beacon.elapsed = time_->NowTicks() - beacon.start_time;
context->OnBeacon(request.url, beacon); context_it->second->OnBeacon(request.url, beacon);
} }
} // namespace domain_reliability } // namespace domain_reliability
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
#include "components/domain_reliability/scheduler.h" #include "components/domain_reliability/scheduler.h"
#include "components/domain_reliability/uploader.h" #include "components/domain_reliability/uploader.h"
#include "components/domain_reliability/util.h" #include "components/domain_reliability/util.h"
#include "net/base/host_port_pair.h"
#include "net/base/load_timing_info.h" #include "net/base/load_timing_info.h"
#include "net/http/http_response_info.h"
#include "net/url_request/url_request_status.h" #include "net/url_request/url_request_status.h"
namespace net { namespace net {
...@@ -69,15 +69,13 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityMonitor { ...@@ -69,15 +69,13 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityMonitor {
explicit RequestInfo(const net::URLRequest& request); explicit RequestInfo(const net::URLRequest& request);
~RequestInfo(); ~RequestInfo();
bool DefinitelyReachedNetwork() const; bool AccessedNetwork() const;
GURL url; GURL url;
net::URLRequestStatus status; net::URLRequestStatus status;
int response_code; net::HttpResponseInfo response_info;
net::HostPortPair socket_address;
net::LoadTimingInfo load_timing_info;
bool was_cached;
int load_flags; int load_flags;
net::LoadTimingInfo load_timing_info;
bool is_upload; bool is_upload;
}; };
......
...@@ -11,11 +11,12 @@ ...@@ -11,11 +11,12 @@
#include "components/domain_reliability/util.h" #include "components/domain_reliability/util.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
using base::TimeDelta; using base::TimeDelta;
using base::TimeTicks; using base::TimeTicks;
namespace domain_reliability {
class DomainReliabilitySchedulerTest : public testing::Test { class DomainReliabilitySchedulerTest : public testing::Test {
public: public:
DomainReliabilitySchedulerTest() DomainReliabilitySchedulerTest()
...@@ -247,4 +248,5 @@ TEST_F(DomainReliabilitySchedulerTest, BeaconWhileUploading) { ...@@ -247,4 +248,5 @@ TEST_F(DomainReliabilitySchedulerTest, BeaconWhileUploading) {
ASSERT_TRUE(CheckNoPendingUpload()); ASSERT_TRUE(CheckNoPendingUpload());
} }
} // namespace
} // namespace domain_reliability } // namespace domain_reliability
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability { namespace domain_reliability {
namespace {
class DomainReliabilityUploaderTest : public testing::Test { class DomainReliabilityUploaderTest : public testing::Test {
protected: protected:
...@@ -105,4 +106,5 @@ TEST_F(DomainReliabilityUploaderTest, FailedUpload) { ...@@ -105,4 +106,5 @@ TEST_F(DomainReliabilityUploaderTest, FailedUpload) {
EXPECT_FALSE(upload_successful_[0]); EXPECT_FALSE(upload_successful_[0]);
} }
} // namespace
} // namespace domain_reliability } // namespace domain_reliability
...@@ -8,11 +8,12 @@ ...@@ -8,11 +8,12 @@
#include "components/domain_reliability/test_util.h" #include "components/domain_reliability/test_util.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
using base::TimeDelta; using base::TimeDelta;
using base::TimeTicks; using base::TimeTicks;
namespace domain_reliability {
class DomainReliabilityMockTimeTest : public testing::Test { class DomainReliabilityMockTimeTest : public testing::Test {
protected: protected:
MockTime time_; MockTime time_;
...@@ -120,4 +121,5 @@ TEST_F(DomainReliabilityMockTimeTest, TimerReentrantStart) { ...@@ -120,4 +121,5 @@ TEST_F(DomainReliabilityMockTimeTest, TimerReentrantStart) {
EXPECT_FALSE(timer->IsRunning()); EXPECT_FALSE(timer->IsRunning());
} }
} // namespace
} // namespace domain_reliability } // namespace domain_reliability
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