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