diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/main/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvoker.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/main/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvoker.java index 7c4c88d0c..c448ab654 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/main/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvoker.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/main/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvoker.java @@ -81,9 +81,13 @@ public class WebProxyInvoker { logger.debug("path: " + path); } ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(null, httpMethod, path); + + // CONTENT if (StringUtils.hasText((String) request.get("body"))) { httpRequest.setContent(((String) request.get("body")).getBytes()); } + + // REQUEST PARAM if (request.get("multiValueQueryStringParameters") != null) { Map> parameters = (Map>) request.get("multiValueQueryStringParameters"); for (Entry> parameter : parameters.entrySet()) { @@ -91,14 +95,15 @@ public class WebProxyInvoker { } } + // HEADERS Map> headers = (Map>) request.get("multiValueHeaders"); HttpHeaders httpHeaders = new HttpHeaders(); - for (Entry> entry : headers.entrySet()) { // TODO may need to do some header formatting httpHeaders.addAll(entry.getKey(), entry.getValue()); } httpRequest.setHeaders(httpHeaders); + return httpRequest; } @@ -126,11 +131,13 @@ public class WebProxyInvoker { apiGatewayResponseStructure.put("body", responseString); Map> multiValueHeaders = new HashMap<>(); + Map headers = new HashMap<>(); for (String headerName : httpResponse.getHeaderNames()) { multiValueHeaders.put(headerName, httpResponse.getHeaders(headerName)); + headers.put(headerName, httpResponse.getHeaders(headerName).toString()); } - // TODO investigate why AWS doesn't like List as value -// apiGatewayResponseStructure.put("headers", multiValueHeaders); + apiGatewayResponseStructure.put("multiValueHeaders", multiValueHeaders); + apiGatewayResponseStructure.put("headers", headers); byte[] apiGatewayResponseBytes = mapper.writeValueAsBytes(apiGatewayResponseStructure); StreamUtils.copy(apiGatewayResponseBytes, output); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/test/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvokerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/test/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvokerTests.java index 8b2336c4c..229182806 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/test/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvokerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/src/test/java/org/springframework/cloud/function/adapter/aws/web/WebProxyInvokerTests.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.cloud.function.serverless.web.ProxyHttpServletRequest; +import org.springframework.http.HttpHeaders; import org.springframework.util.ReflectionUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -182,6 +183,9 @@ public class WebProxyInvokerTests { assertThat(request.getContentType()).isEqualTo("application/json"); assertThat(request.getParameterValues("foo").length).isEqualTo(2); assertThat(request.getParameterValues("foo")[0]).isEqualTo("bar"); + assertThat(request.getParameterValues("abc").length).isEqualTo(1); + assertThat(request.getParameterValues("abc")[0]).isEqualTo("xyz"); + assertThat(request.getHeaders(HttpHeaders.CONTENT_TYPE).nextElement()).isEqualTo("application/json"); } @Test