Line data Source code
1 : #pragma once 2 : 3 : #include "envoy/compression/compressor/factory.h" 4 : #include "envoy/extensions/compression/gzip/compressor/v3/gzip.pb.h" 5 : #include "envoy/extensions/compression/gzip/compressor/v3/gzip.pb.validate.h" 6 : 7 : #include "source/common/http/headers.h" 8 : #include "source/extensions/compression/common/compressor/factory_base.h" 9 : #include "source/extensions/compression/gzip/compressor/zlib_compressor_impl.h" 10 : 11 : namespace Envoy { 12 : namespace Extensions { 13 : namespace Compression { 14 : namespace Gzip { 15 : namespace Compressor { 16 : 17 : // Default zlib memory level. 18 : const uint64_t DefaultMemoryLevel = 5; 19 : 20 : // Default and maximum compression window size. 21 : const uint64_t DefaultWindowBits = 12; 22 : 23 : // When logical OR'ed to window bits, this sets a gzip header and trailer around the compressed 24 : // data. 25 : const uint64_t GzipHeaderValue = 16; 26 : 27 : // Default zlib chunk size. 28 : const uint32_t DefaultChunkSize = 4096; 29 : 30 : namespace { 31 : 32 0 : const std::string& gzipStatsPrefix() { CONSTRUCT_ON_FIRST_USE(std::string, "gzip."); } 33 2 : const std::string& gzipExtensionName() { 34 2 : CONSTRUCT_ON_FIRST_USE(std::string, "envoy.compression.gzip.compressor"); 35 2 : } 36 : 37 : } // namespace 38 : 39 : class GzipCompressorFactory : public Envoy::Compression::Compressor::CompressorFactory { 40 : public: 41 : GzipCompressorFactory(const envoy::extensions::compression::gzip::compressor::v3::Gzip& gzip); 42 : 43 : // Envoy::Compression::Compressor::CompressorFactory 44 : Envoy::Compression::Compressor::CompressorPtr createCompressor() override; 45 0 : const std::string& statsPrefix() const override { return gzipStatsPrefix(); } 46 0 : const std::string& contentEncoding() const override { 47 0 : return Http::CustomHeaders::get().ContentEncodingValues.Gzip; 48 0 : } 49 : 50 : private: 51 : static ZlibCompressorImpl::CompressionLevel 52 : compressionLevelEnum(envoy::extensions::compression::gzip::compressor::v3::Gzip::CompressionLevel 53 : compression_level); 54 : static ZlibCompressorImpl::CompressionStrategy compressionStrategyEnum( 55 : envoy::extensions::compression::gzip::compressor::v3::Gzip::CompressionStrategy 56 : compression_strategy); 57 : 58 : ZlibCompressorImpl::CompressionLevel compression_level_; 59 : ZlibCompressorImpl::CompressionStrategy compression_strategy_; 60 : const int32_t memory_level_; 61 : const int32_t window_bits_; 62 : const uint32_t chunk_size_; 63 : }; 64 : 65 : class GzipCompressorLibraryFactory 66 : : public Compression::Common::Compressor::CompressorLibraryFactoryBase< 67 : envoy::extensions::compression::gzip::compressor::v3::Gzip> { 68 : public: 69 2 : GzipCompressorLibraryFactory() : CompressorLibraryFactoryBase(gzipExtensionName()) {} 70 : 71 : private: 72 : Envoy::Compression::Compressor::CompressorFactoryPtr createCompressorFactoryFromProtoTyped( 73 : const envoy::extensions::compression::gzip::compressor::v3::Gzip& config, 74 : Server::Configuration::FactoryContext& context) override; 75 : }; 76 : 77 : DECLARE_FACTORY(GzipCompressorLibraryFactory); 78 : 79 : } // namespace Compressor 80 : } // namespace Gzip 81 : } // namespace Compression 82 : } // namespace Extensions 83 : } // namespace Envoy