From 8391a6f9babaede0faf88fef828a0e5794b64a12 Mon Sep 17 00:00:00 2001 From: wbpcode/wangbaiping Date: Tue, 3 Feb 2026 05:22:44 +0000 Subject: [PATCH] http: add server context only factory support to header_mutation filter Signed-off-by: wbpcode/wangbaiping --- .../filters/http/header_mutation/config.cc | 15 ++++++++++ .../filters/http/header_mutation/config.h | 5 ++++ .../http/header_mutation/config_test.cc | 28 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/source/extensions/filters/http/header_mutation/config.cc b/source/extensions/filters/http/header_mutation/config.cc index 7788d7e5c89e1..c79b9f1dc627b 100644 --- a/source/extensions/filters/http/header_mutation/config.cc +++ b/source/extensions/filters/http/header_mutation/config.cc @@ -22,6 +22,21 @@ HeaderMutationFactoryConfig::createFilterFactoryFromProtoTyped( }; } +Http::FilterFactoryCb +HeaderMutationFactoryConfig::createFilterFactoryFromProtoWithServerContextTyped( + const ProtoConfig& config, const std::string&, + Server::Configuration::ServerFactoryContext& context) { + absl::Status creation_status = absl::OkStatus(); + auto filter_config = std::make_shared(config, context, creation_status); + if (!creation_status.ok()) { + ExceptionUtil::throwEnvoyException(std::string(creation_status.message())); + } + + return [filter_config](Http::FilterChainFactoryCallbacks& callbacks) -> void { + callbacks.addStreamFilter(std::make_shared(filter_config)); + }; +} + absl::StatusOr HeaderMutationFactoryConfig::createRouteSpecificFilterConfigTyped( const PerRouteProtoConfig& proto_config, Server::Configuration::ServerFactoryContext& context, diff --git a/source/extensions/filters/http/header_mutation/config.h b/source/extensions/filters/http/header_mutation/config.h index 781957b4bb76f..f587e2675474c 100644 --- a/source/extensions/filters/http/header_mutation/config.h +++ b/source/extensions/filters/http/header_mutation/config.h @@ -24,6 +24,11 @@ class HeaderMutationFactoryConfig createFilterFactoryFromProtoTyped(const ProtoConfig& proto_config, const std::string& stats_prefix, DualInfo info, Server::Configuration::ServerFactoryContext& context) override; + + Http::FilterFactoryCb createFilterFactoryFromProtoWithServerContextTyped( + const ProtoConfig& proto_config, const std::string& stats_prefix, + Server::Configuration::ServerFactoryContext& context) override; + absl::StatusOr createRouteSpecificFilterConfigTyped(const PerRouteProtoConfig& proto_config, Server::Configuration::ServerFactoryContext&, diff --git a/test/extensions/filters/http/header_mutation/config_test.cc b/test/extensions/filters/http/header_mutation/config_test.cc index 9e3ba860f2040..a184e85c4b688 100644 --- a/test/extensions/filters/http/header_mutation/config_test.cc +++ b/test/extensions/filters/http/header_mutation/config_test.cc @@ -185,6 +185,34 @@ TEST(FactoryTest, QueryParameterMutationsTest) { ASSERT_NE(factory, nullptr); } +TEST(FactoryTest, FactoryTestWithServerContext) { + testing::NiceMock mock_server_context; + auto* factory = + Registry::FactoryRegistry::getFactory( + "envoy.filters.http.header_mutation"); + ASSERT_NE(factory, nullptr); + + const std::string config = R"EOF( + mutations: + request_mutations: + - remove: "flag-header" + - append: + header: + key: "flag-header" + value: "%REQ(ANOTHER-FLAG-HEADER)%" + append_action: APPEND_IF_EXISTS_OR_ADD + )EOF"; + + ProtoConfig proto_config; + TestUtility::loadFromYaml(config, proto_config); + + auto cb = factory->createFilterFactoryFromProtoWithServerContext(proto_config, "test", + mock_server_context); + Http::MockFilterChainFactoryCallbacks filter_callbacks; + EXPECT_CALL(filter_callbacks, addStreamFilter(_)); + cb(filter_callbacks); +} + } // namespace } // namespace HeaderMutation } // namespace HttpFilters