diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java index 5b4be3332..eda8fa7c9 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java @@ -96,8 +96,8 @@ public class FunctionController { if (logger.isDebugEnabled()) { logger.debug("Handled POST with function"); } - return ResponseEntity.ok().body( - debug ? result.log() : response(request, function, single, result)); + return ResponseEntity.ok() + .body(response(request, function, single, result)); } if (consumer != null) { @@ -157,7 +157,7 @@ public class FunctionController { @GetMapping(path = "/**") @ResponseBody - public Publisher get(WebRequest request) { + public ResponseEntity> get(WebRequest request) { @SuppressWarnings("unchecked") Function, Publisher> function = (Function, Publisher>) request .getAttribute(WebRequestConstants.FUNCTION, WebRequest.SCOPE_REQUEST); @@ -167,10 +167,19 @@ public class FunctionController { String argument = (String) request.getAttribute(WebRequestConstants.ARGUMENT, WebRequest.SCOPE_REQUEST); + Publisher result; if (function != null) { - return value(function, argument); + result = value(function, argument); } - return response(request, supplier, true, supplier(supplier)); + else { + result = response(request, supplier, true, supplier(supplier)); + } + if (inspector.isMessage(function)) { + if (inspector.isMessage(function)) { + result = Flux.from(result).map(message -> MessageUtils.unpack(function, message)); + } + } + return ResponseEntity.ok().body(result); } private Publisher supplier(Supplier> supplier) { diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/HeaderUtils.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/HeaderUtils.java index 5994bd9ce..2d5a89db9 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/HeaderUtils.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/HeaderUtils.java @@ -17,8 +17,10 @@ package org.springframework.cloud.function.web.util; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import org.springframework.http.HttpHeaders; import org.springframework.messaging.MessageHeaders; @@ -29,12 +31,19 @@ import org.springframework.messaging.MessageHeaders; */ public class HeaderUtils { + private static HttpHeaders IGNORED = new HttpHeaders(); + + static { + IGNORED.add(MessageHeaders.ID, ""); + IGNORED.add(HttpHeaders.CONTENT_LENGTH, "0"); + } + public static HttpHeaders fromMessage(MessageHeaders headers, HttpHeaders request) { HttpHeaders result = new HttpHeaders(); for (String name : headers.keySet()) { Object value = headers.get(name); name = name.toLowerCase(); - if (!MessageHeaders.ID.equals(name)) { + if (!IGNORED.containsKey(name)) { Collection values = multi(value); for (Object object : values) { result.set(name, object.toString()); diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java index 840ba094a..4bf6fcbad 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java @@ -35,6 +35,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; @@ -262,7 +263,7 @@ public class RestApplicationTests { } @Test - @Ignore("FIXME") + // @Ignore("FIXME") public void messages() throws Exception { ResponseEntity result = rest.exchange(RequestEntity .post(new URI("/messages")).contentType(MediaType.APPLICATION_JSON) @@ -349,9 +350,11 @@ public class RestApplicationTests { @Test public void singleValuedText() throws Exception { - ResponseEntity result = rest.exchange(RequestEntity - .post(new URI("/bareUppercase")).contentType(MediaType.TEXT_PLAIN) - .body("foo"), String.class); + ResponseEntity result = rest + .exchange( + RequestEntity.post(new URI("/bareUppercase")) + .contentType(MediaType.TEXT_PLAIN).body("foo"), + String.class); assertThat(result.getBody()).isEqualTo("(FOO)"); } @@ -471,6 +474,11 @@ public class RestApplicationTests { private List list = new ArrayList<>(); + public static void main(String[] args) throws Exception { + SpringApplication.run(RestApplicationTests.ApplicationConfiguration.class, + args); + } + @Bean({ "uppercase", "transform", "post/more" }) public Function, Flux> uppercase() { return flux -> flux.log()