1
#pragma once
2

            
3
#include "envoy/compression/compressor/factory.h"
4
#include "envoy/extensions/compression/brotli/compressor/v3/brotli.pb.h"
5
#include "envoy/extensions/compression/brotli/compressor/v3/brotli.pb.validate.h"
6

            
7
#include "source/common/http/headers.h"
8
#include "source/extensions/compression/brotli/compressor/brotli_compressor_impl.h"
9
#include "source/extensions/compression/common/compressor/factory_base.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace Compression {
14
namespace Brotli {
15
namespace Compressor {
16

            
17
// Default input block size.
18
const uint32_t DefaultInputBlockBits = 24;
19

            
20
// Default compression window size.
21
const uint32_t DefaultWindowBits = 18;
22

            
23
// Default quality.
24
const uint32_t DefaultQuality = 3;
25

            
26
// Default zlib chunk size.
27
const uint32_t DefaultChunkSize = 4096;
28

            
29
namespace {
30

            
31
4
const std::string& brotliStatsPrefix() { CONSTRUCT_ON_FIRST_USE(std::string, "brotli."); }
32
9
const std::string& brotliExtensionName() {
33
9
  CONSTRUCT_ON_FIRST_USE(std::string, "envoy.compression.brotli.compressor");
34
9
}
35

            
36
} // namespace
37

            
38
class BrotliCompressorFactory : public Envoy::Compression::Compressor::CompressorFactory {
39
public:
40
  BrotliCompressorFactory(
41
      const envoy::extensions::compression::brotli::compressor::v3::Brotli& brotli);
42

            
43
  // Envoy::Compression::Compressor::CompressorFactory
44
  Envoy::Compression::Compressor::CompressorPtr createCompressor() override;
45
4
  const std::string& statsPrefix() const override { return brotliStatsPrefix(); }
46
18
  const std::string& contentEncoding() const override {
47
18
    return Http::CustomHeaders::get().ContentEncodingValues.Brotli;
48
18
  }
49

            
50
private:
51
  static BrotliCompressorImpl::EncoderMode encoderModeEnum(
52
      envoy::extensions::compression::brotli::compressor::v3::Brotli::EncoderMode encoder_mode);
53
  const uint32_t chunk_size_;
54
  const bool disable_literal_context_modeling_;
55
  const BrotliCompressorImpl::EncoderMode encoder_mode_;
56
  const uint32_t input_block_bits_;
57
  const uint32_t quality_;
58
  const uint32_t window_bits_;
59
};
60

            
61
class BrotliCompressorLibraryFactory
62
    : public Compression::Common::Compressor::CompressorLibraryFactoryBase<
63
          envoy::extensions::compression::brotli::compressor::v3::Brotli> {
64
public:
65
9
  BrotliCompressorLibraryFactory() : CompressorLibraryFactoryBase(brotliExtensionName()) {}
66

            
67
private:
68
  Envoy::Compression::Compressor::CompressorFactoryPtr createCompressorFactoryFromProtoTyped(
69
      const envoy::extensions::compression::brotli::compressor::v3::Brotli& config,
70
      Server::Configuration::GenericFactoryContext& context) override;
71
};
72

            
73
DECLARE_FACTORY(BrotliCompressorLibraryFactory);
74

            
75
} // namespace Compressor
76
} // namespace Brotli
77
} // namespace Compression
78
} // namespace Extensions
79
} // namespace Envoy