// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.web;

using fuchsia.net.http;

table UrlRequestRewriteRule {
    /// Set of hosts to apply the rules to. If not set, the rule will apply to every request,
    /// independent of host.
    1: vector<UrlHostName>:MAX_RULE_COUNT hosts_filter;

    /// Set of schemes to apply the rules to. If not set, the rule will apply to every request,
    /// independent of scheme.
    2: vector<UrlSchemeName>:MAX_RULE_COUNT schemes_filter;

    /// URL request rewrites to apply.
    3: vector<UrlRequestRewrite>:MAX_RULE_COUNT rewrites;

    /// Specifies the action to take for requests matching the filter criteria.
    /// Requests are allowed by default.
    4: UrlRequestAction action;
};

enum UrlRequestAction : int32 {
    /// Allow the request to be processed.
    ALLOW = 1;

    /// Block the request.
    DENY = 2;
};

flexible union UrlRequestRewrite {
    /// Adds a set of headers to a URL request.
    1: UrlRequestRewriteAddHeaders add_headers;

    /// Removes a header based on the presence of a pattern in the URL query.
    2: UrlRequestRewriteRemoveHeader remove_header;

    /// Substitutes a pattern in the URL query.
    3: UrlRequestRewriteSubstituteQueryPattern substitute_query_pattern;

    /// Replaces a URL if the original URL ends with a pattern.
    4: UrlRequestRewriteReplaceUrl replace_url;

    /// Appends to the URL query.
    5: UrlRequestRewriteAppendToQuery append_to_query;
};

/// Adds `headers` to the URL request. If a header is already present in the original URL request,
/// it will be overwritten.
/// - `headers` must be set.
/// - Each [`fuchsia.net.http.Header`] in `headers` must have a valid HTTP header name and value,
///   per [RFC 7230 section  3.2](https://tools.ietf.org/html/rfc7230#section-3.2).
table UrlRequestRewriteAddHeaders {
    1: vector<fuchsia.net.http.Header>:MAX_HEADERS_COUNT headers;
};

/// If `query_pattern` in the URL query, removes `header_name` from the list of headers. If
/// `query_pattern` is not set, removes `header_name` from the list of headers unconditionally.
/// - `header_name` must be set.
/// - `header_name` must be a valid HTTP header name, per
///   [RFC 7230 section 3.2](https://tools.ietf.org/html/rfc7230#section-3.2).
table UrlRequestRewriteRemoveHeader {
    1: Url query_pattern;
    2: bytes:MAX_HEADERS_COUNT header_name;
};

/// If `pattern` is found in the URL request query, replaces it with `substitution`.
/// - `pattern` and `substitution` must be set.
/// - `substitution` must be a valid
///   [URL-query string](https://url.spec.whatwg.org/#url-query-string).
table UrlRequestRewriteSubstituteQueryPattern {
    1: Url pattern;
    2: Url substitution;
};

/// If the URL in the URL request ends with `url_ends_with`, rewrites the URL to `new_url`.
/// - `url_ends_with` and `new_url` must be set.
/// - `url_ends_with` must be a valid
///   [path-relative-URL string](https://url.spec.whatwg.org/#path-relative-url-string).
/// - `new_url` must be a [valid URL string](https://url.spec.whatwg.org/#valid-url-string).
table UrlRequestRewriteReplaceUrl {
    1: Url url_ends_with;
    2: Url new_url;
};

/// Appends `query` to the URL query. If the URL request already has a query, `query` will be
/// appended to it, preceded by `&`. Otherwise, the URL's query will be set to `query`.
/// - `query` must be set.
/// - `query` must be a valid [URL-query string](https://url.spec.whatwg.org/#url-query-string).
table UrlRequestRewriteAppendToQuery {
    1: Url query;
};
