| Index: net/reporting/reporting_service.h
|
| diff --git a/net/reporting/reporting_service.h b/net/reporting/reporting_service.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c1625b5ad3b8ba6bed11dce112fe0f9d9cbb8959
|
| --- /dev/null
|
| +++ b/net/reporting/reporting_service.h
|
| @@ -0,0 +1,126 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef NET_REPORTING_REPORTING_SERVICE_H_
|
| +#define NET_REPORTING_REPORTING_SERVICE_H_
|
| +
|
| +#include <map>
|
| +#include <unordered_set>
|
| +
|
| +#include "base/callback.h"
|
| +#include "base/macros.h"
|
| +#include "base/time/tick_clock.h"
|
| +#include "base/time/time.h"
|
| +#include "base/values.h"
|
| +#include "net/base/backoff_entry.h"
|
| +#include "net/base/net_export.h"
|
| +#include "net/base/network_change_notifier.h"
|
| +#include "net/reporting/reporting_uploader.h"
|
| +#include "net/url_request/url_request_context_getter.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace net {
|
| +
|
| +class NET_EXPORT ReportingService
|
| + : public NetworkChangeNotifier::NetworkChangeObserver {
|
| + public:
|
| + struct NET_EXPORT Policy {
|
| + // Constructs a default policy that is appropriate for use in a browser
|
| + // context.
|
| + Policy();
|
| +
|
| + // Returns a default policy that is appropriate for use in non-browser
|
| + // contexts. Notably, some parameters are tweaked to prioritize reliability
|
| + // of report delivery in ways that would inappropriately allow correlation
|
| + // of user behavior across networks in a browser context.
|
| + static Policy GetNonBrowserDefault();
|
| +
|
| + // Time to keep an unused endpoint around, or zero for no limit.
|
| + base::TimeDelta endpoint_lifetime;
|
| + // Exponential backoff policy for uploading to endpoints.
|
| + BackoffEntry::Policy endpoint_backoff;
|
| + // Maximum number of failures before discarding an endpoint (once the
|
| + // BackoffEntry is okay with it).
|
| + int max_endpoint_failures;
|
| + // Maximum number of endpoints to keep around.
|
| + size_t max_endpoint_count;
|
| +
|
| + // Time to keep a queued report around.
|
| + base::TimeDelta report_lifetime;
|
| + // Maximum number of failed delivery attempts before discarding a report.
|
| + size_t max_report_failures;
|
| + // Maximum number of queued reports to keep around.
|
| + size_t max_report_count;
|
| +
|
| + // Whether to persist the report queue across network changes or not.
|
| + bool persist_reports_across_network_changes;
|
| + };
|
| +
|
| + ReportingService(const Policy& policy);
|
| + ~ReportingService() override;
|
| +
|
| + void set_uploader(std::unique_ptr<ReportingUploader> uploader);
|
| + void QueueReport(std::unique_ptr<base::Value> body,
|
| + const GURL& url,
|
| + const GURL& origin,
|
| + const std::string& group,
|
| + const std::string& type);
|
| + void ProcessHeader(const GURL& origin, const std::string& header_value);
|
| + void SendReports();
|
| +
|
| + // NetworkChangeNotifier::NetworkChangeObserver implementation:
|
| + void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override;
|
| +
|
| + void set_clock_for_testing(std::unique_ptr<base::TickClock> clock);
|
| + size_t GetReportCountForTesting();
|
| + bool HasEndpointForTesting(const GURL& endpoint_url);
|
| + bool HasClientForTesting(const GURL& endpoint_url, const GURL& origin_url);
|
| + int GetEndpointFailuresForTesting(const GURL& endpoint_url);
|
| + void CollectGarbageForTesting();
|
| +
|
| + private:
|
| + // Per-origin configuration and state for an endpoint.
|
| + struct Client;
|
| +
|
| + // An endpoint to which one or more origins (represented by clients) want to
|
| + // upload reports.
|
| + struct Endpoint;
|
| +
|
| + // A report queued by another component to be delivered by Reporting.
|
| + class Report;
|
| +
|
| + // The parsed data from a header representing a single endpoint configuration.
|
| + struct EndpointTuple;
|
| +
|
| + struct Delivery;
|
| +
|
| + using EndpointMap = std::map<GURL, std::unique_ptr<Endpoint>>;
|
| + // TODO: Switch to a linked list for faster removal.
|
| + using ReportVector = std::vector<std::unique_ptr<Report>>;
|
| +
|
| + void ProcessEndpointTuple(const GURL& origin, const EndpointTuple& tuple);
|
| +
|
| + void OnDeliveryAttemptComplete(const std::unique_ptr<Delivery>& delivery,
|
| + ReportingUploader::Outcome outcome);
|
| +
|
| + void CollectGarbage();
|
| +
|
| + Endpoint* FindEndpointForReport(const Report& report);
|
| + bool DoesEndpointMatchReport(const Endpoint& endpoint, const Report& report);
|
| + std::string SerializeReports(const std::vector<Report*>& reports);
|
| +
|
| + Endpoint* GetEndpointByURL(const GURL& url);
|
| + void DequeueReport(Report* report);
|
| +
|
| + Policy policy_;
|
| + std::unique_ptr<base::TickClock> clock_;
|
| + std::unique_ptr<ReportingUploader> uploader_;
|
| +
|
| + ReportVector reports_;
|
| + EndpointMap endpoints_;
|
| +};
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // COMPONENTS_REPORTING_REPORTING_SERVICE_H_
|
|
|