Skip to content

Commit 7bc499d

Browse files
onobcolegz
authored andcommitted
Do not convert text/plain content to JSON
Fixes bug and removes test comments from previous commit. Resolves #1056
1 parent c97c0b2 commit 7bc499d

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.HashMap;
2727
import java.util.List;
2828
import java.util.Map;
29+
import java.util.Objects;
2930
import java.util.Optional;
3031
import java.util.Set;
3132
import java.util.TreeSet;
@@ -61,6 +62,7 @@
6162
import org.springframework.core.convert.ConversionService;
6263
import org.springframework.expression.Expression;
6364
import org.springframework.expression.spel.standard.SpelExpressionParser;
65+
import org.springframework.http.HttpHeaders;
6466
import org.springframework.lang.Nullable;
6567
import org.springframework.messaging.Message;
6668
import org.springframework.messaging.MessageHeaders;
@@ -69,6 +71,7 @@
6971
import org.springframework.messaging.support.MessageBuilder;
7072
import org.springframework.util.Assert;
7173
import org.springframework.util.CollectionUtils;
74+
import org.springframework.util.MimeTypeUtils;
7275
import org.springframework.util.ObjectUtils;
7376
import org.springframework.util.StringUtils;
7477

@@ -82,7 +85,7 @@
8285
* @author Oleg Zhurakousky
8386
* @author Roman Samarev
8487
* @author Soby Chacko
85-
*
88+
* @author Chris Bono
8689
*/
8790
public class SimpleFunctionRegistry implements FunctionRegistry {
8891
protected Log logger = LogFactory.getLog(this.getClass());
@@ -805,9 +808,6 @@ private Map<String, Object> sanitizeHeaders(MessageHeaders headers) {
805808
return sanitizedHeaders;
806809
}
807810

808-
/*
809-
*
810-
*/
811811
@SuppressWarnings("unchecked")
812812
private Object fluxifyInputIfNecessary(Object input) {
813813
if (input instanceof Message && !((Message) input).getHeaders().containsKey("user-agent") && this.isConsumer() && !this.isInputTypePublisher()) {
@@ -819,16 +819,20 @@ private Object fluxifyInputIfNecessary(Object input) {
819819

820820
if (!this.isRoutingFunction() && !(input instanceof Publisher)) {
821821
Object payload = input;
822-
if (input instanceof Message) {
823-
if (((Message) input).getHeaders().containsKey("payload")) {
824-
payload = ((Message) input).getHeaders().get("payload");
822+
var treatPayloadAsPlainText = false;
823+
if (input instanceof Message msg) {
824+
if (msg.getHeaders().containsKey("payload")) {
825+
payload = msg.getHeaders().get("payload");
825826
}
826827
else {
827-
payload = ((Message) input).getPayload();
828+
payload = msg.getPayload();
828829
}
830+
treatPayloadAsPlainText = contentTypeHeaderValue(msg).equals(MimeTypeUtils.TEXT_PLAIN_VALUE);
829831
}
830-
if (JsonMapper.isJsonStringRepresentsCollection(payload)
831-
&& !FunctionTypeUtils.isTypeCollection(this.inputType) && !FunctionTypeUtils.isTypeArray(this.inputType)) {
832+
833+
if ((!treatPayloadAsPlainText && JsonMapper.isJsonStringRepresentsCollection(payload))
834+
&& !FunctionTypeUtils.isTypeCollection(this.inputType)
835+
&& !FunctionTypeUtils.isTypeArray(this.inputType)) {
832836
MessageHeaders headers = ((Message) input).getHeaders();
833837
Collection collectionPayload = jsonMapper.fromJson(payload, Collection.class);
834838
Class inputClass = FunctionTypeUtils.getRawType(this.inputType);
@@ -872,9 +876,17 @@ else if (!(input instanceof Publisher) && input instanceof Iterable && !Function
872876
return input;
873877
}
874878

875-
/*
876-
*
877-
*/
879+
private String contentTypeHeaderValue(Message<?> msg) {
880+
var contentType = msg.getHeaders().get(MessageHeaders.CONTENT_TYPE);
881+
if (contentType == null) {
882+
contentType = msg.getHeaders().get(HttpHeaders.CONTENT_TYPE);
883+
if (contentType == null) {
884+
contentType = msg.getHeaders().get(HttpHeaders.CONTENT_TYPE.toLowerCase());
885+
}
886+
}
887+
return Objects.toString(contentType);
888+
}
889+
878890
@SuppressWarnings("unchecked")
879891
private Object invokeFunction(Object convertedInput) {
880892
Object result;

spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ public void testSCF640() {
193193
assertThat(result).isEqualTo("{\"HELLO\":\"WORLD\"}");
194194
}
195195

196-
// TODO: Once bug is fixed this test (last entry) will fully pass and this COMMENT should be removed
197196
@ParameterizedTest
198197
@ValueSource(strings = {"[hello", "hello]", "[hello]"})
199198
void textContentTypeWithValueWrappedBracketsIsOk(String inputMessagePayloadValue) {

spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ public void word() throws Exception {
128128
assertThat(result.getBody()).isEqualTo("foo");
129129
}
130130

131-
// TODO: Once bug is fixed this test (last entry) will fully pass and this COMMENT should be removed
132131
@ParameterizedTest
133132
@ValueSource(strings = {"[hello", "hello]", "[hello]"})
134133
void textContentTypeWithValueWrappedBracketsIsOk(String inputMessagePayloadValue) throws URISyntaxException {

0 commit comments

Comments
 (0)