Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ proto_library(
"//envoy/extensions/filters/http/file_system_buffer/v3:pkg",
"//envoy/extensions/filters/http/gcp_authn/v3:pkg",
"//envoy/extensions/filters/http/geoip/v3:pkg",
"//envoy/extensions/filters/http/grpc_compressor/v3:pkg",
"//envoy/extensions/filters/http/grpc_field_extraction/v3:pkg",
"//envoy/extensions/filters/http/grpc_http1_bridge/v3:pkg",
"//envoy/extensions/filters/http/grpc_http1_reverse_bridge/v3:pkg",
Expand Down
12 changes: 12 additions & 0 deletions api/envoy/extensions/filters/http/grpc_compressor/v3/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# 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/v3:pkg",
"@com_github_cncf_xds//udpa/annotations:pkg",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
syntax = "proto3";

package envoy.extensions.filters.http.grpc_compressor.v3;

import "envoy/config/core/v3/base.proto";
import "envoy/config/core/v3/extension.proto";

import "google/protobuf/wrappers.proto";

import "udpa/annotations/status.proto";
import "validate/validate.proto";

option java_package = "io.envoyproxy.envoy.extensions.filters.http.grpc_compressor.v3";
option java_outer_classname = "CompressorProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/grpc_compressor/v3;grpc_compressorv3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: gRPC Compressor]
// gRPC Compressor :ref:`configuration overview <config_http_filters_grpc_compressor>`.
// [#extension: envoy.filters.http.grpc_compressor]

message Compressor {
// Common configuration for filter behavior on both the request and response direction.
message CommonDirectionConfig {
// Runtime flag that controls whether compression is enabled for the direction this
// common config is applied to. When this field is ``false``, the filter will operate as a
// pass-through filter in the chosen direction, unless overridden by ``CompressorPerRoute``.
// If this field is not specified, the filter will be enabled.
config.core.v3.RuntimeFeatureFlag enabled = 1;

// If set to true, the filter modifies the grpc-accept-encoding header by removing the compressor_library's encoding.
// This can help induce the peer not to compress the message to delegate compression to the filter if compression in
// the other direction is enabled.
// Defaults to false.
google.protobuf.BoolValue remove_grpc_accept_encoding = 2;

// Minimum message length, in bytes, that will trigger compression. Defaults to 30.
google.protobuf.UInt32Value min_message_length = 3;

// Maximum message length, in bytes. Defaults to 10240. If a message is larger than this value,
// Envoy will reset the stream. This is to ensure the filter does not buffer excessive data
// while waiting for a message to be fully received.
google.protobuf.UInt32Value max_message_length = 4;
}

// 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;
}

// A compressor library to use for compression.
// [#extension-category: envoy.compression.compressor]
config.core.v3.TypedExtensionConfig compressor_library = 1
[(validate.rules).message = {required: true}];

// Configuration for request compression. If this field is not specified, request compression is disabled.
RequestDirectionConfig request_direction_config = 2;

// Configuration for response compression. If this field is not specified, response compression is enabled.
ResponseDirectionConfig response_direction_config = 3;
}
1 change: 1 addition & 0 deletions api/versioning/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ proto_library(
"//envoy/extensions/filters/http/file_system_buffer/v3:pkg",
"//envoy/extensions/filters/http/gcp_authn/v3:pkg",
"//envoy/extensions/filters/http/geoip/v3:pkg",
"//envoy/extensions/filters/http/grpc_compressor/v3:pkg",
"//envoy/extensions/filters/http/grpc_field_extraction/v3:pkg",
"//envoy/extensions/filters/http/grpc_http1_bridge/v3:pkg",
"//envoy/extensions/filters/http/grpc_http1_reverse_bridge/v3:pkg",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.. _config_http_filters_grpc_compression:

gRPC Compression
================

* gRPC :ref:`architecture overview <arch_overview_grpc>`
* This filter should be configured with the type URL ``type.googleapis.com/envoy.extensions.filters.http.grpc_compressor.v3.Compressor``.
* :ref:`v3 API reference <envoy_v3_api_msg_extensions.filters.http.grpc_compressor.v3.Compressor>`

The gRPC compression filter enables compression of messages following the `gRPC over HTTP/2 specification
<https://github.com/grpc/grpc/blob/345f048b5bebda1e03eb1c520ee0e18d7a694d11/doc/PROTOCOL-HTTP2.md#introduction>`_.
1 change: 1 addition & 0 deletions envoy/compression/compressor/factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class CompressorFactory {
public:
virtual ~CompressorFactory() = default;

// Create a new compressor instance. This should be thread-safe.
virtual CompressorPtr createCompressor() PURE;
virtual const std::string& statsPrefix() const PURE;
virtual const std::string& contentEncoding() const PURE;
Expand Down
1 change: 1 addition & 0 deletions source/extensions/extensions_build_config.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ EXTENSIONS = {
"envoy.filters.http.file_system_buffer": "//source/extensions/filters/http/file_system_buffer:config",
"envoy.filters.http.gcp_authn": "//source/extensions/filters/http/gcp_authn:config",
"envoy.filters.http.geoip": "//source/extensions/filters/http/geoip:config",
"envoy.filters.http.grpc_compressor": "//source/extensions/filters/http/grpc_compressor:config",
"envoy.filters.http.grpc_field_extraction": "//source/extensions/filters/http/grpc_field_extraction:config",
"envoy.filters.http.grpc_http1_bridge": "//source/extensions/filters/http/grpc_http1_bridge:config",
"envoy.filters.http.grpc_http1_reverse_bridge": "//source/extensions/filters/http/grpc_http1_reverse_bridge:config",
Expand Down
7 changes: 7 additions & 0 deletions source/extensions/extensions_metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,13 @@ envoy.filters.http.compressor:
type_urls:
- envoy.extensions.filters.http.compressor.v3.Compressor
- envoy.extensions.filters.http.compressor.v3.CompressorPerRoute
envoy.filters.http.grpc_compressor:
categories:
- envoy.filters.http
security_posture: unknown
status: wip
type_urls:
- envoy.extensions.filters.http.grpc_compressor.v3.Compressor
envoy.filters.http.connect_grpc_bridge:
categories:
- envoy.filters.http
Expand Down
44 changes: 44 additions & 0 deletions source/extensions/filters/http/grpc_compressor/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_extension",
"envoy_cc_library",
"envoy_extension_package",
)

licenses(["notice"]) # Apache 2

# HTTP L7 filter that performs compression with configurable compression libraries
# Public docs: https://envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/compressor_filter

envoy_extension_package()

envoy_cc_library(
name = "compressor_filter_lib",
srcs = ["compressor_filter.cc"],
hdrs = ["compressor_filter.h"],
deps = [
"//envoy/compression/compressor:compressor_config_interface",
"//envoy/compression/compressor:compressor_factory_interface",
"//envoy/registry",
"//envoy/stats:stats_macros",
"//source/common/config:utility_lib",
"//source/common/grpc:codec_lib",
"//source/common/runtime:runtime_lib",
"//source/extensions/filters/http/common:pass_through_filter_lib",
"@envoy_api//envoy/extensions/filters/http/grpc_compressor/v3:pkg_cc_proto",
],
)

envoy_cc_extension(
name = "config",
srcs = ["config.cc"],
hdrs = ["config.h"],
deps = [
":compressor_filter_lib",
"//envoy/compression/compressor:compressor_config_interface",
"//source/common/config:utility_lib",
"//source/extensions/filters/http/common:factory_base_lib",
"//source/server:generic_factory_context_lib",
"@envoy_api//envoy/extensions/filters/http/grpc_compressor/v3:pkg_cc_proto",
],
)
Loading