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) {
return config->GetResourceIndexForUrl(GURL(url_string));
}
} // namespace
class DomainReliabilityConfigTest : public testing::Test { };
TEST_F(DomainReliabilityConfigTest, IsValid) {
......@@ -209,4 +207,5 @@ TEST_F(DomainReliabilityConfigTest, FromJSON) {
config->collectors[0]->upload_url);
}
} // namespace
} // namespace domain_reliability
......@@ -141,9 +141,9 @@ void DomainReliabilityContext::OnBeacon(const GURL& url,
return;
DCHECK_GT(states_.size(), index);
bool success = (beacon.status == "ok");
ResourceState* state = states_[index];
bool success = beacon.http_response_code >= 200 &&
beacon.http_response_code < 400;
if (success)
++state->successful_requests;
else
......
......@@ -33,8 +33,6 @@ DomainReliabilityBeacon MakeBeacon(MockableTime* time) {
return beacon;
}
} // namespace
class DomainReliabilityContextTest : public testing::Test {
protected:
DomainReliabilityContextTest()
......@@ -211,4 +209,5 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) {
CallUploadCallback(true);
}
} // namespace
} // namespace domain_reliability
......@@ -8,11 +8,12 @@
#include "components/domain_reliability/test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
using base::TimeDelta;
using base::TimeTicks;
namespace domain_reliability {
class DomainReliabilityDispatcherTest : public testing::Test {
public:
DomainReliabilityDispatcherTest() : dispatcher_(&time_) {}
......@@ -58,4 +59,5 @@ TEST_F(DomainReliabilityDispatcherTest, TaskRunsAtDeadline) {
EXPECT_TRUE(callback.called());
}
} // namespace
} // namespace domain_reliability
......@@ -12,6 +12,7 @@
#include "components/domain_reliability/baked_in_configs.h"
#include "content/public/browser/browser_thread.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_context.h"
#include "net/url_request/url_request_context_getter.h"
......@@ -122,7 +123,7 @@ void DomainReliabilityMonitor::OnCompleted(net::URLRequest* request,
if (!started)
return;
RequestInfo request_info(*request);
if (request_info.DefinitelyReachedNetwork()) {
if (request_info.AccessedNetwork()) {
OnRequestLegComplete(request_info);
// A request was just using the network, so now is a good time to run any
// pending and eligible uploads.
......@@ -141,21 +142,17 @@ DomainReliabilityMonitor::RequestInfo::RequestInfo(
const net::URLRequest& request)
: url(request.url()),
status(request.status()),
response_code(-1),
socket_address(request.GetSocketAddress()),
was_cached(request.was_cached()),
response_info(request.response_info()),
load_flags(request.load_flags()),
is_upload(DomainReliabilityUploader::URLRequestIsUpload(request)) {
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() {}
bool DomainReliabilityMonitor::RequestInfo::DefinitelyReachedNetwork() const {
return status.status() != net::URLRequestStatus::CANCELED && !was_cached;
bool DomainReliabilityMonitor::RequestInfo::AccessedNetwork() const {
return status.status() != net::URLRequestStatus::CANCELED &&
response_info.network_accessed;
}
DomainReliabilityContext* DomainReliabilityMonitor::AddContext(
......@@ -184,41 +181,42 @@ DomainReliabilityContext* DomainReliabilityMonitor::AddContext(
void DomainReliabilityMonitor::OnRequestLegComplete(
const RequestInfo& request) {
if (!request.DefinitelyReachedNetwork())
return;
// Don't monitor requests that are not sending cookies, since sending a beacon
// for such requests may allow the server to correlate that request with the
// user (by correlating a particular config).
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;
int response_code;
if (request.response_info.headers)
response_code = request.response_info.headers->response_code();
else
response_code = -1;
ContextMap::iterator context_it;
std::string beacon_status;
bool got_status = GetDomainReliabilityBeaconStatus(
request.status.error(),
request.response_code,
&beacon_status);
if (!got_status)
// Ignore requests where:
// 1. There is no context for the request host.
// 2. The request did not access the network.
// 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;
}
DomainReliabilityBeacon beacon;
beacon.status = beacon_status;
beacon.chrome_error = request.status.error();
beacon.server_ip = request.socket_address.host();
beacon.http_response_code = request.response_code;
if (!request.response_info.was_fetched_via_proxy)
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.elapsed = time_->NowTicks() - beacon.start_time;
context->OnBeacon(request.url, beacon);
context_it->second->OnBeacon(request.url, beacon);
}
} // namespace domain_reliability
......@@ -17,8 +17,8 @@
#include "components/domain_reliability/scheduler.h"
#include "components/domain_reliability/uploader.h"
#include "components/domain_reliability/util.h"
#include "net/base/host_port_pair.h"
#include "net/base/load_timing_info.h"
#include "net/http/http_response_info.h"
#include "net/url_request/url_request_status.h"
namespace net {
......@@ -69,15 +69,13 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityMonitor {
explicit RequestInfo(const net::URLRequest& request);
~RequestInfo();
bool DefinitelyReachedNetwork() const;
bool AccessedNetwork() const;
GURL url;
net::URLRequestStatus status;
int response_code;
net::HostPortPair socket_address;
net::LoadTimingInfo load_timing_info;
bool was_cached;
net::HttpResponseInfo response_info;
int load_flags;
net::LoadTimingInfo load_timing_info;
bool is_upload;
};
......
......@@ -11,11 +11,12 @@
#include "components/domain_reliability/util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
using base::TimeDelta;
using base::TimeTicks;
namespace domain_reliability {
class DomainReliabilitySchedulerTest : public testing::Test {
public:
DomainReliabilitySchedulerTest()
......@@ -247,4 +248,5 @@ TEST_F(DomainReliabilitySchedulerTest, BeaconWhileUploading) {
ASSERT_TRUE(CheckNoPendingUpload());
}
} // namespace
} // namespace domain_reliability
......@@ -18,6 +18,7 @@
#include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
class DomainReliabilityUploaderTest : public testing::Test {
protected:
......@@ -105,4 +106,5 @@ TEST_F(DomainReliabilityUploaderTest, FailedUpload) {
EXPECT_FALSE(upload_successful_[0]);
}
} // namespace
} // namespace domain_reliability
......@@ -8,11 +8,12 @@
#include "components/domain_reliability/test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace domain_reliability {
namespace {
using base::TimeDelta;
using base::TimeTicks;
namespace domain_reliability {
class DomainReliabilityMockTimeTest : public testing::Test {
protected:
MockTime time_;
......@@ -120,4 +121,5 @@ TEST_F(DomainReliabilityMockTimeTest, TimerReentrantStart) {
EXPECT_FALSE(timer->IsRunning());
}
} // namespace
} // 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