forked from envoyproxy/envoy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
compressor: expose generic compressor filter to users (envoyproxy#10553)
Currently the generic HTTP compressor filter isn't exposed to users even though it's used internally by `envoy.filters.http.gzip` and can be used by external filter extensions. Expose the compressor's config API to users. For example the filter can be configured as follows: ... filter_chains: filters: - name: envoy.http_connection_manager config: http_filters: - name: envoy.filters.http.compressor config: disable_on_etag_header: true content_length: 100 content_type: - text/html - application/json compressor_library: name: envoy.filters.http.compressor.gzip config: memory_level: 3 window_bits: 10 compression_level: best compression_strategy: rle ... Multiple compressor filters using different compressor libraries, e.g. gzip and brotli, can be stacked in one filter chain. Signed-off-by: Dmitry Rozhkov <[email protected]>
- Loading branch information
Showing
69 changed files
with
2,102 additions
and
459 deletions.
There are no files selected for viewing
Validating CODEOWNERS rules …
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# DO NOT EDIT. This file is generated by tools/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"], | ||
) |
79 changes: 79 additions & 0 deletions
79
api/envoy/extensions/compression/gzip/compressor/v3/gzip.proto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
syntax = "proto3"; | ||
|
||
package envoy.extensions.compression.gzip.compressor.v3; | ||
|
||
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.compression.gzip.compressor.v3"; | ||
option java_outer_classname = "GzipProto"; | ||
option java_multiple_files = true; | ||
option (udpa.annotations.file_status).package_version_status = ACTIVE; | ||
|
||
// [#protodoc-title: Gzip] | ||
// [#extension: envoy.compression.gzip.compressor] | ||
|
||
// [#next-free-field: 6] | ||
message Gzip { | ||
// All the values of this enumeration translate directly to zlib's compression strategies. | ||
// For more information about each strategy, please refer to zlib manual. | ||
enum CompressionStrategy { | ||
DEFAULT_STRATEGY = 0; | ||
FILTERED = 1; | ||
HUFFMAN_ONLY = 2; | ||
RLE = 3; | ||
FIXED = 4; | ||
} | ||
|
||
enum CompressionLevel { | ||
option allow_alias = true; | ||
|
||
DEFAULT_COMPRESSION = 0; | ||
BEST_SPEED = 1; | ||
COMPRESSION_LEVEL_1 = 1; | ||
COMPRESSION_LEVEL_2 = 2; | ||
COMPRESSION_LEVEL_3 = 3; | ||
COMPRESSION_LEVEL_4 = 4; | ||
COMPRESSION_LEVEL_5 = 5; | ||
COMPRESSION_LEVEL_6 = 6; | ||
COMPRESSION_LEVEL_7 = 7; | ||
COMPRESSION_LEVEL_8 = 8; | ||
COMPRESSION_LEVEL_9 = 9; | ||
BEST_COMPRESSION = 9; | ||
} | ||
|
||
// 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_COMPRESSION" provides higher compression | ||
// at the cost of higher latency and is equal to "COMPRESSION_LEVEL_9". "BEST_SPEED" provides | ||
// lower compression with minimum impact on response time, the same as "COMPRESSION_LEVEL_1". | ||
// "DEFAULT_COMPRESSION" provides an optimal result between speed and compression. According | ||
// to zlib's manual this level gives the same result as "COMPRESSION_LEVEL_6". | ||
// This field will be set to "DEFAULT_COMPRESSION" if not specified. | ||
CompressionLevel compression_level = 2 [(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_STRATEGY" will be the best choice, | ||
// which is also the default value for the parameter, though there are situations when | ||
// 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 = 3 [(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 = 4 [(validate.rules).uint32 = {lte: 15 gte: 9}]; | ||
|
||
// 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 = 5 [(validate.rules).uint32 = {lte: 65536 gte: 4096}]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
Compression | ||
=========== | ||
|
||
.. toctree:: | ||
:glob: | ||
:maxdepth: 2 | ||
|
||
../../extensions/compression/gzip/*/v3/* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
108 changes: 108 additions & 0 deletions
108
docs/root/configuration/http/http_filters/compressor_filter.rst
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
.. _config_http_filters_compressor: | ||
|
||
Compressor | ||
========== | ||
Compressor is an HTTP filter which enables Envoy to compress dispatched data | ||
from an upstream service upon client request. Compression is useful in | ||
situations when bandwidth is scarce and large payloads can be effectively compressed | ||
at the expense of higher CPU load or offloading it to a compression accelerator. | ||
|
||
.. note:: | ||
|
||
This filter deprecates the :ref:`HTTP Gzip filter <config_http_filters_gzip>`. | ||
|
||
Configuration | ||
------------- | ||
* :ref:`v3 API reference <envoy_v3_api_msg_extensions.filters.http.compressor.v3.Compressor>` | ||
* This filter should be configured with the name *envoy.filters.http.compressor*. | ||
|
||
How it works | ||
------------ | ||
When compressor filter is enabled, request and response headers are inspected to | ||
determine whether or not the content should be compressed. The content is | ||
compressed and then sent to the client with the appropriate headers, if | ||
response and request allow. | ||
|
||
Currently the filter supports :ref:`gzip compression <envoy_v3_api_msg_extensions.compression.gzip.compressor.v3.Gzip>` | ||
only. Other compression libraries can be supported as extensions. | ||
|
||
An example configuration of the filter may look like the following: | ||
|
||
.. code-block:: yaml | ||
http_filters: | ||
- name: compressor | ||
typed_config: | ||
"@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor | ||
disable_on_etag_header: true | ||
content_length: 100 | ||
content_type: | ||
- text/html | ||
- application/json | ||
compressor_library: | ||
name: text_optimized | ||
typed_config: | ||
"@type": type.googleapis.com/envoy.extensions.filters.http.compressor.gzip.v3.Gzip | ||
memory_level: 3 | ||
window_bits: 10 | ||
compression_level: best | ||
compression_strategy: default_strategy | ||
By *default* compression will be *skipped* when: | ||
|
||
- A request does NOT contain *accept-encoding* header. | ||
- A request includes *accept-encoding* header, but it does not contain "gzip" or "\*". | ||
- A request includes *accept-encoding* with "gzip" or "\*" with the weight "q=0". Note | ||
that the "gzip" will have a higher weight then "\*". For example, if *accept-encoding* | ||
is "gzip;q=0,\*;q=1", the filter will not compress. But if the header is set to | ||
"\*;q=0,gzip;q=1", the filter will compress. | ||
- A request whose *accept-encoding* header includes any encoding type with a higher | ||
weight than "gzip"'s given the corresponding compression filter is present in the chain. | ||
- A response contains a *content-encoding* header. | ||
- A response contains a *cache-control* header whose value includes "no-transform". | ||
- A response contains a *transfer-encoding* header whose value includes "gzip". | ||
- A response does not contain a *content-type* value that matches one of the selected | ||
mime-types, which default to *application/javascript*, *application/json*, | ||
*application/xhtml+xml*, *image/svg+xml*, *text/css*, *text/html*, *text/plain*, | ||
*text/xml*. | ||
- Neither *content-length* nor *transfer-encoding* headers are present in | ||
the response. | ||
- Response size is smaller than 30 bytes (only applicable when *transfer-encoding* | ||
is not chunked). | ||
|
||
Please note that in case the filter is configured to use a compression library extension | ||
other than gzip it looks for content encoding in the *accept-encoding* header provided by | ||
the extension. | ||
|
||
When compression is *applied*: | ||
|
||
- The *content-length* is removed from response headers. | ||
- Response headers contain "*transfer-encoding: chunked*" and do not contain | ||
"*content-encoding*" header. | ||
- The "*vary: accept-encoding*" header is inserted on every response. | ||
|
||
.. _compressor-statistics: | ||
|
||
Statistics | ||
---------- | ||
|
||
Every configured Compressor filter has statistics rooted at | ||
<stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.* | ||
with the following: | ||
|
||
.. csv-table:: | ||
:header: Name, Type, Description | ||
:widths: 1, 1, 2 | ||
|
||
compressed, Counter, Number of requests compressed. | ||
not_compressed, Counter, Number of requests not compressed. | ||
no_accept_header, Counter, Number of requests with no accept header sent. | ||
header_identity, Counter, Number of requests sent with "identity" set as the *accept-encoding*. | ||
header_compressor_used, Counter, Number of requests sent with "gzip" set as the *accept-encoding*. | ||
header_compressor_overshadowed, Counter, Number of requests skipped by this filter instance because they were handled by another filter in the same filter chain. | ||
header_wildcard, Counter, Number of requests sent with "\*" set as the *accept-encoding*. | ||
header_not_valid, Counter, Number of requests sent with a not valid *accept-encoding* header (aka "q=0" or an unsupported encoding type). | ||
total_uncompressed_bytes, Counter, The total uncompressed bytes of all the requests that were marked for compression. | ||
total_compressed_bytes, Counter, The total compressed bytes of all the requests that were marked for compression. | ||
content_length_too_small, Counter, Number of requests that accepted gzip encoding but did not compress because the payload was too small. | ||
not_compressed_etag, Counter, Number of requests that were not compressed due to the etag header. *disable_on_etag_header* must be turned on for this to happen. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
generated_api_shadow/envoy/extensions/compression/gzip/compressor/v3/BUILD
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.