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
51
const std::string& gzipStatsPrefix() { CONSTRUCT_ON_FIRST_USE(std::string, "gzip."); }
33
12
const std::string& gzipExtensionName() {
34
12
  CONSTRUCT_ON_FIRST_USE(std::string, "envoy.compression.gzip.compressor");
35
12
}
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
51
  const std::string& statsPrefix() const override { return gzipStatsPrefix(); }
46
65
  const std::string& contentEncoding() const override {
47
65
    return Http::CustomHeaders::get().ContentEncodingValues.Gzip;
48
65
  }
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
12
  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::GenericFactoryContext& context) override;
75
};
76

            
77
DECLARE_FACTORY(GzipCompressorLibraryFactory);
78

            
79
} // namespace Compressor
80
} // namespace Gzip
81
} // namespace Compression
82
} // namespace Extensions
83
} // namespace Envoy