config.h revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
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/compiler_specific.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/json/json_value_converter.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/string_piece.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/values.h"
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/domain_reliability/domain_reliability_export.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "url/gurl.h"
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace domain_reliability {
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// The configuration that controls which requests are measured and reported,
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// with what frequency, and where the beacons are uploaded.
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class DOMAIN_RELIABILITY_EXPORT DomainReliabilityConfig {
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // A particular resource named in the config -- includes a set of URL
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // patterns that the resource will match, along with sample rates for
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // successful and unsuccessful requests.
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  class DOMAIN_RELIABILITY_EXPORT Resource {
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   public:
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Resource();
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ~Resource();
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Returns whether |url_string| matches at least one of the |url_patterns|
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // in this Resource.
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bool MatchesUrlString(const std::string& url_string) const;
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Returns whether a request (that was successful if |success| is true)
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // should be reported (with a full beacon). (The output is random; it
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // compares a random number to |success_sample_rate| or
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // |failure_sample_rate|.)
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bool DecideIfShouldReportRequest(bool success) const;
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Registers with the JSONValueConverter so it will know how to convert the
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // JSON for a named resource into the struct.
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    static void RegisterJSONConverter(
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        base::JSONValueConverter<Resource>* converter);
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Name of the Resource, as will be reported in uploads.
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    std::string name;
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // List of URL patterns to assign requests to this Resource.
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ScopedVector<std::string> url_patterns;
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Sample rates for successful and unsuccessful requests, respectively.
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // 0.0 reports no requests, and 1.0 reports every request.
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    double success_sample_rate;
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    double failure_sample_rate;
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   private:
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Resource);
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // A particular endpoint for report uploads. Includes the URL to upload
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // reports to. May include a verification URL or backoff/load management
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // configuration in the future.
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  struct DOMAIN_RELIABILITY_EXPORT Collector {
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   public:
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Collector();
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ~Collector();
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Registers with the JSONValueConverter so it will know how to convert the
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // JSON for a collector into the struct.
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    static void RegisterJSONConverter(
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        base::JSONValueConverter<Collector>* converter);
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    GURL upload_url;
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   private:
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Collector);
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DomainReliabilityConfig();
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ~DomainReliabilityConfig();
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Uses the JSONValueConverter to parse the JSON for a config into a struct.
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static scoped_ptr<const DomainReliabilityConfig> FromJSON(
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const base::StringPiece& json);
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Finds the index (in resources) of the first Resource that matches a
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // particular URL. Returns -1 if the URL is not matched by any Resources.
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int GetResourceIndexForUrl(const GURL& url) const;
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Registers with the JSONValueConverter so it will know how to convert the
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // JSON for a config into the struct.
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static void RegisterJSONConverter(
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::JSONValueConverter<DomainReliabilityConfig>* converter);
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string config_version;
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string domain;
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ScopedVector<Resource> resources;
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ScopedVector<Collector> collectors;
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // TODO(ttuttle): Add config_valid_util when fetching and expiring configs
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  //                is implemented.
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DomainReliabilityConfig);
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace domain_reliability
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // COMPONENTS_DOMAIN_RELIABILITY_CONFIG_H_
113