| // Copyright 2014 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. | 
 |  | 
 | // Make sure stdint.h includes SIZE_MAX. (See C89, p259, footnote 221.) | 
 | #ifndef __STDC_LIMIT_MACROS | 
 | #define __STDC_LIMIT_MACROS 1 | 
 | #endif | 
 |  | 
 | #include "components/domain_reliability/config.h" | 
 |  | 
 | #include <stdint.h> | 
 | #include <utility> | 
 |  | 
 | #include "base/json/json_reader.h" | 
 | #include "base/strings/pattern.h" | 
 | #include "base/strings/string_util.h" | 
 |  | 
 | namespace { | 
 |  | 
 | bool ConvertURL(const base::Value* value, GURL* url) { | 
 |   std::string url_string; | 
 |   if (!value->GetAsString(&url_string)) | 
 |     return false; | 
 |   *url = GURL(url_string); | 
 |   return url->is_valid(); | 
 | } | 
 |  | 
 | bool ConvertOrigin(const base::Value* value, GURL* url) { | 
 |   return ConvertURL(value, url) && !url->has_username() && | 
 |          !url->has_password() && url->SchemeIs("https") && | 
 |          url->path_piece() == "/" && !url->has_query() && !url->has_ref(); | 
 | } | 
 |  | 
 | bool IsValidSampleRate(double p) { | 
 |   return p >= 0.0 && p <= 1.0; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | namespace domain_reliability { | 
 |  | 
 | DomainReliabilityConfig::DomainReliabilityConfig() | 
 |     : include_subdomains(false), | 
 |       success_sample_rate(-1.0), | 
 |       failure_sample_rate(-1.0) { | 
 | } | 
 | DomainReliabilityConfig::~DomainReliabilityConfig() {} | 
 |  | 
 | // static | 
 | std::unique_ptr<const DomainReliabilityConfig> | 
 | DomainReliabilityConfig::FromJSON(const base::StringPiece& json) { | 
 |   std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(json); | 
 |   base::JSONValueConverter<DomainReliabilityConfig> converter; | 
 |   std::unique_ptr<DomainReliabilityConfig> config( | 
 |       new DomainReliabilityConfig()); | 
 |  | 
 |   // If we can parse and convert the JSON into a valid config, return that. | 
 |   if (value && converter.Convert(*value, config.get()) && config->IsValid()) | 
 |     return std::move(config); | 
 |   return std::unique_ptr<const DomainReliabilityConfig>(); | 
 | } | 
 |  | 
 | bool DomainReliabilityConfig::IsValid() const { | 
 |   if (!origin.is_valid() || collectors.empty() || | 
 |       !IsValidSampleRate(success_sample_rate) || | 
 |       !IsValidSampleRate(failure_sample_rate)) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   for (const auto& url : collectors) { | 
 |     if (!url->is_valid()) | 
 |       return false; | 
 |   } | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | bool DomainReliabilityConfig::Equals(const DomainReliabilityConfig& other) | 
 |     const { | 
 |   if (include_subdomains != other.include_subdomains || | 
 |       collectors.size() != other.collectors.size() || | 
 |       success_sample_rate != other.success_sample_rate || | 
 |       failure_sample_rate != other.failure_sample_rate || | 
 |       path_prefixes.size() != other.path_prefixes.size()) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   for (size_t i = 0; i < collectors.size(); ++i) | 
 |     if (*collectors[i] != *other.collectors[i]) | 
 |       return false; | 
 |  | 
 |   for (size_t i = 0; i < path_prefixes.size(); ++i) | 
 |     if (*path_prefixes[i] != *other.path_prefixes[i]) | 
 |       return false; | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | double DomainReliabilityConfig::GetSampleRate(bool request_successful) const { | 
 |   return request_successful ? success_sample_rate : failure_sample_rate; | 
 | } | 
 |  | 
 | // static | 
 | void DomainReliabilityConfig::RegisterJSONConverter( | 
 |     base::JSONValueConverter<DomainReliabilityConfig>* converter) { | 
 |   converter->RegisterCustomValueField<GURL>( | 
 |       "origin", &DomainReliabilityConfig::origin, &ConvertOrigin); | 
 |   converter->RegisterBoolField("include_subdomains", | 
 |                                &DomainReliabilityConfig::include_subdomains); | 
 |   converter->RegisterRepeatedCustomValue( | 
 |       "collectors", &DomainReliabilityConfig::collectors, &ConvertURL); | 
 |   converter->RegisterRepeatedString("path_prefixes", | 
 |                                     &DomainReliabilityConfig::path_prefixes); | 
 |   converter->RegisterDoubleField("success_sample_rate", | 
 |                                  &DomainReliabilityConfig::success_sample_rate); | 
 |   converter->RegisterDoubleField("failure_sample_rate", | 
 |                                  &DomainReliabilityConfig::failure_sample_rate); | 
 | } | 
 |  | 
 | }  // namespace domain_reliability |