From 1de8526b7a6a4217545f6937fb6b9c5537187855 Mon Sep 17 00:00:00 2001 From: Kane Zhu Date: Fri, 28 Jun 2019 17:37:27 +0800 Subject: [PATCH] Fix the issue that api gateway handler of AWS does not honor the encrypted body data. Resolves #382 --- .../aws/SpringBootApiGatewayRequestHandler.java | 10 +++++++--- .../SpringBootApiGatewayRequestHandlerTests.java | 13 +++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandler.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandler.java index b3862ee51..90689c4d7 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandler.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandler.java @@ -25,6 +25,7 @@ import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.function.context.catalog.FunctionInspector; @@ -58,7 +59,7 @@ public class SpringBootApiGatewayRequestHandler extends @Override protected Object convertEvent(APIGatewayProxyRequestEvent event) { - Object deserializedBody = event.getBody() != null ? deserializeBody(event.getBody()) : Optional.empty(); + Object deserializedBody = event.getBody() != null ? deserializeBody(event) : Optional.empty(); return functionAcceptsMessage() ? new GenericMessage<>(deserializedBody, getHeaders(event)) : deserializedBody; @@ -68,9 +69,12 @@ public class SpringBootApiGatewayRequestHandler extends return this.inspector.isMessage(function()); } - private Object deserializeBody(String json) { + private Object deserializeBody(APIGatewayProxyRequestEvent event) { try { - return this.mapper.readValue(json, getInputType()); + return this.mapper.readValue( + (event.getIsBase64Encoded() != null && event.getIsBase64Encoded()) + ? new String(Base64.decodeBase64(event.getBody())) : event.getBody(), + getInputType()); } catch (Exception e) { throw new IllegalStateException("Cannot convert event", e); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandlerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandlerTests.java index 94334afa3..4036212ef 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandlerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/SpringBootApiGatewayRequestHandlerTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.function.adapter.aws; +import java.util.Base64; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -72,6 +73,18 @@ public class SpringBootApiGatewayRequestHandlerTests { .isEqualTo(200); assertThat(((APIGatewayProxyResponseEvent) output).getBody()) .isEqualTo("{\"value\":\"FOO\"}"); + + APIGatewayProxyRequestEvent bodyEncryptedRequest = new APIGatewayProxyRequestEvent(); + bodyEncryptedRequest.setBody( + Base64.getEncoder().encodeToString("{\"value\":\"foo\"}".getBytes())); + bodyEncryptedRequest.setIsBase64Encoded(true); + + output = this.handler.handleRequest(bodyEncryptedRequest, null); + assertThat(output).isInstanceOf(APIGatewayProxyResponseEvent.class); + assertThat(((APIGatewayProxyResponseEvent) output).getStatusCode()) + .isEqualTo(200); + assertThat(((APIGatewayProxyResponseEvent) output).getBody()) + .isEqualTo("{\"value\":\"FOO\"}"); } @Test