1
#pragma once
2

            
3
#include "envoy/compression/decompressor/config.h"
4
#include "envoy/extensions/compression/zstd/decompressor/v3/zstd.pb.h"
5
#include "envoy/extensions/compression/zstd/decompressor/v3/zstd.pb.validate.h"
6

            
7
#include "source/common/http/headers.h"
8
#include "source/extensions/compression/common/decompressor/factory_base.h"
9
#include "source/extensions/compression/zstd/decompressor/zstd_decompressor_impl.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace Compression {
14
namespace Zstd {
15
namespace Decompressor {
16

            
17
namespace {
18
328
const std::string& zstdStatsPrefix() { CONSTRUCT_ON_FIRST_USE(std::string, "zstd."); }
19
334
const std::string& zstdExtensionName() {
20
334
  CONSTRUCT_ON_FIRST_USE(std::string, "envoy.compression.zstd.decompressor");
21
334
}
22

            
23
} // namespace
24

            
25
class ZstdDecompressorFactory : public Envoy::Compression::Decompressor::DecompressorFactory {
26
public:
27
  ZstdDecompressorFactory(const envoy::extensions::compression::zstd::decompressor::v3::Zstd& zstd,
28
                          Stats::Scope& scope, Event::Dispatcher& dispatcher, Api::Api& api,
29
                          ThreadLocal::SlotAllocator& tls);
30

            
31
  // Envoy::Compression::Decompressor::DecompressorFactory
32
  Envoy::Compression::Decompressor::DecompressorPtr
33
  createDecompressor(const std::string& stats_prefix) override;
34
328
  const std::string& statsPrefix() const override { return zstdStatsPrefix(); }
35
328
  const std::string& contentEncoding() const override {
36
328
    return Http::CustomHeaders::get().ContentEncodingValues.Zstd;
37
328
  }
38

            
39
private:
40
  Stats::Scope& scope_;
41
  const uint32_t chunk_size_;
42
  ZstdDDictManagerPtr ddict_manager_{nullptr};
43
};
44

            
45
class ZstdDecompressorLibraryFactory
46
    : public Compression::Common::Decompressor::DecompressorLibraryFactoryBase<
47
          envoy::extensions::compression::zstd::decompressor::v3::Zstd> {
48
public:
49
334
  ZstdDecompressorLibraryFactory() : DecompressorLibraryFactoryBase(zstdExtensionName()) {}
50

            
51
private:
52
  Envoy::Compression::Decompressor::DecompressorFactoryPtr createDecompressorFactoryFromProtoTyped(
53
      const envoy::extensions::compression::zstd::decompressor::v3::Zstd& proto_config,
54
      Server::Configuration::FactoryContext& context) override;
55
};
56

            
57
DECLARE_FACTORY(ZstdDecompressorLibraryFactory);
58

            
59
} // namespace Decompressor
60
} // namespace Zstd
61
} // namespace Compression
62
} // namespace Extensions
63
} // namespace Envoy