Compressor

    • v3 API reference

    • This filter should be configured with the name envoy.filters.http.compressor.

    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 and brotli compression only. Other compression libraries can be supported as extensions.

    An example configuration of the filter may look like the following:

    By default request compression is disabled, but when enabled it will be skipped if:

    • A request 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.

    • content-length header is not present in the request.

    • A request contains a content-encoding header.

    • A request contains a transfer-encoding header whose value includes a known compression name.

    By default response compression is enabled, but it 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 a known compression name.

    • 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 response compression is applied:

    • The content-length is removed from response headers.

    • The “vary: accept-encoding” header is inserted on every response.

    Also the “vary: accept-encoding” header may be inserted even if compression is not applied due to incompatible “accept-encoding” header in a request. This happens when the requested resource still can be compressed given compatible “accept-encoding”. Otherwise, if an uncompressed response is cached by a caching proxy in front of Envoy, the proxy won’t know to fetch a new incoming request with compatible “accept-encoding” from upstream.

    When request compression is applied:

    • content-length is removed from request headers.

    • content-encoding with the compression scheme used (e.g., gzip) is added to request headers.

    If different compression libraries are desired for requests and responses, it is possible to install multiple compressor filters enabled only for requests or responses. For instance:

    1. http_filters:
    2. # This filter is only enabled for responses.
    3. - name: envoy.filters.http.compressor
    4. typed_config:
    5. "@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
    6. request_direction_config:
    7. common_config:
    8. enabled:
    9. default_value: false
    10. runtime_key: request_compressor_enabled
    11. compressor_library:
    12. name: for_response
    13. "@type": type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip
    14. memory_level: 3
    15. window_bits: 10
    16. compression_level: best_compression
    17. compression_strategy: default_strategy
    18. - name: envoy.filters.http.compressor
    19. typed_config:
    20. "@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
    21. response_direction_config:
    22. common_config:
    23. enabled:
    24. default_value: false
    25. request_direction_config:
    26. common_config:
    27. enabled:
    28. default_value: true
    29. runtime_key: request_compressor_enabled
    30. compressor_library:
    31. name: for_request
    32. typed_config:
    33. "@type": type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip
    34. memory_level: 9
    35. window_bits: 15
    36. compression_level: best_speed
    37. compression_strategy: default_strategy

    Every configured Compressor filter has statistics rooted at <stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.<direction_prefix>.* with the following:

    In addition to the statics common for requests and responses there are statistics specific to responses only:

    Name

    Type

    Description

    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 filter’s configured encoding 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).

    not_compressed_etag

    Counter