diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java index 4dff00d8d..2d1c7cda0 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java @@ -18,6 +18,8 @@ package org.springframework.cloud.function.adapter.gcp; import java.io.BufferedReader; import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Iterator; import java.util.Map.Entry; import java.util.function.Function; @@ -32,6 +34,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer; import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration; import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.MimeTypeUtils; @@ -91,18 +94,38 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer, Message> function = lookupFunction(); Message message = getInputType() == Void.class || getInputType() == null ? null : MessageBuilder.withPayload(httpRequest.getReader()).copyHeaders(httpRequest.getHeaders()).build(); + Message result = function.apply(message); if (result != null) { + MessageHeaders headers = result.getHeaders(); httpResponse.getWriter().write(new String(result.getPayload(), StandardCharsets.UTF_8)); - for (Entry header : result.getHeaders().entrySet()) { - httpResponse.appendHeader(header.getKey(), header.getValue().toString()); + for (Entry header : headers.entrySet()) { + Object values = header.getValue(); + if (values instanceof Collection) { + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = ((Collection) values).iterator(); iterator.hasNext();) { + sb.append(iterator.next()); + if (iterator.hasNext()) { + sb.append(","); + } + } + httpResponse.appendHeader(header.getKey(), sb.toString()); + } + else { + httpResponse.appendHeader(header.getKey(), header.getValue().toString()); + } } httpRequest.getContentType().ifPresent(contentType -> httpResponse.setContentType(contentType)); + + if (headers.containsKey("statusCode")) { + httpResponse.setStatusCode((int) headers.get("statusCode")); + } } }