Skip to content

Commit

Permalink
GH-1235 Fix support for text/* contentType
Browse files Browse the repository at this point in the history
Resolves #1235
  • Loading branch information
olegz committed Feb 6, 2025
1 parent 86359ba commit 7bcad7e
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws E
Message<BufferedReader> message = this.functionWrapped.getInputType() == Void.class || this.functionWrapped.getInputType() == null ? null
: MessageBuilder.withPayload(httpRequest.getReader()).copyHeaders(httpRequest.getHeaders()).build();

Message<byte[]> result = function.apply(message);
Message<?> result = function.apply(message);

if (result != null) {
MessageHeaders headers = result.getHeaders();
Expand All @@ -130,7 +130,8 @@ else if (result.getHeaders().containsKey("Content-Type")) {
else {
httpRequest.getContentType().ifPresent(contentType -> httpResponse.setContentType(contentType));
}
httpResponse.getWriter().write(new String(result.getPayload(), StandardCharsets.UTF_8));
String content = result.getPayload() instanceof String strPayload ? strPayload : new String((byte[]) result.getPayload(), StandardCharsets.UTF_8);
httpResponse.getWriter().write(content);
for (Entry<String, Object> header : headers.entrySet()) {
Object values = header.getValue();
if (values instanceof Collection<?>) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
import org.springframework.cloud.function.json.GsonMapper;
import org.springframework.cloud.function.json.JacksonMapper;
import org.springframework.cloud.function.json.JsonMapper;
import org.springframework.cloud.function.utils.PrimitiveTypesFromStringMessageConverter;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
Expand All @@ -71,13 +70,17 @@
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.converter.ByteArrayMessageConverter;
import org.springframework.messaging.converter.CompositeMessageConverter;
import org.springframework.messaging.converter.ContentTypeResolver;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.StringMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.InvalidMimeTypeException;
import org.springframework.util.MimeType;
import org.springframework.util.StringUtils;

/**
Expand Down Expand Up @@ -133,8 +136,23 @@ public FunctionRegistry functionCatalog(List<MessageConverter> messageConverters

mcList.add(new JsonMessageConverter(jsonMapper));
mcList.add(new ByteArrayMessageConverter());
mcList.add(new StringMessageConverter());
mcList.add(new PrimitiveTypesFromStringMessageConverter(conversionService));
StringMessageConverter stringConverter = new StringMessageConverter();
stringConverter.setSerializedPayloadClass(String.class);
stringConverter.setContentTypeResolver(new ContentTypeResolver() {
@Override
public MimeType resolve(MessageHeaders headers) throws InvalidMimeTypeException {
if (headers.containsKey(MessageHeaders.CONTENT_TYPE)) {
if (headers.get(MessageHeaders.CONTENT_TYPE).toString().startsWith("text")) {
return MimeType.valueOf("text/plain");
}
else {
return MimeType.valueOf(headers.get(MessageHeaders.CONTENT_TYPE).toString());
}
}
return null;
}
});
mcList.add(stringConverter);

messageConverter = new SmartCompositeMessageConverter(mcList, () -> {
return context.getBeansOfType(MessageConverterHelper.class).values();
Expand Down

0 comments on commit 7bcad7e

Please sign in to comment.