Skip to content

Commit 59286ea

Browse files
committed
initial impl of grpc compression filter
Signed-off-by: William Zhang <[email protected]>
1 parent b18b993 commit 59286ea

File tree

13 files changed

+732
-0
lines changed

13 files changed

+732
-0
lines changed

api/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ proto_library(
195195
"//envoy/extensions/filters/http/file_system_buffer/v3:pkg",
196196
"//envoy/extensions/filters/http/gcp_authn/v3:pkg",
197197
"//envoy/extensions/filters/http/geoip/v3:pkg",
198+
"//envoy/extensions/filters/http/grpc_compressor/v3:pkg",
198199
"//envoy/extensions/filters/http/grpc_field_extraction/v3:pkg",
199200
"//envoy/extensions/filters/http/grpc_http1_bridge/v3:pkg",
200201
"//envoy/extensions/filters/http/grpc_http1_reverse_bridge/v3:pkg",
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# DO NOT EDIT. This file is generated by tools/proto_format/proto_sync.py.
2+
3+
load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package")
4+
5+
licenses(["notice"]) # Apache 2
6+
7+
api_proto_package(
8+
deps = [
9+
"//envoy/config/core/v3:pkg",
10+
"@com_github_cncf_xds//udpa/annotations:pkg",
11+
],
12+
)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
syntax = "proto3";
2+
3+
package envoy.extensions.filters.http.grpc_compressor.v3;
4+
5+
import "envoy/config/core/v3/base.proto";
6+
import "envoy/config/core/v3/extension.proto";
7+
8+
import "google/protobuf/wrappers.proto";
9+
10+
import "udpa/annotations/status.proto";
11+
import "validate/validate.proto";
12+
13+
option java_package = "io.envoyproxy.envoy.extensions.filters.http.grpc_compressor.v3";
14+
option java_outer_classname = "CompressorProto";
15+
option java_multiple_files = true;
16+
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/grpc_compressor/v3;grpc_compressorv3";
17+
option (udpa.annotations.file_status).package_version_status = ACTIVE;
18+
19+
// [#protodoc-title: gRPC Compressor]
20+
// gRPC Compressor :ref:`configuration overview <config_http_filters_grpc_compressor>`.
21+
// [#extension: envoy.filters.http.grpc_compressor]
22+
23+
message Compressor {
24+
// Common configuration for filter behavior on both the request and response direction.
25+
message CommonDirectionConfig {
26+
// Runtime flag that controls whether compression is enabled for the direction this
27+
// common config is applied to. When this field is ``false``, the filter will operate as a
28+
// pass-through filter in the chosen direction, unless overridden by ``CompressorPerRoute``.
29+
// If this field is not specified, the filter will be enabled.
30+
config.core.v3.RuntimeFeatureFlag enabled = 1;
31+
32+
// If set to true, the filter modifies the grpc-accept-encoding header by removing the compressor_library's encoding.
33+
// This can help induce the peer not to compress the message to delegate compression to the filter if compression in
34+
// the other direction is enabled.
35+
// Defaults to false.
36+
google.protobuf.BoolValue remove_grpc_accept_encoding = 2;
37+
38+
// Minimum message length, in bytes, that will trigger compression. Defaults to 30.
39+
google.protobuf.UInt32Value min_message_length = 3;
40+
41+
// Maximum message length, in bytes. Defaults to 10240. If a message is larger than this value,
42+
// Envoy will reset the stream. This is to ensure the filter does not buffer excessive data
43+
// while waiting for a message to be fully received.
44+
google.protobuf.UInt32Value max_message_length = 4;
45+
}
46+
47+
// Configuration for filter behavior on the request direction.
48+
message RequestDirectionConfig {
49+
CommonDirectionConfig common_config = 1;
50+
}
51+
52+
// Configuration for filter behavior on the response direction.
53+
message ResponseDirectionConfig {
54+
CommonDirectionConfig common_config = 1;
55+
}
56+
57+
// A compressor library to use for compression.
58+
// [#extension-category: envoy.compression.compressor]
59+
config.core.v3.TypedExtensionConfig compressor_library = 1
60+
[(validate.rules).message = {required: true}];
61+
62+
// Configuration for request compression. If this field is not specified, request compression is disabled.
63+
RequestDirectionConfig request_direction_config = 2;
64+
65+
// Configuration for response compression. If this field is not specified, response compression is enabled.
66+
ResponseDirectionConfig response_direction_config = 3;
67+
}

api/versioning/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ proto_library(
134134
"//envoy/extensions/filters/http/file_system_buffer/v3:pkg",
135135
"//envoy/extensions/filters/http/gcp_authn/v3:pkg",
136136
"//envoy/extensions/filters/http/geoip/v3:pkg",
137+
"//envoy/extensions/filters/http/grpc_compressor/v3:pkg",
137138
"//envoy/extensions/filters/http/grpc_field_extraction/v3:pkg",
138139
"//envoy/extensions/filters/http/grpc_http1_bridge/v3:pkg",
139140
"//envoy/extensions/filters/http/grpc_http1_reverse_bridge/v3:pkg",
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.. _config_http_filters_grpc_compression:
2+
3+
gRPC Compression
4+
================
5+
6+
* gRPC :ref:`architecture overview <arch_overview_grpc>`
7+
* This filter should be configured with the type URL ``type.googleapis.com/envoy.extensions.filters.http.grpc_compressor.v3.Compressor``.
8+
* :ref:`v3 API reference <envoy_v3_api_msg_extensions.filters.http.grpc_compressor.v3.Compressor>`
9+
10+
The gRPC compression filter enables compression of messages following the `gRPC over HTTP/2 specification
11+
<https://github.com/grpc/grpc/blob/345f048b5bebda1e03eb1c520ee0e18d7a694d11/doc/PROTOCOL-HTTP2.md#introduction>`_.

envoy/compression/compressor/factory.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class CompressorFactory {
1010
public:
1111
virtual ~CompressorFactory() = default;
1212

13+
// Create a new compressor instance. This should be thread-safe.
1314
virtual CompressorPtr createCompressor() PURE;
1415
virtual const std::string& statsPrefix() const PURE;
1516
virtual const std::string& contentEncoding() const PURE;

source/extensions/extensions_build_config.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ EXTENSIONS = {
176176
"envoy.filters.http.file_system_buffer": "//source/extensions/filters/http/file_system_buffer:config",
177177
"envoy.filters.http.gcp_authn": "//source/extensions/filters/http/gcp_authn:config",
178178
"envoy.filters.http.geoip": "//source/extensions/filters/http/geoip:config",
179+
"envoy.filters.http.grpc_compressor": "//source/extensions/filters/http/grpc_compressor:config",
179180
"envoy.filters.http.grpc_field_extraction": "//source/extensions/filters/http/grpc_field_extraction:config",
180181
"envoy.filters.http.grpc_http1_bridge": "//source/extensions/filters/http/grpc_http1_bridge:config",
181182
"envoy.filters.http.grpc_http1_reverse_bridge": "//source/extensions/filters/http/grpc_http1_reverse_bridge:config",

source/extensions/extensions_metadata.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,13 @@ envoy.filters.http.compressor:
369369
type_urls:
370370
- envoy.extensions.filters.http.compressor.v3.Compressor
371371
- envoy.extensions.filters.http.compressor.v3.CompressorPerRoute
372+
envoy.filters.http.grpc_compressor:
373+
categories:
374+
- envoy.filters.http
375+
security_posture: unknown
376+
status: wip
377+
type_urls:
378+
- envoy.extensions.filters.http.grpc_compressor.v3.Compressor
372379
envoy.filters.http.connect_grpc_bridge:
373380
categories:
374381
- envoy.filters.http
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
load(
2+
"//bazel:envoy_build_system.bzl",
3+
"envoy_cc_extension",
4+
"envoy_cc_library",
5+
"envoy_extension_package",
6+
)
7+
8+
licenses(["notice"]) # Apache 2
9+
10+
# HTTP L7 filter that performs compression with configurable compression libraries
11+
# Public docs: https://envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/compressor_filter
12+
13+
envoy_extension_package()
14+
15+
envoy_cc_library(
16+
name = "compressor_filter_lib",
17+
srcs = ["compressor_filter.cc"],
18+
hdrs = ["compressor_filter.h"],
19+
deps = [
20+
"//envoy/compression/compressor:compressor_config_interface",
21+
"//envoy/compression/compressor:compressor_factory_interface",
22+
"//envoy/registry",
23+
"//envoy/stats:stats_macros",
24+
"//source/common/config:utility_lib",
25+
"//source/common/grpc:codec_lib",
26+
"//source/common/runtime:runtime_lib",
27+
"//source/extensions/filters/http/common:pass_through_filter_lib",
28+
"@envoy_api//envoy/extensions/filters/http/grpc_compressor/v3:pkg_cc_proto",
29+
],
30+
)
31+
32+
envoy_cc_extension(
33+
name = "config",
34+
srcs = ["config.cc"],
35+
hdrs = ["config.h"],
36+
deps = [
37+
":compressor_filter_lib",
38+
"//envoy/compression/compressor:compressor_config_interface",
39+
"//source/common/config:utility_lib",
40+
"//source/extensions/filters/http/common:factory_base_lib",
41+
"//source/server:generic_factory_context_lib",
42+
"@envoy_api//envoy/extensions/filters/http/grpc_compressor/v3:pkg_cc_proto",
43+
],
44+
)

0 commit comments

Comments
 (0)