// Copyright 2025 Envoy Project Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package envoy.extensions.path.rewrite.uri_template.v3;

import "udpa/annotations/status.proto";
import "validate/validate.proto";

option java_package = "io.envoyproxy.envoy.extensions.path.rewrite.uri_template.v3";
option java_outer_classname = "UriTemplateRewriteProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/path/rewrite/uri_template/v3;uri_templatev3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: Uri Template Rewrite Config]
// [#extension: envoy.path.rewrite.uri_template.uri_template_rewriter]

// Indicates that during forwarding, portions of the path that match the
// pattern should be rewritten, even allowing the substitution of variables
// from the match pattern into the new path as specified by the rewrite template.
// This is useful to allow application paths to be
// rewritten in a way that is aware of segments with variable content like
// identifiers. The router filter will place the original path as it was
// before the rewrite into the :ref:`x-envoy-original-path
// <config_http_filters_router_x-envoy-original-path>` header.
//
// Only one of :ref:`prefix_rewrite <envoy_v3_api_field_config.route.v3.RouteAction.prefix_rewrite>`,
// :ref:`regex_rewrite <envoy_v3_api_field_config.route.v3.RouteAction.regex_rewrite>`,
// or *path_template_rewrite* may be specified.
//
// Template pattern matching types:
//
// * ``*`` : Matches a single path component, up to the next path separator: /
//
// * ``**`` : Matches zero or more path segments. If present, must be the last operator.
//
// * ``{name} or {name=*}`` :  A named variable matching one path segment up to the next path separator: /.
//
// * ``{name=videos/*}`` : A named variable matching more than one path segment.
//      The path component matching videos/* is captured as the named variable.
//
// * ``{name=**}`` : A named variable matching zero or more path segments.
//
// Only named matches can be used to perform rewrites.
//
// Examples using path_template_rewrite:
//
// * The pattern ``/{one}/{two}`` paired with a substitution string of ``/{two}/{one}`` would
//   transform ``/cat/dog`` into ``/dog/cat``.
//
// * The pattern ``/videos/{language=lang/*}/*`` paired with a substitution string of
//   ``/{language}`` would transform ``/videos/lang/en/video.m4s`` into ``lang/en``.
//
// * The path pattern ``/content/{format}/{lang}/{id}/{file}.vtt`` paired with a substitution
//   string of ``/{lang}/{format}/{file}.vtt`` would transform ``/content/hls/en-us/12345/en_193913.vtt``
//   into ``/en-us/hls/en_193913.vtt``.
message UriTemplateRewriteConfig {
  string path_template_rewrite = 1 [(validate.rules).string = {min_len: 1 max_len: 256}];
}
