API
transformation.proto

transformation.proto

Package: transformation.options.gloo.solo.io Types:

Source File: github.com/solo-io/gloo/projects/gloo/api/v1/options/transformation/transformation.proto


ResponseMatch

"matchers": []matchers.core.gloo.solo.io.HeaderMatcher
"responseCodeDetails": string
"responseTransformation": .transformation.options.gloo.solo.io.Transformation
Field Type Description
matchers []matchers.core.gloo.solo.io.HeaderMatcher Response headers to match on.
responseCodeDetails string Response code detail to match on. To see the response code details for your usecase, you can use the envoy access log %RESPONSE_CODE_DETAILS% formatter to log it.
responseTransformation .transformation.options.gloo.solo.io.Transformation Transformation to apply on the response.

RequestMatch

"matcher": .matchers.core.gloo.solo.io.Matcher
"clearRouteCache": bool
"requestTransformation": .transformation.options.gloo.solo.io.Transformation
"responseTransformation": .transformation.options.gloo.solo.io.Transformation
Field Type Description
matcher .matchers.core.gloo.solo.io.Matcher Matches on the request properties.
clearRouteCache bool Should we clear the route cache if a transformation was matched.
requestTransformation .transformation.options.gloo.solo.io.Transformation Transformation to apply on the request.
responseTransformation .transformation.options.gloo.solo.io.Transformation Transformation to apply on the response.

Transformations

"requestTransformation": .transformation.options.gloo.solo.io.Transformation
"clearRouteCache": bool
"responseTransformation": .transformation.options.gloo.solo.io.Transformation
Field Type Description
requestTransformation .transformation.options.gloo.solo.io.Transformation Apply a transformation to requests.
clearRouteCache bool Clear the route cache if the request transformation was applied.
responseTransformation .transformation.options.gloo.solo.io.Transformation Apply a transformation to responses.

RequestResponseTransformations

"requestTransforms": []transformation.options.gloo.solo.io.RequestMatch
"responseTransforms": []transformation.options.gloo.solo.io.ResponseMatch
Field Type Description
requestTransforms []transformation.options.gloo.solo.io.RequestMatch Transformations to apply on the request. The first request that matches will apply.
responseTransforms []transformation.options.gloo.solo.io.ResponseMatch Transformations to apply on the response. This field is only consulted if there is no response transformation in the matched request_transforms. i.e. Only one response transformation will be executed. The first response transformation that matches will apply.

TransformationStages

"early": .transformation.options.gloo.solo.io.RequestResponseTransformations
"regular": .transformation.options.gloo.solo.io.RequestResponseTransformations
"postRouting": .transformation.options.gloo.solo.io.RequestResponseTransformations
"inheritTransformation": bool
"logRequestResponseInfo": .google.protobuf.BoolValue
"escapeCharacters": .google.protobuf.BoolValue
Field Type Description
early .transformation.options.gloo.solo.io.RequestResponseTransformations Early transformations happen before most other options (Like Auth and Rate Limit).
regular .transformation.options.gloo.solo.io.RequestResponseTransformations Regular transformations happen after Auth and Rate limit decisions has been made.
postRouting .transformation.options.gloo.solo.io.RequestResponseTransformations Post routing transformations happen during the router filter chain. This is important for a number of reasons 1. Retries re-trigger this filter, which might impact performance. 2. It is the only point where endpoint metadata is available. 3. clear_route_cache does NOT work in this stage as the routing decision is already made. Enterprise only.
inheritTransformation bool Inherit transformation config from parent. This has no affect on VirtualHost level transformations. If a RouteTable or Route wants to inherit transformations from it’s parent RouteTable or VirtualHost, this should be set to true, else transformations from parents will not be inherited. Transformations are ordered so the child’s transformation gets priority, so in the case where a child and parent’s transformation matchers are the same, only the child’s transformation will run because only one transformation will run per stage. Defaults to false.
logRequestResponseInfo .google.protobuf.BoolValue When enabled, log request/response body and headers before and after all transformations defined here are applied.\ This overrides the log_request_response_info field in the Transformation message.
escapeCharacters .google.protobuf.BoolValue Use this field to set Inja behavior when rendering strings which contain characters that would need to be escaped to be valid JSON. Note that this sets the behavior for all staged transformations configured here. This setting can be overridden per-transformation using the field escape_characters on the TransformationTemplate.

Transformation

User-facing API for transformation.

"transformationTemplate": .transformation.options.gloo.solo.io.TransformationTemplate
"headerBodyTransform": .transformation.options.gloo.solo.io.HeaderBodyTransform
"xsltTransformation": .envoy.config.transformer.xslt.v2.XsltTransformation
"logRequestResponseInfo": bool
Field Type Description
transformationTemplate .transformation.options.gloo.solo.io.TransformationTemplate Apply transformation templates. Only one of transformationTemplate, headerBodyTransform, or xsltTransformation can be set.
headerBodyTransform .transformation.options.gloo.solo.io.HeaderBodyTransform This type of transformation will make all the headers available in the response body. The resulting JSON body will consist of two attributes: ‘headers’, containing the headers, and ‘body’, containing the original body. Only one of headerBodyTransform, transformationTemplate, or xsltTransformation can be set.
xsltTransformation .envoy.config.transformer.xslt.v2.XsltTransformation (Enterprise Only): Xslt Transformation. Only one of xsltTransformation, transformationTemplate, or headerBodyTransform can be set.
logRequestResponseInfo bool When enabled, log request/response body and headers before and after this transformation is applied.

Extraction

Extractions can be used to extract information from the request/response. The extracted information can then be referenced in template fields.

"header": string
"body": .google.protobuf.Empty
"regex": string
"subgroup": int
"replacementText": .google.protobuf.StringValue
"mode": .transformation.options.gloo.solo.io.Extraction.Mode
Field Type Description
header string Extract information from headers. Only one of header or body can be set.
body .google.protobuf.Empty Extract information from the request/response body. Only one of body or header can be set.
regex string The regex field specifies the regular expression used for matching against the source content. - In EXTRACT mode, the entire source must match the regex. subgroup selects the n-th capturing group, which determines the part of the match that you want to extract. If the regex does not match the source, the result of the extraction will be an empty value. - In SINGLE_REPLACE mode, the regex also needs to match the entire source. subgroup selects the n-th capturing group that is replaced with the content of replacement_text. If the regex does not match the source, the result of the replacement will be the source itself. - In REPLACE_ALL mode, the regex is applied repeatedly to find all occurrences within the source that match. Each matching occurrence is replaced with the value in replacement_text. In this mode, the configuration is rejected if subgroup is set. If the regex does not match the source, the result of the replacement will be the source itself.
subgroup int If your regex contains capturing groups, use this field to determine the group that you want to select. Defaults to 0. If set in EXTRACT and SINGLE_REPLACE modes, the subgroup represents the capturing group that you want to extract or replace in the source. The configuration is rejected if you set subgroup to a non-zero value when using thev REPLACE_ALL mode.
replacementText .google.protobuf.StringValue The value replacement_text is used to format the substitution for matched sequences in in an input string. This value is only legal in SINGLE_REPLACE and REPLACE_ALL modes. - In SINGLE_REPLACE mode, the subgroup selects the n-th capturing group, which represents the value that you want to replace with the string provided in replacement_text. - In REPLACE_ALL mode, each sequence that matches the specified regex in the input is replaced with the value inreplacement_text. The replacement_text can include special syntax, such as $1, $2, etc., to refer to capturing groups within the regular expression. The value that is specified in replacement_text is treated as a string, and is passed to std::regex_replace as the replacement string. For more informatino, see https://en.cppreference.com/w/cpp/regex/regex_replace.
mode .transformation.options.gloo.solo.io.Extraction.Mode The mode of operation for the extraction. Defaults to EXTRACT.

Mode

The mode of operation for the extraction.

Name Description
EXTRACT Default mode. Extract the content of a specified capturing group. In this mode, subgroup selects the n-th capturing group, which represents the value that you want to extract.
SINGLE_REPLACE Replace the content of a specified capturing group. In this mode, subgroup selects the n-th capturing group, which represents the value that you want to replace with the string provided in replacement_text. Note: replacement_text must be set for this mode.
REPLACE_ALL Replace all regex matches with the value provided in replacement_text. Note: replacement_text must be set for this mode. Note: The configuration fails if subgroup is set to a non-zero value. Note: restrictions on the regex are different for this mode. See the regex field for more details.

TransformationTemplate

Defines a transformation template.

"advancedTemplates": bool
"extractors": map<string, .transformation.options.gloo.solo.io.Extraction>
"headers": map<string, string>
"headersToAppend": []transformation.options.gloo.solo.io.TransformationTemplate.HeaderToAppend
"headersToRemove": []string
"body": .transformation.options.gloo.solo.io.InjaTemplate
"passthrough": .transformation.options.gloo.solo.io.Passthrough
"mergeExtractorsToBody": .transformation.options.gloo.solo.io.MergeExtractorsToBody
"mergeJsonKeys": .transformation.options.gloo.solo.io.MergeJsonKeys
"parseBodyBehavior": .transformation.options.gloo.solo.io.TransformationTemplate.RequestBodyParse
"ignoreErrorOnParse": bool
"dynamicMetadataValues": []transformation.options.gloo.solo.io.TransformationTemplate.DynamicMetadataValue
"escapeCharacters": .google.protobuf.BoolValue
Field Type Description
advancedTemplates bool If set to true, use JSON pointer notation (e.g. “time/start”) instead of dot notation (e.g. “time.start”) to access JSON elements. Defaults to false. Please note that, if set to ’true’, you will need to use the extraction function to access extractors in the template (e.g. ‘{{ extraction(“my_extractor”) }}’); if the default value of ‘false’ is used, extractors will simply be available by their name (e.g. ‘{{ my_extractor }}’).
extractors map<string, .transformation.options.gloo.solo.io.Extraction> Use this attribute to extract information from the request. It consists of a map of strings to extractors. The extractor will defines which information will be extracted, while the string key will provide the extractor with a name. You can reference extractors by their name in templates, e.g. “{{ my-extractor }}” will render to the value of the “my-extractor” extractor.
headers map<string, string> Use this attribute to transform request/response headers. It consists of a map of strings to templates. The string key determines the name of the resulting header, the rendered template will determine the value. Any existing headers with the same header name will be replaced by the transformed header. If a header name is included in headers and headers_to_append, it will first be replaced the template in headers, then additional header values will be appended by the templates defined in headers_to_append. For example, the following header transformation configuration: yaml headers: x-header-one: {"text": "first {{inja}} template"} x-header-one: {"text": "second {{inja}} template"} headersToAppend: - key: x-header-one value: {"text": "first appended {{inja}} template"} - key: x-header-one value: {"text": "second appended {{inja}} template"} will result in the following headers on the HTTP message: x-header-one: first inja template x-header-one: first appended inja template x-header-one: second appended inja template.
headersToAppend []transformation.options.gloo.solo.io.TransformationTemplate.HeaderToAppend Use this attribute to transform request/response headers. It consists of an array of string/template objects. Use this attribute to define multiple templates for a single header. Header template(s) defined here will be appended to any existing headers with the same header name, not replace existing ones. See headers documentation to see an example of usage.
headersToRemove []string Attribute to remove headers from requests. If a header is present multiple times, all instances of the header will be removed.
body .transformation.options.gloo.solo.io.InjaTemplate Apply a template to the body. Only one of body, passthrough, mergeExtractorsToBody, or mergeJsonKeys can be set.
passthrough .transformation.options.gloo.solo.io.Passthrough This will cause the transformation filter not to buffer the body. Use this setting if the response body is large and you don’t need to transform nor extract information from it. Only one of passthrough, body, mergeExtractorsToBody, or mergeJsonKeys can be set.
mergeExtractorsToBody .transformation.options.gloo.solo.io.MergeExtractorsToBody Merge all defined extractors to the request/response body. If you want to nest elements inside the body, use dot separator in the extractor name. Only one of mergeExtractorsToBody, body, passthrough, or mergeJsonKeys can be set.
mergeJsonKeys .transformation.options.gloo.solo.io.MergeJsonKeys A set of key-value pairs to merge into the JSON body. Each value will be rendered separately, and then placed into the JSON body at the specified key. There are a number of important caveats to using this feature: * This can only be used when the body is parsed as JSON. * This option does NOT work with advanced templates currently. Only one of mergeJsonKeys, body, passthrough, or mergeExtractorsToBody can be set.
parseBodyBehavior .transformation.options.gloo.solo.io.TransformationTemplate.RequestBodyParse Determines how the body will be parsed. Defaults to ParseAsJson.
ignoreErrorOnParse bool If set to true, Envoy will not throw an exception in case the body parsing fails.
dynamicMetadataValues []transformation.options.gloo.solo.io.TransformationTemplate.DynamicMetadataValue Use this field to set Dynamic Metadata.
escapeCharacters .google.protobuf.BoolValue Use this field to set Inja behavior when rendering strings which contain characters that would need to be escaped to be valid JSON. Note that this sets the behavior for the entire transformation. Use raw_strings function for fine-grained control within a template.

HeaderToAppend

Defines a header-template pair to be used in headers_to_append

"key": string
"value": .transformation.options.gloo.solo.io.InjaTemplate
Field Type Description
key string Header name.
value .transformation.options.gloo.solo.io.InjaTemplate Apply a template to the header value.

DynamicMetadataValue

Defines an Envoy Dynamic Metadata entry.

"metadataNamespace": string
"key": string
"value": .transformation.options.gloo.solo.io.InjaTemplate
"jsonToProto": bool
Field Type Description
metadataNamespace string The metadata namespace. Defaults to the filter namespace.
key string The metadata key.
value .transformation.options.gloo.solo.io.InjaTemplate A template that determines the metadata value.
jsonToProto bool Instruct the filter to parse the rendered value as a proto Struct message before setting it as the metadata value.

RequestBodyParse

Determines how the body will be parsed.

Name Description
ParseAsJson Will attempt to parse the request/response body as JSON
DontParse The request/response body will be treated as plain text

InjaTemplate

Defines an Inja template that will be rendered by Gloo. In addition to the core template functions, the Gloo transformation filter defines the following custom functions:

  • header(header_name): returns the value of the header with the given name.
  • extraction(extractor_name): returns the value of the extractor with the given name.
  • env(env_var_name): returns the value of the environment variable with the given name.
  • body(): returns the request/response body.
  • context(): returns the base JSON context (allowing for example to range on a JSON body that is an array).
  • request_header(header_name): returns the value of the request header with the given name. Use this option when you want to include request header values in response transformations.
  • base64_encode(string): encodes the input string to base64.
  • base64_decode(string): decodes the input string from base64.
  • substring(string, start_pos, substring_len): returns a substring of the input string, starting at start_pos and extending for substring_len characters. If no substring_len is provided or substring_len is <= 0, the substring extends to the end of the input string.
"text": string
Field Type Description
text string

Passthrough

Field Type Description

MergeExtractorsToBody

Field Type Description

MergeJsonKeys

"jsonKeys": map<string, .transformation.options.gloo.solo.io.MergeJsonKeys.OverridableTemplate>
Field Type Description
jsonKeys map<string, .transformation.options.gloo.solo.io.MergeJsonKeys.OverridableTemplate> Map of key name -> template to render into the JSON body. Specified keys which don’t exist in the JSON body will be set, keys which do exist will be overriden. For example, given the following JSON body: { “key1”: “value1” } and the following MergeJsonKeys: { “key1”: “{{ header(“header1”) }}”, “key2”: “{{ header(“header2”) }}” } The resulting JSON body will be: { “key1”: “header1_value”, “key2”: “header2_value” }.

OverridableTemplate

"tmpl": .transformation.options.gloo.solo.io.InjaTemplate
"overrideEmpty": bool
Field Type Description
tmpl .transformation.options.gloo.solo.io.InjaTemplate Template to render.
overrideEmpty bool If set to true, the template will be set even if the rendered value is empty.

HeaderBodyTransform

"addRequestMetadata": bool
Field Type Description
addRequestMetadata bool When transforming a request, setting this to true will additionally add “queryString”, “queryStringParameters”, “multiValueQueryStringParameters”, “httpMethod”, “path”, and “multiValueHeaders” to the body.