From 7bc499ddea676ec599f6582b8d0d877bcffb1962 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Sat, 15 Jul 2023 12:12:01 -0500 Subject: [PATCH] Do not convert text/plain content to JSON Fixes bug and removes test comments from previous commit. Resolves #1056 --- .../catalog/SimpleFunctionRegistry.java | 38 ++++++++++++------- .../catalog/SimpleFunctionRegistryTests.java | 1 - .../web/mvc/HttpGetIntegrationTests.java | 1 - 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java index a5398b5f2..302b1a91c 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeSet; @@ -61,6 +62,7 @@ import org.springframework.core.ResolvableType; import org.springframework.core.convert.ConversionService; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -69,6 +71,7 @@ import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import org.springframework.util.MimeTypeUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -82,7 +85,7 @@ import org.springframework.util.StringUtils; * @author Oleg Zhurakousky * @author Roman Samarev * @author Soby Chacko - * + * @author Chris Bono */ public class SimpleFunctionRegistry implements FunctionRegistry { protected Log logger = LogFactory.getLog(this.getClass()); @@ -805,9 +808,6 @@ public class SimpleFunctionRegistry implements FunctionRegistry { return sanitizedHeaders; } - /* - * - */ @SuppressWarnings("unchecked") private Object fluxifyInputIfNecessary(Object input) { if (input instanceof Message && !((Message) input).getHeaders().containsKey("user-agent") && this.isConsumer() && !this.isInputTypePublisher()) { @@ -819,16 +819,20 @@ public class SimpleFunctionRegistry implements FunctionRegistry { if (!this.isRoutingFunction() && !(input instanceof Publisher)) { Object payload = input; - if (input instanceof Message) { - if (((Message) input).getHeaders().containsKey("payload")) { - payload = ((Message) input).getHeaders().get("payload"); + var treatPayloadAsPlainText = false; + if (input instanceof Message msg) { + if (msg.getHeaders().containsKey("payload")) { + payload = msg.getHeaders().get("payload"); } else { - payload = ((Message) input).getPayload(); + payload = msg.getPayload(); } + treatPayloadAsPlainText = contentTypeHeaderValue(msg).equals(MimeTypeUtils.TEXT_PLAIN_VALUE); } - if (JsonMapper.isJsonStringRepresentsCollection(payload) - && !FunctionTypeUtils.isTypeCollection(this.inputType) && !FunctionTypeUtils.isTypeArray(this.inputType)) { + + if ((!treatPayloadAsPlainText && JsonMapper.isJsonStringRepresentsCollection(payload)) + && !FunctionTypeUtils.isTypeCollection(this.inputType) + && !FunctionTypeUtils.isTypeArray(this.inputType)) { MessageHeaders headers = ((Message) input).getHeaders(); Collection collectionPayload = jsonMapper.fromJson(payload, Collection.class); Class inputClass = FunctionTypeUtils.getRawType(this.inputType); @@ -872,9 +876,17 @@ public class SimpleFunctionRegistry implements FunctionRegistry { return input; } - /* - * - */ + private String contentTypeHeaderValue(Message msg) { + var contentType = msg.getHeaders().get(MessageHeaders.CONTENT_TYPE); + if (contentType == null) { + contentType = msg.getHeaders().get(HttpHeaders.CONTENT_TYPE); + if (contentType == null) { + contentType = msg.getHeaders().get(HttpHeaders.CONTENT_TYPE.toLowerCase()); + } + } + return Objects.toString(contentType); + } + @SuppressWarnings("unchecked") private Object invokeFunction(Object convertedInput) { Object result; diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java index 4df0b72fd..4314ee669 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java @@ -193,7 +193,6 @@ public class SimpleFunctionRegistryTests { assertThat(result).isEqualTo("{\"HELLO\":\"WORLD\"}"); } - // TODO: Once bug is fixed this test (last entry) will fully pass and this COMMENT should be removed @ParameterizedTest @ValueSource(strings = {"[hello", "hello]", "[hello]"}) void textContentTypeWithValueWrappedBracketsIsOk(String inputMessagePayloadValue) { diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java index c75fd6e8d..d1629d0ec 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java @@ -128,7 +128,6 @@ public class HttpGetIntegrationTests { assertThat(result.getBody()).isEqualTo("foo"); } - // TODO: Once bug is fixed this test (last entry) will fully pass and this COMMENT should be removed @ParameterizedTest @ValueSource(strings = {"[hello", "hello]", "[hello]"}) void textContentTypeWithValueWrappedBracketsIsOk(String inputMessagePayloadValue) throws URISyntaxException {