From 11666058ad6f28f20396d08abeebbe2330802a48 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit Date: Mon, 23 May 2022 14:50:23 -0400 Subject: [PATCH 1/6] enabling users to set custom statusCode --- .../function/adapter/gcp/FunctionInvoker.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) 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")); + } } } From eecb373d502edb690e6f5dd996f1462f59c9fa98 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit Date: Wed, 25 May 2022 10:22:29 -0400 Subject: [PATCH 2/6] making changes to adapter, including tests and documentation --- .../src/main/asciidoc/adapters/gcp-intro.adoc | 22 ++++++ .../function/adapter/gcp/FunctionInvoker.java | 6 +- .../adapter/gcp/FunctionInvokerHttpTests.java | 71 +++++++++++++++++-- 3 files changed, 90 insertions(+), 9 deletions(-) diff --git a/docs/src/main/asciidoc/adapters/gcp-intro.adoc b/docs/src/main/asciidoc/adapters/gcp-intro.adoc index 5c6a06c06..037619ba4 100644 --- a/docs/src/main/asciidoc/adapters/gcp-intro.adoc +++ b/docs/src/main/asciidoc/adapters/gcp-intro.adoc @@ -136,6 +136,28 @@ Invoke the HTTP function: curl https://REGION-PROJECT_ID.cloudfunctions.net/function-sample-gcp-http -d "hello" ---- + +Setting custom HTTP statusCode: + +---- +Users can specify the response statusCode that they want to set by wrapping "statusCode" in headers. +---- + +[source, java] +---- +@Bean +public Function> function() { + + String payload = "hello"; + + Message message = MessageBuilder.withPayload(payload).setHeader("statusCode", 404).build(); + + return input -> message; +}; +---- + + + ==== Background Functions Google Cloud Functions also supports deploying https://cloud.google.com/functions/docs/writing/background[Background Functions] which are invoked indirectly in response to an event, such as a message on a https://cloud.google.com/pubsub[Cloud Pub/Sub] topic, a change in a https://cloud.google.com/storage[Cloud Storage] bucket, or a https://firebase.google.com/[Firebase] event. 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 2d1c7cda0..7d50ae084 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 @@ -95,6 +95,8 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer, Message> function = lookupFunction(); Message message = getInputType() == Void.class || getInputType() == null ? null @@ -123,8 +125,8 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer httpResponse.setContentType(contentType)); - if (headers.containsKey("statusCode")) { - httpResponse.setStatusCode((int) headers.get("statusCode")); + if (headers.containsKey(httpStatusCode) && (headers.get(httpStatusCode) instanceof Integer)) { + httpResponse.setStatusCode((int) headers.get(httpStatusCode)); } } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java index 57de8998e..8c17106c6 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java @@ -20,6 +20,8 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.StringReader; import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -37,7 +39,9 @@ import org.springframework.context.annotation.Import; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** @@ -52,27 +56,38 @@ public class FunctionInvokerHttpTests { @Test public void testHelloWorldSupplier() throws Exception { - testHttpFunction(HelloWorldSupplier.class, null, "Hello World!"); + testHttpFunction(HelloWorldSupplier.class, null, "Hello World!", false, false); } @Test public void testJsonInputFunction() throws Exception { testHttpFunction(JsonInputFunction.class, new IncomingRequest("hello"), - "Thank you for sending the message: hello"); + "Thank you for sending the message: hello", false, false); } @Test public void testJsonInputOutputFunction() throws Exception { testHttpFunction(JsonInputOutputFunction.class, new IncomingRequest("hello"), - new OutgoingResponse("Thank you for sending the message: hello")); + new OutgoingResponse("Thank you for sending the message: hello"), false, false); } @Test public void testJsonInputConsumer_Background() throws Exception { - testHttpFunction(JsonInputConsumer.class, new IncomingRequest("hello"), null); + testHttpFunction(JsonInputConsumer.class, new IncomingRequest("hello"), null, false, false); } - private void testHttpFunction(Class configurationClass, I input, O expectedOutput) throws Exception { + @Test + public void testStatusCodeSet() throws Exception { + testHttpFunction(statusCodeSupplier.class, "hello", "hello", true, false); + } + + @Test + public void testMultiValueHeaderSupplied() throws Exception { + testHttpFunction(multiValueHeaderSupplier.class, "hello", "hello", false, true); + } + + + private void testHttpFunction(Class configurationClass, I input, O expectedOutput, boolean statusCodeCheck, boolean multiHeaderCheck) throws Exception { try (FunctionInvoker handler = new FunctionInvoker(configurationClass);) { HttpRequest request = Mockito.mock(HttpRequest.class); @@ -88,6 +103,14 @@ public class FunctionInvokerHttpTests { when(response.getWriter()).thenReturn(bufferedWriter); handler.service(request, response); + if (statusCodeCheck) { + verify(response).setStatusCode(404); + } + + if (multiHeaderCheck) { + verify(response).appendHeader("multiValueHeader", "123,headerThing"); + } + // Closing the writer is done by the Framework/caller. bufferedWriter.close(); @@ -108,6 +131,41 @@ public class FunctionInvokerHttpTests { } + @Configuration + @Import({ ContextFunctionCatalogAutoConfiguration.class }) + protected static class statusCodeSupplier { + + @Bean + public Function> function() { + + String payload = "hello"; + + Message msg = MessageBuilder.withPayload(payload).setHeader("statusCode", 404) + .build(); + + return x -> msg; + }; + + } + + @Configuration + @Import({ ContextFunctionCatalogAutoConfiguration.class }) + protected static class multiValueHeaderSupplier { + + @Bean + public Function> function() { + + String payload = "hello"; + List li = new ArrayList(asList(123, "headerThing")); + + Message msg = MessageBuilder.withPayload(payload).setHeader("multiValueHeader", li) + .build(); + + return x -> msg; + }; + + } + @Configuration @Import({ ContextFunctionCatalogAutoConfiguration.class }) protected static class JsonInputFunction { @@ -128,10 +186,9 @@ public class FunctionInvokerHttpTests { return (in) -> { return MessageBuilder .withPayload(new OutgoingResponse("Thank you for sending the message: " + in.message)) - .setHeader("foo", "bar").build(); + .setHeader("statusCode", "bar").build(); }; } - } @Configuration From 62d8a8c38a7b61f1aba66c21e5849a403a9b7c1e Mon Sep 17 00:00:00 2001 From: Deepankar Dixit Date: Wed, 25 May 2022 10:37:38 -0400 Subject: [PATCH 3/6] undo --- .../cloud/function/adapter/gcp/FunctionInvokerHttpTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java index 8c17106c6..d01e9c46e 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java @@ -186,7 +186,7 @@ public class FunctionInvokerHttpTests { return (in) -> { return MessageBuilder .withPayload(new OutgoingResponse("Thank you for sending the message: " + in.message)) - .setHeader("statusCode", "bar").build(); + .setHeader("foo", "bar").build(); }; } } From 0ef707a76c9148dc79a651b1c6de6ecce3262396 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit Date: Wed, 25 May 2022 17:13:00 -0400 Subject: [PATCH 4/6] working on comments --- .../function/adapter/gcp/FunctionInvoker.java | 22 +-- .../adapter/gcp/FunctionInvokerHttpTests.java | 130 ++++++++++++------ 2 files changed, 98 insertions(+), 54 deletions(-) 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 7d50ae084..8af860512 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 @@ -19,9 +19,9 @@ 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; +import java.util.stream.Collectors; import com.google.cloud.functions.Context; import com.google.cloud.functions.HttpFunction; @@ -54,6 +54,11 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer, Message> function = lookupFunction(); Message message = getInputType() == Void.class || getInputType() == null ? null @@ -110,14 +113,8 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer 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()); + String headerValue = ((Collection) values).stream().map(item -> item.toString()).collect(Collectors.joining(",")); + httpResponse.appendHeader(header.getKey(), headerValue); } else { httpResponse.appendHeader(header.getKey(), header.getValue().toString()); @@ -128,6 +125,9 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer void testHttpFunction(Class configurationClass, I input, O expectedOutput, boolean statusCodeCheck, boolean multiHeaderCheck) throws Exception { - try (FunctionInvoker handler = new FunctionInvoker(configurationClass);) { - - HttpRequest request = Mockito.mock(HttpRequest.class); - - if (input != null) { - when(request.getReader()).thenReturn(new BufferedReader(new StringReader(gson.toJson(input)))); - } - - HttpResponse response = Mockito.mock(HttpResponse.class); - StringWriter writer = new StringWriter(); - - BufferedWriter bufferedWriter = new BufferedWriter(writer); - when(response.getWriter()).thenReturn(bufferedWriter); - handler.service(request, response); - - if (statusCodeCheck) { - verify(response).setStatusCode(404); - } - - if (multiHeaderCheck) { - verify(response).appendHeader("multiValueHeader", "123,headerThing"); - } - - // Closing the writer is done by the Framework/caller. - bufferedWriter.close(); - - if (expectedOutput != null) { - assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); - } - } + verify(response).appendHeader("multiValueHeader", "123,headerThing"); } @Configuration @@ -133,7 +177,7 @@ public class FunctionInvokerHttpTests { @Configuration @Import({ ContextFunctionCatalogAutoConfiguration.class }) - protected static class statusCodeSupplier { + protected static class StatusCodeSupplier { @Bean public Function> function() { @@ -150,7 +194,7 @@ public class FunctionInvokerHttpTests { @Configuration @Import({ ContextFunctionCatalogAutoConfiguration.class }) - protected static class multiValueHeaderSupplier { + protected static class MultiValueHeaderSupplier { @Bean public Function> function() { @@ -197,7 +241,7 @@ public class FunctionInvokerHttpTests { @Bean public Consumer function() { - return (in) -> System.out.println("Thank you for sending the message: " + in.message); + return (in) -> System.out.print("Thank you for sending the message: " + in.message); } } From ddda85f83b19190328239ac26e05fe2bf6a42373 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit Date: Thu, 26 May 2022 11:20:16 -0400 Subject: [PATCH 5/6] working on comments --- .../src/main/asciidoc/adapters/gcp-intro.adoc | 2 +- .../function/adapter/gcp/FunctionInvoker.java | 18 ++++---- .../adapter/gcp/FunctionInvokerHttpTests.java | 41 ++++++++++--------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/docs/src/main/asciidoc/adapters/gcp-intro.adoc b/docs/src/main/asciidoc/adapters/gcp-intro.adoc index 037619ba4..a962058c0 100644 --- a/docs/src/main/asciidoc/adapters/gcp-intro.adoc +++ b/docs/src/main/asciidoc/adapters/gcp-intro.adoc @@ -140,7 +140,7 @@ curl https://REGION-PROJECT_ID.cloudfunctions.net/function-sample-gcp-http -d "h Setting custom HTTP statusCode: ---- -Users can specify the response statusCode that they want to set by wrapping "statusCode" in headers. +Users can specify the response statusCode that they want to set by wrapping "statusCode" in headers. This constant is available to users by calling `FunctionInvoker.HTTP_STATUS_CODE` ---- [source, java] 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 8af860512..1d4e9109e 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 @@ -55,9 +55,9 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer, Message> function = lookupFunction(); Message message = getInputType() == Void.class || getInputType() == null ? null - : MessageBuilder.withPayload(httpRequest.getReader()).copyHeaders(httpRequest.getHeaders()).build(); + : MessageBuilder.withPayload(httpRequest.getReader()).copyHeaders(httpRequest.getHeaders()).build(); Message result = function.apply(message); @@ -122,11 +122,13 @@ public class FunctionInvoker extends AbstractSpringFunctionAdapterInitializer httpResponse.setContentType(contentType)); - if (headers.containsKey(httpStatusCode) && (headers.get(httpStatusCode) instanceof Integer)) { - httpResponse.setStatusCode((int) headers.get(httpStatusCode)); - } - else if (headers.containsKey(httpStatusCode) && (!(headers.get(httpStatusCode) instanceof Integer))) { - log.warn("The statusCode should be an Integer value"); + if (headers.containsKey(HTTP_STATUS_CODE)) { + if (headers.get(HTTP_STATUS_CODE) instanceof Integer) { + httpResponse.setStatusCode((int) headers.get(HTTP_STATUS_CODE)); + } + else { + log.warn("The statusCode should be an Integer value"); + } } } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java index 5109e627d..eff309bfb 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java @@ -18,9 +18,7 @@ package org.springframework.cloud.function.adapter.gcp; import java.io.BufferedReader; import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.PrintStream; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; @@ -34,8 +32,11 @@ import com.google.cloud.functions.HttpResponse; import com.google.gson.Gson; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -54,17 +55,20 @@ import static org.mockito.Mockito.when; * @author Dmitry Solomakha * @author Mike Eltsufin */ + +@ExtendWith(OutputCaptureExtension.class) public class FunctionInvokerHttpTests { private static final Gson gson = new Gson(); - private static HttpRequest request = Mockito.mock(HttpRequest.class); - private static HttpResponse response = Mockito.mock(HttpResponse.class); + private HttpRequest request; + private HttpResponse response; private BufferedWriter bufferedWriter; private StringWriter writer; - @BeforeEach void testSetup() throws IOException { + request = Mockito.mock(HttpRequest.class); + response = Mockito.mock(HttpResponse.class); writer = new StringWriter(); bufferedWriter = new BufferedWriter(writer); when(response.getWriter()).thenReturn(bufferedWriter); @@ -79,9 +83,9 @@ public class FunctionInvokerHttpTests { handler.service(request, response); bufferedWriter.close(); - if (expectedOutput != null) { - assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); - } + + assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); + } @@ -97,9 +101,9 @@ public class FunctionInvokerHttpTests { handler.service(request, response); bufferedWriter.close(); - if (expectedOutput != null) { - assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); - } + + assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); + } @@ -115,27 +119,24 @@ public class FunctionInvokerHttpTests { handler.service(request, response); bufferedWriter.close(); - if (expectedOutput != null) { - assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); - } + + assertThat(writer.toString()).isEqualTo(gson.toJson(expectedOutput)); + } @Test - public void testJsonInputConsumer_Background() throws Exception { + public void testJsonInputConsumer_Background(CapturedOutput capturedOutput) throws Exception { FunctionInvoker handler = new FunctionInvoker(JsonInputConsumer.class); IncomingRequest input = new IncomingRequest("hello"); - ByteArrayOutputStream outContent = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outContent)); - when(request.getReader()).thenReturn(new BufferedReader(new StringReader(gson.toJson(input)))); handler.service(request, response); bufferedWriter.close(); - assertThat(outContent.toString()).isEqualTo("Thank you for sending the message: hello"); + assertThat(capturedOutput.toString()).contains("Thank you for sending the message: hello"); } @@ -241,7 +242,7 @@ public class FunctionInvokerHttpTests { @Bean public Consumer function() { - return (in) -> System.out.print("Thank you for sending the message: " + in.message); + return (in) -> System.out.println("Thank you for sending the message: " + in.message); } } From 495a8312160961ad7527075f74a7de6987325943 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit Date: Thu, 26 May 2022 12:33:57 -0400 Subject: [PATCH 6/6] updating documentation --- docs/src/main/asciidoc/adapters/gcp-intro.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/main/asciidoc/adapters/gcp-intro.adoc b/docs/src/main/asciidoc/adapters/gcp-intro.adoc index a962058c0..1f72b19ed 100644 --- a/docs/src/main/asciidoc/adapters/gcp-intro.adoc +++ b/docs/src/main/asciidoc/adapters/gcp-intro.adoc @@ -140,7 +140,7 @@ curl https://REGION-PROJECT_ID.cloudfunctions.net/function-sample-gcp-http -d "h Setting custom HTTP statusCode: ---- -Users can specify the response statusCode that they want to set by wrapping "statusCode" in headers. This constant is available to users by calling `FunctionInvoker.HTTP_STATUS_CODE` +Functions can specify a custom HTTP response code by setting the `FunctionInvoker.HTTP_STATUS_CODE` header. ---- [source, java] @@ -150,7 +150,7 @@ public Function> function() { String payload = "hello"; - Message message = MessageBuilder.withPayload(payload).setHeader("statusCode", 404).build(); + Message message = MessageBuilder.withPayload(payload).setHeader(FunctionInvoker.HTTP_STATUS_CODE, 404).build(); return input -> message; };