Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: components/domain_reliability/config.cc

Issue 1180223006: Domain Reliability: Simplify configs and reports (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase, make requested changes Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Make sure stdint.h includes SIZE_MAX. (See C89, p259, footnote 221.) 5 // Make sure stdint.h includes SIZE_MAX. (See C89, p259, footnote 221.)
6 #ifndef __STDC_LIMIT_MACROS 6 #ifndef __STDC_LIMIT_MACROS
7 #define __STDC_LIMIT_MACROS 1 7 #define __STDC_LIMIT_MACROS 1
8 #endif 8 #endif
9 9
10 #include "components/domain_reliability/config.h" 10 #include "components/domain_reliability/config.h"
11 11
12 #include <stdint.h> 12 #include <stdint.h>
13 13
14 #include "base/json/json_reader.h" 14 #include "base/json/json_reader.h"
15 #include "base/json/json_value_converter.h" 15 #include "base/json/json_value_converter.h"
16 #include "base/profiler/scoped_tracker.h" 16 #include "base/profiler/scoped_tracker.h"
17 #include "base/rand_util.h" 17 #include "base/rand_util.h"
18 #include "base/strings/pattern.h" 18 #include "base/strings/pattern.h"
19 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
20 20
21 namespace { 21 namespace {
22 22
23 bool ConvertURL(const base::StringPiece& string_piece, GURL* url) { 23 bool ConvertURL(const base::Value* value, GURL* url) {
24 *url = GURL(string_piece.as_string()); 24 std::string url_string;
25 if (!value->GetAsString(&url_string))
26 return false;
27 *url = GURL(url_string);
25 return url->is_valid(); 28 return url->is_valid();
26 } 29 }
27 30
28 bool IsValidSampleRate(double p) { return p >= 0.0 && p <= 1.0; } 31 bool ConvertOrigin(const base::Value* value, GURL* url) {
32 return ConvertURL(value, url) && !url->has_username() &&
33 !url->has_password() && url->SchemeIs("https") &&
34 url->path_piece() == "/" && !url->has_query() && !url->has_ref();
35 }
36
37 bool IsValidSampleRate(double p) {
38 return p >= 0.0 && p <= 1.0;
39 }
29 40
30 } // namespace 41 } // namespace
31 42
32 namespace domain_reliability { 43 namespace domain_reliability {
33 44
34 // static 45 DomainReliabilityConfig::DomainReliabilityConfig()
35 const size_t DomainReliabilityConfig::kInvalidResourceIndex = SIZE_MAX; 46 : success_sample_rate(-1.0), failure_sample_rate(-1.0) {
36
37 DomainReliabilityConfig::Resource::Resource() {
38 } 47 }
39 DomainReliabilityConfig::Resource::~Resource() {}
40
41 bool DomainReliabilityConfig::Resource::MatchesUrl(const GURL& url) const {
42 const std::string& spec = url.spec();
43
44 for (const auto& url_pattern : url_patterns) {
45 if (base::MatchPattern(spec, *url_pattern))
46 return true;
47 }
48
49 return false;
50 }
51
52 bool DomainReliabilityConfig::Resource::DecideIfShouldReportRequest(
53 bool success) const {
54 double sample_rate = success ? success_sample_rate : failure_sample_rate;
55 DCHECK(IsValidSampleRate(sample_rate));
56 return base::RandDouble() < sample_rate;
57 }
58
59 // static
60 void DomainReliabilityConfig::Resource::RegisterJSONConverter(
61 base::JSONValueConverter<DomainReliabilityConfig::Resource>* converter) {
62 converter->RegisterStringField("resource_name", &Resource::name);
63 converter->RegisterRepeatedString("url_patterns", &Resource::url_patterns);
64 converter->RegisterDoubleField("success_sample_rate",
65 &Resource::success_sample_rate);
66 converter->RegisterDoubleField("failure_sample_rate",
67 &Resource::failure_sample_rate);
68 }
69
70 bool DomainReliabilityConfig::Resource::IsValid() const {
71 return !name.empty() && !url_patterns.empty() &&
72 IsValidSampleRate(success_sample_rate) &&
73 IsValidSampleRate(failure_sample_rate);
74 }
75
76 DomainReliabilityConfig::Collector::Collector() {}
77 DomainReliabilityConfig::Collector::~Collector() {}
78
79 // static
80 void DomainReliabilityConfig::Collector::RegisterJSONConverter(
81 base::JSONValueConverter<DomainReliabilityConfig::Collector>* converter) {
82 converter->RegisterCustomField<GURL>("upload_url", &Collector::upload_url,
83 &ConvertURL);
84 }
85
86 bool DomainReliabilityConfig::Collector::IsValid() const {
87 return upload_url.is_valid();
88 }
89
90 DomainReliabilityConfig::DomainReliabilityConfig() {}
91 DomainReliabilityConfig::~DomainReliabilityConfig() {} 48 DomainReliabilityConfig::~DomainReliabilityConfig() {}
92 49
93 // static 50 // static
94 scoped_ptr<const DomainReliabilityConfig> DomainReliabilityConfig::FromJSON( 51 scoped_ptr<const DomainReliabilityConfig> DomainReliabilityConfig::FromJSON(
95 const base::StringPiece& json) { 52 const base::StringPiece& json) {
96 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436671 is fixed. 53 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436671 is fixed.
97 tracked_objects::ScopedTracker tracking_profile( 54 tracked_objects::ScopedTracker tracking_profile(
98 FROM_HERE_WITH_EXPLICIT_FUNCTION( 55 FROM_HERE_WITH_EXPLICIT_FUNCTION(
99 "436671 DomainReliabilityConfig::FromJSON")); 56 "436671 DomainReliabilityConfig::FromJSON"));
100 scoped_ptr<base::Value> value = base::JSONReader::Read(json); 57 scoped_ptr<base::Value> value = base::JSONReader::Read(json);
101 base::JSONValueConverter<DomainReliabilityConfig> converter; 58 base::JSONValueConverter<DomainReliabilityConfig> converter;
102 scoped_ptr<DomainReliabilityConfig> config(new DomainReliabilityConfig()); 59 scoped_ptr<DomainReliabilityConfig> config(new DomainReliabilityConfig());
103 60
104 // If we can parse and convert the JSON into a valid config, return that. 61 // If we can parse and convert the JSON into a valid config, return that.
105 if (value && converter.Convert(*value, config.get()) && config->IsValid()) 62 if (value && converter.Convert(*value, config.get()) && config->IsValid())
106 return config.Pass(); 63 return config.Pass();
107 return scoped_ptr<const DomainReliabilityConfig>(); 64 return scoped_ptr<const DomainReliabilityConfig>();
108 } 65 }
109 66
110 bool DomainReliabilityConfig::IsValid() const { 67 bool DomainReliabilityConfig::IsValid() const {
111 if (domain.empty() || resources.empty() || collectors.empty()) 68 if (!origin.is_valid() || collectors.empty() ||
69 !IsValidSampleRate(success_sample_rate) ||
70 !IsValidSampleRate(failure_sample_rate)) {
112 return false; 71 return false;
113
114 for (auto& resource : resources) {
115 if (!resource->IsValid())
116 return false;
117 } 72 }
118 73
119 for (auto& collector : collectors) { 74 for (const auto& url : collectors) {
120 if (!collector->IsValid()) 75 if (!url->is_valid())
121 return false; 76 return false;
122 } 77 }
123 78
124 return true; 79 return true;
125 } 80 }
126 81
127 size_t DomainReliabilityConfig::GetResourceIndexForUrl(const GURL& url) const { 82 bool DomainReliabilityConfig::DecideIfShouldReportRequest(bool success) const {
128 // Removes username, password, and fragment. 83 double sample_rate = success ? success_sample_rate : failure_sample_rate;
129 GURL sanitized_url = url.GetAsReferrer(); 84 return base::RandDouble() < sample_rate;
130
131 for (size_t i = 0; i < resources.size(); ++i) {
132 if (resources[i]->MatchesUrl(sanitized_url))
133 return i;
134 }
135
136 return kInvalidResourceIndex;
137 } 85 }
138 86
139 // static 87 // static
140 void DomainReliabilityConfig::RegisterJSONConverter( 88 void DomainReliabilityConfig::RegisterJSONConverter(
141 base::JSONValueConverter<DomainReliabilityConfig>* converter) { 89 base::JSONValueConverter<DomainReliabilityConfig>* converter) {
142 converter->RegisterStringField("config_version", 90 converter->RegisterCustomValueField<GURL>(
143 &DomainReliabilityConfig::version); 91 "origin", &DomainReliabilityConfig::origin, &ConvertOrigin);
144 converter->RegisterStringField("monitored_domain", 92 converter->RegisterBoolField("include_subdomains",
145 &DomainReliabilityConfig::domain); 93 &DomainReliabilityConfig::include_subdomains);
146 converter->RegisterRepeatedMessage("monitored_resources", 94 converter->RegisterRepeatedCustomValue(
147 &DomainReliabilityConfig::resources); 95 "collectors", &DomainReliabilityConfig::collectors, &ConvertURL);
148 converter->RegisterRepeatedMessage("collectors", 96 converter->RegisterRepeatedString("path_prefixes",
149 &DomainReliabilityConfig::collectors); 97 &DomainReliabilityConfig::path_prefixes);
98 converter->RegisterDoubleField("success_sample_rate",
99 &DomainReliabilityConfig::success_sample_rate);
100 converter->RegisterDoubleField("failure_sample_rate",
101 &DomainReliabilityConfig::failure_sample_rate);
150 } 102 }
151 103
152 } // namespace domain_reliability 104 } // namespace domain_reliability
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698