From 3931ea4f14285cbf1bd235fa23e415fc29f01a18 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 31 Jan 2024 13:53:24 +0100 Subject: [PATCH] GH-1104 Add support for case insensitive routing header names Resolves #1104 --- .../context/config/RoutingFunction.java | 23 ++++++++++++------- .../context/config/RoutingFunctionTests.java | 10 ++++++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java index b844f0929..327ccd8a5 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java @@ -17,6 +17,7 @@ package org.springframework.cloud.function.context.config; import java.util.Map; +import java.util.Map.Entry; import java.util.function.Function; import org.apache.commons.logging.Log; @@ -133,14 +134,8 @@ public class RoutingFunction implements Function { } } if (function == null) { - if (StringUtils.hasText((String) message.getHeaders().get(FunctionProperties.FUNCTION_DEFINITION))) { - function = functionFromDefinition((String) message.getHeaders().get(FunctionProperties.FUNCTION_DEFINITION)); - if (function.isInputTypePublisher()) { - this.assertOriginalInputIsNotPublisher(originalInputIsPublisher); - } - } - else if (StringUtils.hasText((String) message.getHeaders().get(FunctionProperties.ROUTING_EXPRESSION))) { - function = this.functionFromExpression((String) message.getHeaders().get(FunctionProperties.ROUTING_EXPRESSION), message, true); + function = this.locateFunctionFromDefinitionOrExpression(message); + if (function != null) { if (function.isInputTypePublisher()) { this.assertOriginalInputIsNotPublisher(originalInputIsPublisher); } @@ -196,6 +191,18 @@ public class RoutingFunction implements Function { return function.apply(input); } + private FunctionInvocationWrapper locateFunctionFromDefinitionOrExpression(Message message) { + for (Entry headerEntry : message.getHeaders().entrySet()) { + if (headerEntry.getKey().equalsIgnoreCase(FunctionProperties.FUNCTION_DEFINITION)) { + return functionFromDefinition((String) headerEntry.getValue()); + } + else if (headerEntry.getKey().equalsIgnoreCase(FunctionProperties.ROUTING_EXPRESSION)) { + return this.functionFromExpression((String) headerEntry.getValue(), message, true); + } + } + return null; + } + private void assertOriginalInputIsNotPublisher(boolean originalInputIsPublisher) { Assert.isTrue(!originalInputIsPublisher, "Routing input of type Publisher is not supported per individual " + "values (e.g., message header or POJO). Instead you should use 'spring.cloud.function.definition' or " diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/RoutingFunctionTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/RoutingFunctionTests.java index 591d60b09..20a3d6b02 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/RoutingFunctionTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/RoutingFunctionTests.java @@ -266,6 +266,16 @@ public class RoutingFunctionTests { assertThat(function.apply(message)).isEqualTo("olleh"); } + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void testMultipleRoutersCaseInsensitiveKeys() { + FunctionCatalog functionCatalog = this.configureCatalog(MultipleRouterConfiguration.class); + Function function = functionCatalog.lookup(RoutingFunction.FUNCTION_NAME); + assertThat(function).isNotNull(); + Message message = MessageBuilder.withPayload("hello").setHeader(FunctionProperties.PREFIX + ".DeFiNition", "uppercase").build(); + assertThat(function.apply(message)).isEqualTo("HELLO"); + } + @EnableAutoConfiguration @Configuration protected static class RoutingFunctionConfiguration {