config.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. #include "components/domain_reliability/config.h"
  5. #include <utility>
  6. #include "base/json/json_reader.h"
  7. #include "third_party/abseil-cpp/absl/types/optional.h"
  8. #include "url/url_constants.h"
  9. namespace {
  10. bool ConvertURL(const base::Value* value, GURL* url) {
  11. if (!value->is_string())
  12. return false;
  13. *url = GURL(value->GetString());
  14. return url->is_valid();
  15. }
  16. bool ConvertOrigin(const base::Value* value, url::Origin* origin) {
  17. GURL url;
  18. if (ConvertURL(value, &url) && !url.has_username() && !url.has_password() &&
  19. url.SchemeIs(url::kHttpsScheme) && url.path_piece() == "/" &&
  20. !url.has_query() && !url.has_ref()) {
  21. *origin = url::Origin::Create(url);
  22. return true;
  23. }
  24. return false;
  25. }
  26. bool IsValidSampleRate(double p) {
  27. return p >= 0.0 && p <= 1.0;
  28. }
  29. } // namespace
  30. namespace domain_reliability {
  31. DomainReliabilityConfig::DomainReliabilityConfig()
  32. : include_subdomains(false),
  33. success_sample_rate(-1.0),
  34. failure_sample_rate(-1.0) {
  35. }
  36. DomainReliabilityConfig::~DomainReliabilityConfig() {}
  37. // static
  38. std::unique_ptr<const DomainReliabilityConfig>
  39. DomainReliabilityConfig::FromJSON(const base::StringPiece& json) {
  40. absl::optional<base::Value> value = base::JSONReader::Read(json);
  41. if (!value)
  42. return nullptr;
  43. base::JSONValueConverter<DomainReliabilityConfig> converter;
  44. auto config = std::make_unique<DomainReliabilityConfig>();
  45. // If we can parse and convert the JSON into a valid config, return that.
  46. if (converter.Convert(*value, config.get()) && config->IsValid())
  47. return config;
  48. return nullptr;
  49. }
  50. bool DomainReliabilityConfig::IsValid() const {
  51. if (origin.opaque() || collectors.empty() ||
  52. !IsValidSampleRate(success_sample_rate) ||
  53. !IsValidSampleRate(failure_sample_rate)) {
  54. return false;
  55. }
  56. for (const auto& url : collectors) {
  57. if (!url->SchemeIs(url::kHttpsScheme) || !url->is_valid())
  58. return false;
  59. }
  60. return true;
  61. }
  62. double DomainReliabilityConfig::GetSampleRate(bool request_successful) const {
  63. return request_successful ? success_sample_rate : failure_sample_rate;
  64. }
  65. // static
  66. void DomainReliabilityConfig::RegisterJSONConverter(
  67. base::JSONValueConverter<DomainReliabilityConfig>* converter) {
  68. converter->RegisterCustomValueField<url::Origin>(
  69. "origin", &DomainReliabilityConfig::origin, &ConvertOrigin);
  70. converter->RegisterBoolField("include_subdomains",
  71. &DomainReliabilityConfig::include_subdomains);
  72. converter->RegisterRepeatedCustomValue(
  73. "collectors", &DomainReliabilityConfig::collectors, &ConvertURL);
  74. converter->RegisterRepeatedString("path_prefixes",
  75. &DomainReliabilityConfig::path_prefixes);
  76. converter->RegisterDoubleField("success_sample_rate",
  77. &DomainReliabilityConfig::success_sample_rate);
  78. converter->RegisterDoubleField("failure_sample_rate",
  79. &DomainReliabilityConfig::failure_sample_rate);
  80. }
  81. } // namespace domain_reliability