Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_REPORTING_REPORTING_SERVICE_H_ | |
| 6 #define NET_REPORTING_REPORTING_SERVICE_H_ | |
| 7 | |
| 8 #include <map> | |
| 9 #include <unordered_set> | |
| 10 | |
| 11 #include "base/callback.h" | |
| 12 #include "base/macros.h" | |
| 13 #include "base/time/tick_clock.h" | |
| 14 #include "base/time/time.h" | |
| 15 #include "base/values.h" | |
| 16 #include "net/base/backoff_entry.h" | |
| 17 #include "net/base/net_export.h" | |
| 18 #include "net/reporting/reporting_metrics.h" | |
| 19 #include "net/reporting/reporting_report.h" | |
| 20 #include "net/reporting/reporting_uploader.h" | |
| 21 #include "net/url_request/url_request_context_getter.h" | |
| 22 #include "url/gurl.h" | |
| 23 | |
| 24 namespace net { | |
| 25 | |
| 26 class NET_EXPORT ReportingService { | |
|
Ryan Sleevi
2017/01/03 21:28:13
High level Design remarks:
1) This feels like a lo
Julia Tuttle
2017/01/25 20:27:46
My original design had a separate "ReportingCache"
| |
| 27 public: | |
| 28 struct NET_EXPORT Policy { | |
| 29 // Time to keep an unused endpoint around, or zero for no limit. | |
| 30 base::TimeDelta endpoint_lifetime; | |
| 31 // Exponential backoff policy for uploading to endpoints. | |
| 32 BackoffEntry::Policy endpoint_backoff; | |
| 33 // Maximum number of failures before discarding an endpoint (once the | |
| 34 // BackoffEntry is okay with it), or -1 for no limit. | |
| 35 int max_endpoint_failures; | |
| 36 // Maximum number of endpoints to keep around, or 0u for no limit. | |
| 37 size_t max_endpoint_count; | |
| 38 | |
| 39 // Time to keep a queued report around, or zero for no limit. | |
| 40 base::TimeDelta report_lifetime; | |
| 41 // Maximum number of failed delivery attempts before discarding a report, or | |
| 42 // -1 for no limit. | |
| 43 int max_report_failures; | |
| 44 // Maximum number of queued reports to keep around, or 0u for no limit. | |
| 45 size_t max_report_count; | |
| 46 | |
| 47 // Whether to persist the report queue across network changes or not. | |
| 48 bool persist_reports_across_network_changes; | |
| 49 | |
| 50 static Policy GetDefault(); | |
|
Ryan Sleevi
2017/01/03 21:28:13
DESIGN: Why is an explicit GetDefault required? Wh
Julia Tuttle
2017/01/25 20:27:46
Done.
| |
| 51 }; | |
| 52 | |
| 53 ReportingService(const Policy& policy); | |
| 54 ~ReportingService(); | |
| 55 | |
| 56 void set_uploader(std::unique_ptr<ReportingUploader> uploader); | |
|
Ryan Sleevi
2017/01/03 21:28:13
This seems to have more subtlety than just "set_up
Julia Tuttle
2017/01/25 20:27:46
Not really; it's just a separate setter instead of
| |
| 57 void QueueReport(std::unique_ptr<base::Value> body, | |
| 58 const GURL& url, | |
| 59 const GURL& origin, | |
| 60 const std::string& group, | |
| 61 const std::string& type); | |
| 62 void ProcessHeader(const GURL& origin, const std::string& header_value); | |
| 63 void SendReports(); | |
| 64 | |
| 65 void set_clock_for_testing(std::unique_ptr<base::TickClock> clock); | |
|
Ryan Sleevi
2017/01/03 21:28:13
SetClockForTesting
Julia Tuttle
2017/01/25 20:27:46
Why? It is actually just a plain setter under the
| |
| 66 bool HasEndpointForTesting(const GURL& endpoint_url); | |
| 67 bool HasClientForTesting(const GURL& endpoint_url, const GURL& origin_url); | |
| 68 int GetEndpointFailuresForTesting(const GURL& endpoint_url); | |
| 69 void CollectGarbageForTesting(); | |
| 70 | |
| 71 private: | |
| 72 // Per-origin configuration and state for an endpoint. | |
| 73 struct Client { | |
|
Ryan Sleevi
2017/01/03 21:28:13
Why can't you forward declare this?
Julia Tuttle
2017/01/25 20:27:46
Done.
| |
| 74 public: | |
| 75 Client(const GURL& origin, | |
| 76 bool subdomains, | |
| 77 const std::string& group, | |
| 78 base::TimeDelta ttl, | |
| 79 base::TimeTicks creation); | |
| 80 | |
| 81 GURL origin; | |
| 82 bool subdomains; | |
| 83 std::string group; | |
| 84 base::TimeDelta ttl; | |
| 85 base::TimeTicks creation; | |
| 86 | |
| 87 bool is_expired(base::TimeTicks now) const { return creation + ttl < now; } | |
| 88 }; | |
| 89 | |
| 90 // An endpoint to which one or more origins (represented by clients) want to | |
| 91 // upload reports. | |
| 92 struct Endpoint { | |
|
Ryan Sleevi
2017/01/03 21:28:13
Why can't you forward declare this?
Julia Tuttle
2017/01/25 20:27:46
Done.
| |
| 93 public: | |
| 94 Endpoint(const GURL& url, | |
| 95 const BackoffEntry::Policy& backoff_policy, | |
| 96 base::TickClock* clock); | |
| 97 ~Endpoint(); | |
| 98 | |
| 99 const GURL url; | |
| 100 | |
| 101 BackoffEntry backoff; | |
| 102 // For LRU eviction of endpoints. | |
| 103 base::TimeTicks last_used; | |
| 104 // Whether we currently have an upload in progress to this endpoint. | |
| 105 bool pending; | |
| 106 | |
| 107 // Map from client.origin to client. | |
| 108 std::map<GURL, Client> clients; | |
| 109 | |
| 110 bool is_expired(base::TimeTicks now) const; | |
| 111 }; | |
| 112 | |
| 113 // The parsed data from a header representing a single endpoint configuration. | |
| 114 struct EndpointTuple { | |
|
Ryan Sleevi
2017/01/03 21:28:13
Why can't you forward declare this?
Julia Tuttle
2017/01/25 20:27:46
Done.
| |
| 115 GURL url; | |
| 116 bool subdomains; | |
| 117 base::TimeDelta ttl; | |
| 118 std::string group; | |
| 119 | |
| 120 static bool FromDictionary(const base::DictionaryValue& dictionary, | |
| 121 EndpointTuple* tuple_out, | |
| 122 std::string* error_out); | |
| 123 static bool FromHeader(const std::string& header, | |
| 124 std::vector<EndpointTuple>* tuples_out, | |
| 125 std::vector<std::string>* errors_out); | |
| 126 | |
| 127 std::string ToString() const; | |
| 128 }; | |
| 129 | |
| 130 struct Delivery { | |
|
Ryan Sleevi
2017/01/03 21:28:13
Why can't you forward declare this?
Julia Tuttle
2017/01/25 20:27:46
Done.
| |
| 131 Delivery(const GURL& endpoint_url, | |
| 132 const std::vector<ReportingReport*>& reports); | |
| 133 ~Delivery(); | |
| 134 | |
| 135 const GURL& endpoint_url; | |
| 136 const std::vector<ReportingReport*> reports; | |
| 137 }; | |
| 138 | |
| 139 using EndpointMap = std::map<GURL, std::unique_ptr<Endpoint>>; | |
| 140 using ReportVector = std::vector<std::unique_ptr<ReportingReport>>; | |
| 141 | |
| 142 void ProcessEndpointTuple(const GURL& origin, const EndpointTuple& tuple); | |
| 143 | |
| 144 void OnDeliveryAttemptComplete(const std::unique_ptr<Delivery>& delivery, | |
| 145 ReportingUploader::Outcome outcome); | |
| 146 | |
| 147 void CollectGarbage(); | |
| 148 | |
| 149 Endpoint* FindEndpointForReport(const ReportingReport& report); | |
| 150 bool DoesEndpointMatchReport(const Endpoint& endpoint, | |
| 151 const ReportingReport& report); | |
| 152 std::string SerializeReports(const std::vector<ReportingReport*>& reports); | |
| 153 | |
| 154 Endpoint* GetEndpointByURL(const GURL& url); | |
| 155 void DequeueReport(ReportingReport* report); | |
| 156 | |
| 157 void HistogramHeaderEndpointInternal(bool endpoint_exists, | |
| 158 bool client_exists, | |
| 159 base::TimeDelta ttl) const; | |
| 160 void HistogramReportInternal(ReportFate fate, | |
| 161 const ReportingReport& report) const; | |
| 162 | |
| 163 Policy policy_; | |
| 164 std::unique_ptr<base::TickClock> clock_; | |
| 165 std::unique_ptr<ReportingUploader> uploader_; | |
| 166 | |
| 167 ReportVector reports_; | |
| 168 EndpointMap endpoints_; | |
| 169 }; | |
| 170 | |
| 171 } // namespace net | |
| 172 | |
| 173 #endif // COMPONENTS_REPORTING_REPORTING_SERVICE_H_ | |
| OLD | NEW |