Index: components/domain_reliability/monitor.cc |
diff --git a/components/domain_reliability/monitor.cc b/components/domain_reliability/monitor.cc |
index 29b276d50630a62b9e2bcce20c1583e2ddc044f0..d09aa217f610c8cd936b604df8dd8bb221988161 100644 |
--- a/components/domain_reliability/monitor.cc |
+++ b/components/domain_reliability/monitor.cc |
@@ -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 |