http: json_to_metadata filter (#28394)

Signed-off-by: kuochunghsu <kuochunghsu@pinterest.com>

Mirrored from https://github.com/envoyproxy/envoy @ e2eaff90d31ead71af55f1535e819a6b382e1f68
main
update-envoy[bot] 1 year ago
parent 2a12222d96
commit ab08083aaa
  1. 1
      BUILD
  2. 9
      envoy/extensions/filters/http/json_to_metadata/v3/BUILD
  3. 116
      envoy/extensions/filters/http/json_to_metadata/v3/json_to_metadata.proto
  4. 1
      versioning/BUILD

@ -188,6 +188,7 @@ proto_library(
"//envoy/extensions/filters/http/header_to_metadata/v3:pkg",
"//envoy/extensions/filters/http/health_check/v3:pkg",
"//envoy/extensions/filters/http/ip_tagging/v3:pkg",
"//envoy/extensions/filters/http/json_to_metadata/v3:pkg",
"//envoy/extensions/filters/http/jwt_authn/v3:pkg",
"//envoy/extensions/filters/http/kill_request/v3:pkg",
"//envoy/extensions/filters/http/local_ratelimit/v3:pkg",

@ -0,0 +1,9 @@
# DO NOT EDIT. This file is generated by tools/proto_format/proto_sync.py.
load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package")
licenses(["notice"]) # Apache 2
api_proto_package(
deps = ["@com_github_cncf_udpa//udpa/annotations:pkg"],
)

@ -0,0 +1,116 @@
syntax = "proto3";
package envoy.extensions.filters.http.json_to_metadata.v3;
import "google/protobuf/struct.proto";
import "udpa/annotations/status.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.extensions.filters.http.json_to_metadata.v3";
option java_outer_classname = "JsonToMetadataProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/json_to_metadata/v3;json_to_metadatav3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;
// [#protodoc-title: Json-To-Metadata Filter]
//
// The configuration for transforming json body into metadata. This is useful
// for matching load balancer subsets, logging, etc.
//
// Json to Metadata :ref:`configuration overview <config_http_filters_json_to_metadata>`.
// [#extension: envoy.filters.http.json_to_metadata]
message JsonToMetadata {
enum ValueType {
// The value is a serialized `protobuf.Value
// <https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/struct.proto#L62>`_.
PROTOBUF_VALUE = 0;
STRING = 1;
NUMBER = 2;
}
// [#next-free-field: 6]
message KeyValuePair {
// The namespace if this is empty, the filter's namespace will be used.
string metadata_namespace = 1;
// The key to use within the namespace.
string key = 2 [(validate.rules).string = {min_len: 1}];
oneof value_type {
// The value to pair with the given key.
//
// When used for on_present case, if value is non-empty it'll be used instead
// of the the value of the JSON key. If both are empty, the the value of the
// JSON key is used as-is.
//
// When used for on_missing/on_error case, a non-empty value
// must be provided.
//
// It ignores ValueType, i.e., not type casting.
google.protobuf.Value value = 3;
}
// The value's type defaults to protobuf.Value.
ValueType type = 4 [(validate.rules).enum = {defined_only: true}];
// False if we want to overwrite the existing metadata value. Default to false.
bool preserve_existing_metadata_value = 5;
}
message Selector {
// TODO(kuochunghsu): Explore matchers for array handling.
oneof selector {
// key to match
string key = 1 [(validate.rules).string = {min_len: 1}];
}
}
// A Rule defines what metadata to apply when a key-value is present, missing in the json
// or fail to parse the payload.
message Rule {
// Specifies that a match will be performed on the value of a property.
// Here's an example to match on 1 in {"foo": {"bar": 1}, "bar": 2}
//
// selectors:
// - key: foo
// - key: bar
repeated Selector selectors = 1 [(validate.rules).repeated = {min_items: 1}];
// If the attribute is present, apply this metadata KeyValuePair.
KeyValuePair on_present = 2;
// If the attribute is missing, apply this metadata KeyValuePair.
//
// The value in the KeyValuePair must be set.
KeyValuePair on_missing = 3;
// If the body is too large or fail to parse, apply this metadata KeyValuePair.
//
// The value in the KeyValuePair must be set.
KeyValuePair on_error = 4;
}
message MatchRules {
// The list of rules to apply.
repeated Rule rules = 1 [(validate.rules).repeated = {min_items: 1}];
// Allowed content-type for json to metadata transformation.
// Default to {"application/json"}.
//
// Set `allow_empty_content_type` if empty/missing content-type header
// is allowed.
repeated string allow_content_types = 2
[(validate.rules).repeated = {items {string {min_len: 1}}}];
// Allowed empty content-type for json to metadata transformation.
// Default to false.
bool allow_empty_content_type = 3;
}
// Rules to match json body of requests
MatchRules request_rules = 1 [(validate.rules).message = {required: true}];
}

@ -126,6 +126,7 @@ proto_library(
"//envoy/extensions/filters/http/header_to_metadata/v3:pkg",
"//envoy/extensions/filters/http/health_check/v3:pkg",
"//envoy/extensions/filters/http/ip_tagging/v3:pkg",
"//envoy/extensions/filters/http/json_to_metadata/v3:pkg",
"//envoy/extensions/filters/http/jwt_authn/v3:pkg",
"//envoy/extensions/filters/http/kill_request/v3:pkg",
"//envoy/extensions/filters/http/local_ratelimit/v3:pkg",

Loading…
Cancel
Save