You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
7.7 KiB
226 lines
7.7 KiB
syntax = "proto3"; |
|
|
|
package envoy.config.common.matcher.v3; |
|
|
|
import "envoy/config/core/v3/extension.proto"; |
|
import "envoy/config/route/v3/route_components.proto"; |
|
import "envoy/type/matcher/v3/string.proto"; |
|
|
|
import "udpa/annotations/status.proto"; |
|
import "validate/validate.proto"; |
|
|
|
option java_package = "io.envoyproxy.envoy.config.common.matcher.v3"; |
|
option java_outer_classname = "MatcherProto"; |
|
option java_multiple_files = true; |
|
option (udpa.annotations.file_status).package_version_status = ACTIVE; |
|
|
|
// [#protodoc-title: Unified Matcher API] |
|
|
|
// A matcher, which may traverse a matching tree in order to result in a match action. |
|
// During matching, the tree will be traversed until a match is found, or if no match |
|
// is found the action specified by the most specific on_no_match will be evaluated. |
|
// As an on_no_match might result in another matching tree being evaluated, this process |
|
// might repeat several times until the final OnMatch (or no match) is decided. |
|
// |
|
// [#alpha:] |
|
message Matcher { |
|
// What to do if a match is successful. |
|
message OnMatch { |
|
oneof on_match { |
|
option (validate.required) = true; |
|
|
|
// Nested matcher to evaluate. |
|
// If the nested matcher does not match and does not specify |
|
// on_no_match, then this matcher is considered not to have |
|
// matched, even if a predicate at this level or above returned |
|
// true. |
|
Matcher matcher = 1; |
|
|
|
// Protocol-specific action to take. |
|
core.v3.TypedExtensionConfig action = 2; |
|
} |
|
} |
|
|
|
// A linear list of field matchers. |
|
// The field matchers are evaluated in order, and the first match |
|
// wins. |
|
message MatcherList { |
|
// Predicate to determine if a match is successful. |
|
message Predicate { |
|
// Predicate for a single input field. |
|
message SinglePredicate { |
|
// Protocol-specific specification of input field to match on. |
|
// [#extension-category: envoy.matching.common_inputs] |
|
core.v3.TypedExtensionConfig input = 1 [(validate.rules).message = {required: true}]; |
|
|
|
oneof matcher { |
|
option (validate.required) = true; |
|
|
|
// Built-in string matcher. |
|
type.matcher.v3.StringMatcher value_match = 2; |
|
|
|
// Extension for custom matching logic. |
|
// [#extension-category: envoy.matching.input_matchers] |
|
core.v3.TypedExtensionConfig custom_match = 3; |
|
} |
|
} |
|
|
|
// A list of two or more matchers. Used to allow using a list within a oneof. |
|
message PredicateList { |
|
repeated Predicate predicate = 1 [(validate.rules).repeated = {min_items: 2}]; |
|
} |
|
|
|
oneof match_type { |
|
option (validate.required) = true; |
|
|
|
// A single predicate to evaluate. |
|
SinglePredicate single_predicate = 1; |
|
|
|
// A list of predicates to be OR-ed together. |
|
PredicateList or_matcher = 2; |
|
|
|
// A list of predicates to be AND-ed together. |
|
PredicateList and_matcher = 3; |
|
|
|
// The invert of a predicate |
|
Predicate not_matcher = 4; |
|
} |
|
} |
|
|
|
// An individual matcher. |
|
message FieldMatcher { |
|
// Determines if the match succeeds. |
|
Predicate predicate = 1 [(validate.rules).message = {required: true}]; |
|
|
|
// What to do if the match succeeds. |
|
OnMatch on_match = 2 [(validate.rules).message = {required: true}]; |
|
} |
|
|
|
// A list of matchers. First match wins. |
|
repeated FieldMatcher matchers = 1 [(validate.rules).repeated = {min_items: 1}]; |
|
} |
|
|
|
message MatcherTree { |
|
// A map of configured matchers. Used to allow using a map within a oneof. |
|
message MatchMap { |
|
map<string, OnMatch> map = 1 [(validate.rules).map = {min_pairs: 1}]; |
|
} |
|
|
|
// Protocol-specific specification of input field to match on. |
|
core.v3.TypedExtensionConfig input = 1 [(validate.rules).message = {required: true}]; |
|
|
|
// Exact or prefix match maps in which to look up the input value. |
|
// If the lookup succeeds, the match is considered successful, and |
|
// the corresponding OnMatch is used. |
|
oneof tree_type { |
|
option (validate.required) = true; |
|
|
|
MatchMap exact_match_map = 2; |
|
|
|
// Longest matching prefix wins. |
|
MatchMap prefix_match_map = 3; |
|
|
|
// Extension for custom matching logic. |
|
core.v3.TypedExtensionConfig custom_match = 4; |
|
} |
|
} |
|
|
|
oneof matcher_type { |
|
option (validate.required) = true; |
|
|
|
// A linear list of matchers to evaluate. |
|
MatcherList matcher_list = 1; |
|
|
|
// A match tree to evaluate. |
|
MatcherTree matcher_tree = 2; |
|
} |
|
|
|
// Optional OnMatch to use if the matcher failed. |
|
// If specified, the OnMatch is used, and the matcher is considered |
|
// to have matched. |
|
// If not specified, the matcher is considered not to have matched. |
|
OnMatch on_no_match = 3; |
|
} |
|
|
|
// Match configuration. This is a recursive structure which allows complex nested match |
|
// configurations to be built using various logical operators. |
|
// [#next-free-field: 11] |
|
message MatchPredicate { |
|
// A set of match configurations used for logical operations. |
|
message MatchSet { |
|
// The list of rules that make up the set. |
|
repeated MatchPredicate rules = 1 [(validate.rules).repeated = {min_items: 2}]; |
|
} |
|
|
|
oneof rule { |
|
option (validate.required) = true; |
|
|
|
// A set that describes a logical OR. If any member of the set matches, the match configuration |
|
// matches. |
|
MatchSet or_match = 1; |
|
|
|
// A set that describes a logical AND. If all members of the set match, the match configuration |
|
// matches. |
|
MatchSet and_match = 2; |
|
|
|
// A negation match. The match configuration will match if the negated match condition matches. |
|
MatchPredicate not_match = 3; |
|
|
|
// The match configuration will always match. |
|
bool any_match = 4 [(validate.rules).bool = {const: true}]; |
|
|
|
// HTTP request headers match configuration. |
|
HttpHeadersMatch http_request_headers_match = 5; |
|
|
|
// HTTP request trailers match configuration. |
|
HttpHeadersMatch http_request_trailers_match = 6; |
|
|
|
// HTTP response headers match configuration. |
|
HttpHeadersMatch http_response_headers_match = 7; |
|
|
|
// HTTP response trailers match configuration. |
|
HttpHeadersMatch http_response_trailers_match = 8; |
|
|
|
// HTTP request generic body match configuration. |
|
HttpGenericBodyMatch http_request_generic_body_match = 9; |
|
|
|
// HTTP response generic body match configuration. |
|
HttpGenericBodyMatch http_response_generic_body_match = 10; |
|
} |
|
} |
|
|
|
// HTTP headers match configuration. |
|
message HttpHeadersMatch { |
|
// HTTP headers to match. |
|
repeated route.v3.HeaderMatcher headers = 1; |
|
} |
|
|
|
// HTTP generic body match configuration. |
|
// List of text strings and hex strings to be located in HTTP body. |
|
// All specified strings must be found in the HTTP body for positive match. |
|
// The search may be limited to specified number of bytes from the body start. |
|
// |
|
// .. attention:: |
|
// |
|
// Searching for patterns in HTTP body is potentially cpu intensive. For each specified pattern, http body is scanned byte by byte to find a match. |
|
// If multiple patterns are specified, the process is repeated for each pattern. If location of a pattern is known, ``bytes_limit`` should be specified |
|
// to scan only part of the http body. |
|
message HttpGenericBodyMatch { |
|
message GenericTextMatch { |
|
oneof rule { |
|
option (validate.required) = true; |
|
|
|
// Text string to be located in HTTP body. |
|
string string_match = 1 [(validate.rules).string = {min_len: 1}]; |
|
|
|
// Sequence of bytes to be located in HTTP body. |
|
bytes binary_match = 2 [(validate.rules).bytes = {min_len: 1}]; |
|
} |
|
} |
|
|
|
// Limits search to specified number of bytes - default zero (no limit - match entire captured buffer). |
|
uint32 bytes_limit = 1; |
|
|
|
// List of patterns to match. |
|
repeated GenericTextMatch patterns = 2 [(validate.rules).repeated = {min_items: 1}]; |
|
}
|
|
|