123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#ifndef COMPONENTS_DOMAIN_RELIABILITY_CONFIG_H_
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define COMPONENTS_DOMAIN_RELIABILITY_CONFIG_H_
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string>
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <vector>
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/json/json_value_converter.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/macros.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/string_piece.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/time/time.h"
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/values.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/domain_reliability/domain_reliability_export.h"
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "url/gurl.h"
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace domain_reliability {
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// The configuration that controls which requests are measured and reported,
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// with what frequency, and where the beacons are uploaded.
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class DOMAIN_RELIABILITY_EXPORT DomainReliabilityConfig {
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  static const size_t kInvalidResourceIndex;
270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // A particular resource named in the config -- includes a set of URL
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // patterns that the resource will match, along with sample rates for
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // successful and unsuccessful requests.
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  class DOMAIN_RELIABILITY_EXPORT Resource {
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   public:
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Resource();
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ~Resource();
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Returns whether |url_string| matches at least one of the |url_patterns|
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // in this Resource.
380de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    bool MatchesUrl(const GURL& url) const;
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Returns whether a request (that was successful if |success| is true)
410de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    // should be reported with a full beacon. (The output is non-deterministic;
420de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    // it |success_sample_rate| or |failure_sample_rate| to a random number.)
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bool DecideIfShouldReportRequest(bool success) const;
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Registers with the JSONValueConverter so it will know how to convert the
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // JSON for a named resource into the struct.
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    static void RegisterJSONConverter(
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        base::JSONValueConverter<Resource>* converter);
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool IsValid() const;
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Name of the Resource, as will be reported in uploads.
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    std::string name;
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // List of URL patterns to assign requests to this Resource.
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ScopedVector<std::string> url_patterns;
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Sample rates for successful and unsuccessful requests, respectively.
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // 0.0 reports no requests, and 1.0 reports every request.
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    double success_sample_rate;
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    double failure_sample_rate;
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   private:
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Resource);
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // A particular endpoint for report uploads. Includes the URL to upload
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // reports to. May include a verification URL or backoff/load management
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // configuration in the future.
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  struct DOMAIN_RELIABILITY_EXPORT Collector {
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   public:
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Collector();
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ~Collector();
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Registers with the JSONValueConverter so it will know how to convert the
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // JSON for a collector into the struct.
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    static void RegisterJSONConverter(
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        base::JSONValueConverter<Collector>* converter);
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool IsValid() const;
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    GURL upload_url;
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   private:
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Collector);
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DomainReliabilityConfig();
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ~DomainReliabilityConfig();
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Uses the JSONValueConverter to parse the JSON for a config into a struct.
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static scoped_ptr<const DomainReliabilityConfig> FromJSON(
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const base::StringPiece& json);
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool IsValid() const;
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
970de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Checks whether |now| is past the expiration time provided in the config.
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool IsExpired(base::Time now) const;
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Finds the index (in resources) of the first Resource that matches a
1010de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // particular URL. Returns kInvalidResourceIndex if it is not matched by any
1020de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Resources.
1030de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  size_t GetResourceIndexForUrl(const GURL& url) const;
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Registers with the JSONValueConverter so it will know how to convert the
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // JSON for a config into the struct.
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static void RegisterJSONConverter(
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::JSONValueConverter<DomainReliabilityConfig>* converter);
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string version;
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double valid_until;
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string domain;
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ScopedVector<Resource> resources;
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ScopedVector<Collector> collectors;
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DomainReliabilityConfig);
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace domain_reliability
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // COMPONENTS_DOMAIN_RELIABILITY_CONFIG_H_
123