From 0b0213fdc38eb0d0346659cf90bd4c502cadb00c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Guti=C3=A9rrez=20Segal=C3=A9s?= Date: Sat, 25 Apr 2020 18:03:49 -0400 Subject: [PATCH] gzip filter: allow setting zlib compressor's chunk size (#10508) Signed-off-by: Raul Gutierrez Segales --- .../extensions/filters/http/gzip/v3/gzip.proto | 7 ++++++- docs/root/version_history/current.rst | 1 + .../extensions/filters/http/gzip/v3/gzip.proto | 7 ++++++- .../extensions/filters/http/gzip/gzip_filter.cc | 5 +++-- source/extensions/filters/http/gzip/gzip_filter.h | 6 ++++-- .../filters/http/gzip/gzip_filter_test.cc | 15 +++++++++++++++ 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/api/envoy/extensions/filters/http/gzip/v3/gzip.proto b/api/envoy/extensions/filters/http/gzip/v3/gzip.proto index eb8a69f083ba..20cae5c400d3 100644 --- a/api/envoy/extensions/filters/http/gzip/v3/gzip.proto +++ b/api/envoy/extensions/filters/http/gzip/v3/gzip.proto @@ -19,7 +19,7 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE; // Gzip :ref:`configuration overview `. // [#extension: envoy.filters.http.gzip] -// [#next-free-field: 11] +// [#next-free-field: 12] message Gzip { option (udpa.annotations.versioning).previous_message_type = "envoy.config.filter.http.gzip.v2.Gzip"; @@ -76,4 +76,9 @@ message Gzip { // the fields `content_length`, `content_type`, `disable_on_etag_header` and // `remove_accept_encoding_header` are ignored. compressor.v3.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}]; } diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index b2cc90a89d19..2449c881fa10 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -13,6 +13,7 @@ Changes Disabled by default and can be enabled via :ref:`enable_upstream_stats `. * grpc-json: added support for streaming response using `google.api.HttpBody `_. +* gzip filter: added option to set zlib's next output buffer size. * http: fixed a bug where in some cases slash was moved from path to query string when :ref:`merging of adjacent slashes` is enabled. * http: fixed a bug where the upgrade header was not cleared on responses to non-upgrade requests. Can be reverted temporarily by setting runtime feature `envoy.reloadable_features.fix_upgrade_response` to false. diff --git a/generated_api_shadow/envoy/extensions/filters/http/gzip/v3/gzip.proto b/generated_api_shadow/envoy/extensions/filters/http/gzip/v3/gzip.proto index 3206037723de..e711827481a3 100644 --- a/generated_api_shadow/envoy/extensions/filters/http/gzip/v3/gzip.proto +++ b/generated_api_shadow/envoy/extensions/filters/http/gzip/v3/gzip.proto @@ -19,7 +19,7 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE; // Gzip :ref:`configuration overview `. // [#extension: envoy.filters.http.gzip] -// [#next-free-field: 11] +// [#next-free-field: 12] message Gzip { option (udpa.annotations.versioning).previous_message_type = "envoy.config.filter.http.gzip.v2.Gzip"; @@ -72,6 +72,11 @@ message Gzip { // `remove_accept_encoding_header` are ignored. compressor.v3.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}]; + google.protobuf.UInt32Value hidden_envoy_deprecated_content_length = 2 [deprecated = true]; repeated string hidden_envoy_deprecated_content_type = 6 [deprecated = true]; diff --git a/source/extensions/filters/http/gzip/gzip_filter.cc b/source/extensions/filters/http/gzip/gzip_filter.cc index 846500cd6dab..f9c3572a1a35 100644 --- a/source/extensions/filters/http/gzip/gzip_filter.cc +++ b/source/extensions/filters/http/gzip/gzip_filter.cc @@ -28,10 +28,11 @@ GzipFilterConfig::GzipFilterConfig(const envoy::extensions::filters::http::gzip: compression_level_(compressionLevelEnum(gzip.compression_level())), compression_strategy_(compressionStrategyEnum(gzip.compression_strategy())), memory_level_(memoryLevelUint(gzip.memory_level().value())), - window_bits_(windowBitsUint(gzip.window_bits().value())) {} + window_bits_(windowBitsUint(gzip.window_bits().value())), + chunk_size_(PROTOBUF_GET_WRAPPED_OR_DEFAULT(gzip, chunk_size, 4096)) {} std::unique_ptr GzipFilterConfig::makeCompressor() { - auto compressor = std::make_unique(); + auto compressor = std::make_unique(chunk_size_); compressor->init(compressionLevel(), compressionStrategy(), windowBits(), memoryLevel()); return compressor; } diff --git a/source/extensions/filters/http/gzip/gzip_filter.h b/source/extensions/filters/http/gzip/gzip_filter.h index a7c6406c2dc4..ec56b28ddf92 100644 --- a/source/extensions/filters/http/gzip/gzip_filter.h +++ b/source/extensions/filters/http/gzip/gzip_filter.h @@ -31,6 +31,7 @@ class GzipFilterConfig : public Common::Compressors::CompressorFilterConfig { uint64_t memoryLevel() const { return memory_level_; } uint64_t windowBits() const { return window_bits_; } + uint32_t chunkSize() const { return chunk_size_; } private: static Compressor::ZlibCompressorImpl::CompressionLevel compressionLevelEnum( @@ -48,8 +49,9 @@ class GzipFilterConfig : public Common::Compressors::CompressorFilterConfig { Compressor::ZlibCompressorImpl::CompressionLevel compression_level_; Compressor::ZlibCompressorImpl::CompressionStrategy compression_strategy_; - int32_t memory_level_; - int32_t window_bits_; + const int32_t memory_level_; + const int32_t window_bits_; + const uint32_t chunk_size_; }; } // namespace Gzip diff --git a/test/extensions/filters/http/gzip/gzip_filter_test.cc b/test/extensions/filters/http/gzip/gzip_filter_test.cc index 24f715b569e7..565b84de2523 100644 --- a/test/extensions/filters/http/gzip/gzip_filter_test.cc +++ b/test/extensions/filters/http/gzip/gzip_filter_test.cc @@ -417,6 +417,21 @@ TEST(GzipFilterConfigTest, DEPRECATED_FEATURE_TEST(DeprecatedExtensionFilterName deprecated_name)); } +// Test setting zlib's chunk size. +TEST_F(GzipFilterTest, ChunkSize) { + // Default + setUpFilter("{}"); + EXPECT_EQ(config_->chunkSize(), 4096); + + // Override + setUpFilter(R"EOF( +{ + "chunk_size": 8192 +} +)EOF"); + EXPECT_EQ(config_->chunkSize(), 8192); +} + } // namespace Gzip } // namespace HttpFilters } // namespace Extensions