diff --git a/source/common/filter/config_discovery_impl.h b/source/common/filter/config_discovery_impl.h index d7c69dfdcaab4..bdc46464c2aa7 100644 --- a/source/common/filter/config_discovery_impl.h +++ b/source/common/filter/config_discovery_impl.h @@ -64,7 +64,7 @@ class DynamicFilterConfigProviderImplBase : public Config::DynamicExtensionConfi /** * Implementation of a filter config provider using discovery subscriptions. **/ -template +template class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBase, public DynamicFilterConfigProvider { public: @@ -92,15 +92,6 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa } } - // DynamicFilterConfigProviderImplBase - void validateMessage(const std::string& config_name, const Protobuf::Message& message, - const std::string& factory_name) const override { - auto* factory = Registry::FactoryRegistry::getFactory(factory_name); - bool is_terminal_filter = factory->isTerminalFilterByProto(message, factory_context_); - Config::Utility::validateTerminalFilters(config_name, factory_name, filter_chain_type_, - is_terminal_filter, last_filter_in_filter_chain_); - } - // Config::ExtensionConfigProvider const std::string& name() override { return DynamicFilterConfigProviderImplBase::name(); } absl::optional config() override { return tls_->config_; } @@ -126,11 +117,12 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa } } +protected: + const std::string& getStatPrefix() const { return stat_prefix_; } + Server::Configuration::FactoryContext& getFactoryContext() const { return factory_context_; } + private: - FactoryCb instantiateFilterFactory(const Protobuf::Message& message) const { - auto* factory = Registry::FactoryRegistry::getFactoryByType(message.GetTypeName()); - return factory->createFilterFactoryFromProto(message, stat_prefix_, factory_context_); - } + virtual FactoryCb instantiateFilterFactory(const Protobuf::Message& message) const PURE; void update(absl::optional config, Config::ConfigAppliedCb applied_on_all_threads) { // This call must not capture 'this' as it is invoked on all workers asynchronously. @@ -165,6 +157,29 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa ThreadLocal::TypedSlot tls_; }; +// Implementation of a HTTP dynamic filter config provider. +class HttpDynamicFilterConfigProviderImpl + : public DynamicFilterConfigProviderImpl { +public: + using DynamicFilterConfigProviderImpl::DynamicFilterConfigProviderImpl; + void validateMessage(const std::string& config_name, const Protobuf::Message& message, + const std::string& factory_name) const override { + auto* factory = + Registry::FactoryRegistry::getFactory( + factory_name); + const bool is_terminal_filter = factory->isTerminalFilterByProto(message, getFactoryContext()); + Config::Utility::validateTerminalFilters(config_name, factory_name, filter_chain_type_, + is_terminal_filter, last_filter_in_filter_chain_); + } + +private: + Http::FilterFactoryCb instantiateFilterFactory(const Protobuf::Message& message) const override { + auto* factory = Registry::FactoryRegistry:: + getFactoryByType(message.GetTypeName()); + return factory->createFilterFactoryFromProto(message, getStatPrefix(), getFactoryContext()); + } +}; + /** * All extension config discovery stats. @see stats_macros.h */ @@ -289,7 +304,7 @@ class FilterConfigProviderManagerImplBase : Logger::Loggable /** * An implementation of FilterConfigProviderManager. */ -template +template class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBase, public FilterConfigProviderManager, public Singleton::Instance { @@ -332,7 +347,7 @@ class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBa last_filter_in_filter_chain, filter_chain_type, require_type_urls); } - auto provider = std::make_unique>( + auto provider = createFilterConfigProviderImpl( subscription, require_type_urls, factory_context, std::move(default_config), last_filter_in_filter_chain, filter_chain_type, provider_stat_prefix); @@ -358,11 +373,20 @@ class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBa Server::Configuration::FactoryContext& factory_context, bool last_filter_in_filter_chain, const std::string& filter_chain_type, const absl::flat_hash_set& require_type_urls) const PURE; + +private: + virtual std::unique_ptr> + createFilterConfigProviderImpl(FilterConfigSubscriptionSharedPtr& subscription, + const absl::flat_hash_set& require_type_urls, + Server::Configuration::FactoryContext& factory_context, + ProtobufTypes::MessagePtr&& default_config, + bool last_filter_in_filter_chain, + const std::string& filter_chain_type, + absl::string_view stat_prefix) PURE; }; class HttpFilterConfigProviderManagerImpl - : public FilterConfigProviderManagerImpl { + : public FilterConfigProviderManagerImpl { public: std::tuple getMessage(const envoy::config::core::v3::TypedExtensionConfig& filter_config, @@ -376,6 +400,20 @@ class HttpFilterConfigProviderManagerImpl Server::Configuration::FactoryContext& factory_context, bool last_filter_in_filter_chain, const std::string& filter_chain_type, const absl::flat_hash_set& require_type_urls) const override; + +private: + std::unique_ptr> + createFilterConfigProviderImpl(FilterConfigSubscriptionSharedPtr& subscription, + const absl::flat_hash_set& require_type_urls, + Server::Configuration::FactoryContext& factory_context, + ProtobufTypes::MessagePtr&& default_config, + bool last_filter_in_filter_chain, + const std::string& filter_chain_type, + absl::string_view stat_prefix) override { + return std::make_unique( + subscription, require_type_urls, factory_context, std::move(default_config), + last_filter_in_filter_chain, filter_chain_type, stat_prefix); + } }; } // namespace Filter