compressor: add support for compressing request payloads (#14302)

The compressor filter adds support for compressing request payloads. Its
configuration is unified with the decompressor filter with two new
fields for different directions - requests and responses. The latter
deprecates the old response-specific fields and, if used, roots the
response-specific stats in
<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.response.*
instead of
<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.*.

Signed-off-by: Dmitry Rozhkov <dmitry.rozhkov@intel.com>

Mirrored from https://github.com/envoyproxy/envoy @ b0fedbe914092124dbffb0e9d3e8ea8928f74bb9
pull/623/head
data-plane-api(Azure Pipelines) 4 years ago
parent 4753762ed7
commit f014fc0ab5
  1. 73
      envoy/extensions/filters/http/compressor/v3/compressor.proto
  2. 13
      envoy/extensions/filters/http/compressor/v4alpha/BUILD
  3. 106
      envoy/extensions/filters/http/compressor/v4alpha/compressor.proto
  4. 13
      envoy/extensions/filters/http/gzip/v4alpha/BUILD
  5. 84
      envoy/extensions/filters/http/gzip/v4alpha/gzip.proto

@ -21,40 +21,99 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE;
// Compressor :ref:`configuration overview <config_http_filters_compressor>`.
// [#extension: envoy.filters.http.compressor]
// [#next-free-field: 7]
// [#next-free-field: 9]
message Compressor {
option (udpa.annotations.versioning).previous_message_type =
"envoy.config.filter.http.compressor.v2.Compressor";
message CommonDirectionConfig {
// Runtime flag that controls whether compression is enabled or not for the direction this
// common config is put in. If set to false, the filter will operate as a pass-through filter
// in the chosen direction. If the field is omitted, the filter will be enabled.
config.core.v3.RuntimeFeatureFlag enabled = 1;
// Minimum value of Content-Length header of request or response messages (depending on the direction
// this common config is put in), in bytes, which will trigger compression. The default value is 30.
google.protobuf.UInt32Value min_content_length = 2;
// Set of strings that allows specifying which mime-types yield compression; e.g.,
// application/json, text/html, etc. When this field is not defined, compression will be applied
// to the following mime-types: "application/javascript", "application/json",
// "application/xhtml+xml", "image/svg+xml", "text/css", "text/html", "text/plain", "text/xml"
// and their synonyms.
repeated string content_type = 3;
}
// Configuration for filter behavior on the request direction.
message RequestDirectionConfig {
CommonDirectionConfig common_config = 1;
}
// Configuration for filter behavior on the response direction.
message ResponseDirectionConfig {
CommonDirectionConfig common_config = 1;
// If true, disables compression when the response contains an etag header. When it is false, the
// filter will preserve weak etags and remove the ones that require strong validation.
bool disable_on_etag_header = 2;
// If true, removes accept-encoding from the request headers before dispatching it to the upstream
// so that responses do not get compressed before reaching the filter.
//
// .. attention::
//
// To avoid interfering with other compression filters in the same chain use this option in
// the filter closest to the upstream.
bool remove_accept_encoding_header = 3;
}
// Minimum response length, in bytes, which will trigger compression. The default value is 30.
google.protobuf.UInt32Value content_length = 1;
google.protobuf.UInt32Value content_length = 1 [deprecated = true];
// Set of strings that allows specifying which mime-types yield compression; e.g.,
// application/json, text/html, etc. When this field is not defined, compression will be applied
// to the following mime-types: "application/javascript", "application/json",
// "application/xhtml+xml", "image/svg+xml", "text/css", "text/html", "text/plain", "text/xml"
// and their synonyms.
repeated string content_type = 2;
repeated string content_type = 2 [deprecated = true];
// If true, disables compression when the response contains an etag header. When it is false, the
// filter will preserve weak etags and remove the ones that require strong validation.
bool disable_on_etag_header = 3;
bool disable_on_etag_header = 3 [deprecated = true];
// If true, removes accept-encoding from the request headers before dispatching it to the upstream
// so that responses do not get compressed before reaching the filter.
// .. attention:
//
// .. attention::
//
// To avoid interfering with other compression filters in the same chain use this option in
// the filter closest to the upstream.
bool remove_accept_encoding_header = 4;
bool remove_accept_encoding_header = 4 [deprecated = true];
// Runtime flag that controls whether the filter is enabled or not. If set to false, the
// filter will operate as a pass-through filter. If not specified, defaults to enabled.
config.core.v3.RuntimeFeatureFlag runtime_enabled = 5;
config.core.v3.RuntimeFeatureFlag runtime_enabled = 5 [deprecated = true];
// A compressor library to use for compression. Currently only
// :ref:`envoy.compression.gzip.compressor<envoy_api_msg_extensions.compression.gzip.compressor.v3.Gzip>`
// is included in Envoy.
// This field is ignored if used in the context of the gzip http-filter, but is mandatory otherwise.
config.core.v3.TypedExtensionConfig compressor_library = 6;
// Configuration for request compression. Compression is disabled by default if left empty.
RequestDirectionConfig request_direction_config = 7;
// Configuration for response compression. Compression is enabled by default if left empty.
//
// .. attention::
//
// If the field is not empty then the duplicate deprecated fields of the `Compressor` message,
// such as `content_length`, `content_type`, `disable_on_etag_header`,
// `remove_accept_encoding_header` and `runtime_enabled`, are ignored.
//
// Also all the statistics related to response compression will be rooted in
// `<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.response.*`
// instead of
// `<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.*`.
ResponseDirectionConfig response_direction_config = 8;
}

@ -0,0 +1,13 @@
# 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 = [
"//envoy/config/core/v4alpha:pkg",
"//envoy/extensions/filters/http/compressor/v3:pkg",
"@com_github_cncf_udpa//udpa/annotations:pkg",
],
)

@ -0,0 +1,106 @@
syntax = "proto3";
package envoy.extensions.filters.http.compressor.v4alpha;
import "envoy/config/core/v4alpha/base.proto";
import "envoy/config/core/v4alpha/extension.proto";
import "google/protobuf/any.proto";
import "google/protobuf/wrappers.proto";
import "udpa/annotations/status.proto";
import "udpa/annotations/versioning.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.extensions.filters.http.compressor.v4alpha";
option java_outer_classname = "CompressorProto";
option java_multiple_files = true;
option (udpa.annotations.file_status).package_version_status = NEXT_MAJOR_VERSION_CANDIDATE;
// [#protodoc-title: Compressor]
// Compressor :ref:`configuration overview <config_http_filters_compressor>`.
// [#extension: envoy.filters.http.compressor]
// [#next-free-field: 9]
message Compressor {
option (udpa.annotations.versioning).previous_message_type =
"envoy.extensions.filters.http.compressor.v3.Compressor";
message CommonDirectionConfig {
option (udpa.annotations.versioning).previous_message_type =
"envoy.extensions.filters.http.compressor.v3.Compressor.CommonDirectionConfig";
// Runtime flag that controls whether compression is enabled or not for the direction this
// common config is put in. If set to false, the filter will operate as a pass-through filter
// in the chosen direction. If the field is omitted, the filter will be enabled.
config.core.v4alpha.RuntimeFeatureFlag enabled = 1;
// Minimum value of Content-Length header of request or response messages (depending on the direction
// this common config is put in), in bytes, which will trigger compression. The default value is 30.
google.protobuf.UInt32Value min_content_length = 2;
// Set of strings that allows specifying which mime-types yield compression; e.g.,
// application/json, text/html, etc. When this field is not defined, compression will be applied
// to the following mime-types: "application/javascript", "application/json",
// "application/xhtml+xml", "image/svg+xml", "text/css", "text/html", "text/plain", "text/xml"
// and their synonyms.
repeated string content_type = 3;
}
// Configuration for filter behavior on the request direction.
message RequestDirectionConfig {
option (udpa.annotations.versioning).previous_message_type =
"envoy.extensions.filters.http.compressor.v3.Compressor.RequestDirectionConfig";
CommonDirectionConfig common_config = 1;
}
// Configuration for filter behavior on the response direction.
message ResponseDirectionConfig {
option (udpa.annotations.versioning).previous_message_type =
"envoy.extensions.filters.http.compressor.v3.Compressor.ResponseDirectionConfig";
CommonDirectionConfig common_config = 1;
// If true, disables compression when the response contains an etag header. When it is false, the
// filter will preserve weak etags and remove the ones that require strong validation.
bool disable_on_etag_header = 2;
// If true, removes accept-encoding from the request headers before dispatching it to the upstream
// so that responses do not get compressed before reaching the filter.
//
// .. attention::
//
// To avoid interfering with other compression filters in the same chain use this option in
// the filter closest to the upstream.
bool remove_accept_encoding_header = 3;
}
reserved 1, 2, 3, 4, 5;
reserved "content_length", "content_type", "disable_on_etag_header",
"remove_accept_encoding_header", "runtime_enabled";
// A compressor library to use for compression. Currently only
// :ref:`envoy.compression.gzip.compressor<envoy_api_msg_extensions.compression.gzip.compressor.v3.Gzip>`
// is included in Envoy.
// This field is ignored if used in the context of the gzip http-filter, but is mandatory otherwise.
config.core.v4alpha.TypedExtensionConfig compressor_library = 6;
// Configuration for request compression. Compression is disabled by default if left empty.
RequestDirectionConfig request_direction_config = 7;
// Configuration for response compression. Compression is enabled by default if left empty.
//
// .. attention::
//
// If the field is not empty then the duplicate deprecated fields of the `Compressor` message,
// such as `content_length`, `content_type`, `disable_on_etag_header`,
// `remove_accept_encoding_header` and `runtime_enabled`, are ignored.
//
// Also all the statistics related to response compression will be rooted in
// `<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.response.*`
// instead of
// `<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.*`.
ResponseDirectionConfig response_direction_config = 8;
}

@ -0,0 +1,13 @@
# 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 = [
"//envoy/extensions/filters/http/compressor/v4alpha:pkg",
"//envoy/extensions/filters/http/gzip/v3:pkg",
"@com_github_cncf_udpa//udpa/annotations:pkg",
],
)

@ -0,0 +1,84 @@
syntax = "proto3";
package envoy.extensions.filters.http.gzip.v4alpha;
import "envoy/extensions/filters/http/compressor/v4alpha/compressor.proto";
import "google/protobuf/wrappers.proto";
import "udpa/annotations/status.proto";
import "udpa/annotations/versioning.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.extensions.filters.http.gzip.v4alpha";
option java_outer_classname = "GzipProto";
option java_multiple_files = true;
option (udpa.annotations.file_status).package_version_status = NEXT_MAJOR_VERSION_CANDIDATE;
// [#protodoc-title: Gzip]
// Gzip :ref:`configuration overview <config_http_filters_gzip>`.
// [#extension: envoy.filters.http.gzip]
// [#next-free-field: 12]
message Gzip {
option (udpa.annotations.versioning).previous_message_type =
"envoy.extensions.filters.http.gzip.v3.Gzip";
enum CompressionStrategy {
DEFAULT = 0;
FILTERED = 1;
HUFFMAN = 2;
RLE = 3;
}
message CompressionLevel {
option (udpa.annotations.versioning).previous_message_type =
"envoy.extensions.filters.http.gzip.v3.Gzip.CompressionLevel";
enum Enum {
DEFAULT = 0;
BEST = 1;
SPEED = 2;
}
}
reserved 2, 6, 7, 8;
reserved "content_length", "content_type", "disable_on_etag_header",
"remove_accept_encoding_header";
// Value from 1 to 9 that controls the amount of internal memory used by zlib. Higher values
// use more memory, but are faster and produce better compression results. The default value is 5.
google.protobuf.UInt32Value memory_level = 1 [(validate.rules).uint32 = {lte: 9 gte: 1}];
// A value used for selecting the zlib compression level. This setting will affect speed and
// amount of compression applied to the content. "BEST" provides higher compression at the cost of
// higher latency, "SPEED" provides lower compression with minimum impact on response time.
// "DEFAULT" provides an optimal result between speed and compression. This field will be set to
// "DEFAULT" if not specified.
CompressionLevel.Enum compression_level = 3 [(validate.rules).enum = {defined_only: true}];
// A value used for selecting the zlib compression strategy which is directly related to the
// characteristics of the content. Most of the time "DEFAULT" will be the best choice, though
// there are situations which changing this parameter might produce better results. For example,
// run-length encoding (RLE) is typically used when the content is known for having sequences
// which same data occurs many consecutive times. For more information about each strategy, please
// refer to zlib manual.
CompressionStrategy compression_strategy = 4 [(validate.rules).enum = {defined_only: true}];
// Value from 9 to 15 that represents the base two logarithmic of the compressor's window size.
// Larger window results in better compression at the expense of memory usage. The default is 12
// which will produce a 4096 bytes window. For more details about this parameter, please refer to
// zlib manual > deflateInit2.
google.protobuf.UInt32Value window_bits = 9 [(validate.rules).uint32 = {lte: 15 gte: 9}];
// Set of configuration parameters common for all compression filters. If this field is set then
// the fields `content_length`, `content_type`, `disable_on_etag_header` and
// `remove_accept_encoding_header` are ignored.
compressor.v4alpha.Compressor compressor = 10;
// Value for Zlib's next output buffer. If not set, defaults to 4096.
// See https://www.zlib.net/manual.html for more details. Also see
// https://github.com/envoyproxy/envoy/issues/8448 for context on this filter's performance.
google.protobuf.UInt32Value chunk_size = 11 [(validate.rules).uint32 = {lte: 65536 gte: 4096}];
}
Loading…
Cancel
Save