config.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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 3// found in the LICENSE file. 4 5#include "components/domain_reliability/config.h" 6 7#include "base/json/json_reader.h" 8#include "base/json/json_value_converter.h" 9#include "base/rand_util.h" 10#include "base/strings/string_util.h" 11 12namespace { 13 14bool ConvertURL(const base::StringPiece& string_piece, GURL* url) { 15 *url = GURL(string_piece.as_string()); 16 return url->is_valid(); 17} 18 19bool IsValidSampleRate(double p) { return p >= 0.0 && p <= 1.0; } 20 21} // namespace 22 23namespace domain_reliability { 24 25DomainReliabilityConfig::Resource::Resource() {} 26 27DomainReliabilityConfig::Resource::~Resource() {} 28 29bool DomainReliabilityConfig::Resource::MatchesUrlString( 30 const std::string& url_string) const { 31 ScopedVector<std::string>::const_iterator it; 32 33 for (it = url_patterns.begin(); it != url_patterns.end(); it++) { 34 if (MatchPattern(url_string, **it)) 35 return true; 36 } 37 38 return false; 39} 40 41bool DomainReliabilityConfig::Resource::DecideIfShouldReportRequest( 42 bool success) const { 43 double sample_rate = success ? success_sample_rate : failure_sample_rate; 44 return base::RandDouble() < sample_rate; 45} 46 47// static 48void DomainReliabilityConfig::Resource::RegisterJSONConverter( 49 base::JSONValueConverter<DomainReliabilityConfig::Resource>* converter) { 50 converter->RegisterStringField("resource_name", &Resource::name); 51 converter->RegisterRepeatedString("url_patterns", &Resource::url_patterns); 52 converter->RegisterDoubleField("success_sample_rate", 53 &Resource::success_sample_rate); 54 converter->RegisterDoubleField("failure_sample_rate", 55 &Resource::failure_sample_rate); 56} 57 58bool DomainReliabilityConfig::Resource::IsValid() const { 59 return !name.empty() && !url_patterns.empty() && 60 IsValidSampleRate(success_sample_rate) && 61 IsValidSampleRate(failure_sample_rate); 62} 63 64DomainReliabilityConfig::Collector::Collector() {} 65 66DomainReliabilityConfig::Collector::~Collector() {} 67 68// static 69void DomainReliabilityConfig::Collector::RegisterJSONConverter( 70 base::JSONValueConverter<DomainReliabilityConfig::Collector>* converter) { 71 converter->RegisterCustomField<GURL>("upload_url", &Collector::upload_url, 72 &ConvertURL); 73} 74 75bool DomainReliabilityConfig::Collector::IsValid() const { 76 return upload_url.is_valid(); 77} 78 79DomainReliabilityConfig::DomainReliabilityConfig() : valid_until(0.0) {} 80 81DomainReliabilityConfig::~DomainReliabilityConfig() {} 82 83// static 84scoped_ptr<const DomainReliabilityConfig> DomainReliabilityConfig::FromJSON( 85 const base::StringPiece& json) { 86 base::Value* value = base::JSONReader::Read(json); 87 if (!value) 88 return scoped_ptr<const DomainReliabilityConfig>(); 89 90 DomainReliabilityConfig* config = new DomainReliabilityConfig(); 91 base::JSONValueConverter<DomainReliabilityConfig> converter; 92 if (!converter.Convert(*value, config)) { 93 return scoped_ptr<const DomainReliabilityConfig>(); 94 } 95 96 if (!config->IsValid()) 97 return scoped_ptr<const DomainReliabilityConfig>(); 98 99 return scoped_ptr<const DomainReliabilityConfig>(config); 100} 101 102bool DomainReliabilityConfig::IsValid() const { 103 if (valid_until == 0.0 || domain.empty() || resources.empty() || 104 collectors.empty()) { 105 return false; 106 } 107 108 for (size_t i = 0; i < resources.size(); ++i) { 109 if (!resources[i]->IsValid()) 110 return false; 111 } 112 113 for (size_t i = 0; i < collectors.size(); ++i) { 114 if (!collectors[i]->IsValid()) 115 return false; 116 } 117 118 return true; 119} 120 121bool DomainReliabilityConfig::IsExpired(base::Time now) const { 122 return now < base::Time::FromDoubleT(valid_until); 123} 124 125int DomainReliabilityConfig::GetResourceIndexForUrl(const GURL& url) const { 126 const std::string& url_string = url.spec(); 127 128 for (size_t i = 0; i < resources.size(); ++i) { 129 if (resources[i]->MatchesUrlString(url_string)) 130 return static_cast<int>(i); 131 } 132 133 return -1; 134} 135 136// static 137void DomainReliabilityConfig::RegisterJSONConverter( 138 base::JSONValueConverter<DomainReliabilityConfig>* converter) { 139 converter->RegisterStringField("config_version", 140 &DomainReliabilityConfig::version); 141 converter->RegisterDoubleField("config_valid_until", 142 &DomainReliabilityConfig::valid_until); 143 converter->RegisterStringField("monitored_domain", 144 &DomainReliabilityConfig::domain); 145 converter->RegisterRepeatedMessage("monitored_resources", 146 &DomainReliabilityConfig::resources); 147 converter->RegisterRepeatedMessage("collectors", 148 &DomainReliabilityConfig::collectors); 149} 150 151} // namespace domain_reliability 152