| // Copyright 2020 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. |
| |
| #ifndef CHROME_BROWSER_PERFORMANCE_HINTS_REWRITE_HANDLER_H_ |
| #define CHROME_BROWSER_PERFORMANCE_HINTS_REWRITE_HANDLER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| class GURL; |
| |
| namespace performance_hints { |
| |
| // RewriteHandler checks URLs to see if they match one of the preconfigured |
| // rewrite patterns. If so, returns the original (non-rewritten) URL. |
| // |
| // This is the case for many redirectors and click-tracking URLs such as |
| // https://www.google.com/url?url=https://actualurl.com. |
| class RewriteHandler { |
| public: |
| RewriteHandler(); |
| RewriteHandler(const RewriteHandler&); |
| ~RewriteHandler(); |
| |
| // If |url| matches one of the configured URLs, return the inner URL included |
| // in the query params. If the URL is invalid or doesn't match one of the |
| // configured URLs, return nullopt. |
| absl::optional<GURL> HandleRewriteIfNecessary(const GURL& url) const; |
| |
| // Creates a RewriteHandler that handles URLs of the forms provided by the |
| // config. If a syntax error prevents the config from being parsed, this will |
| // return a RewriteHandler that matches no URLs (always returns nullopt). |
| // |
| // The config string is of the form "host/path?param,host/path?param,...". |
| // All three values must be included for each form. Other components (port, |
| // scheme, etc) must be omitted. Only one query param should be specified per |
| // form, namely the param that contains the inner URL. |
| // |
| // An empty config ("") is valid, and indicates no URLs should be matched. |
| static RewriteHandler FromConfigString(const std::string& config); |
| |
| private: |
| struct UrlRule { |
| // The host to match. No scheme, port, etc is included. |
| std::string host; |
| // The path to match. Includes the starting "/". |
| std::string path; |
| // The query param that contains the inner URL. |
| std::string query_param; |
| }; |
| |
| // The URL forms that this RewriteHandler can process. |
| std::vector<UrlRule> url_rules_; |
| }; |
| |
| } // namespace performance_hints |
| |
| #endif // CHROME_BROWSER_PERFORMANCE_HINTS_REWRITE_HANDLER_H_ |