GH-722 Fix support for API Gateway v2 when Function signature is POJO

Resolves #722
This commit is contained in:
Oleg Zhurakousky
2021-08-17 08:25:28 +02:00
parent e1c6670ed1
commit bfbf2d6e8c

View File

@@ -120,25 +120,21 @@ final class AWSLambdaUtils {
}
if (request instanceof Map) {
logger.info("Incoming MAP: " + request);
if (((Map) request).containsKey("httpMethod")) { //API Gateway
logger.info("Incoming request is API Gateway");
boolean mapInputType = (inputType instanceof ParameterizedType && ((Class<?>) ((ParameterizedType) inputType).getRawType()).isAssignableFrom(Map.class));
if (mapInputType) {
messageBuilder = MessageBuilder.withPayload(request).setHeader("httpMethod", ((Map) request).get("httpMethod"));
messageBuilder.setHeader(AWS_API_GATEWAY, true);
}
else {
Object body = ((Map) request).remove("body");
try {
body = body instanceof String
? String.valueOf(body).getBytes(StandardCharsets.UTF_8)
: objectMapper.writeValueAsBytes(body);
}
catch (Exception e) {
throw new IllegalStateException(e);
}
messageBuilder = MessageBuilder.withPayload(body).copyHeaders(((Map) request));
messageBuilder = createMessageBuilderForPOJOFunction(objectMapper, (Map) request);
}
messageBuilder.setHeader(AWS_API_GATEWAY, true);
}
else if ((((Map) request).containsKey("routeKey") && ((Map) request).containsKey("version"))) {
logger.info("Incoming request is API Gateway v2.0");
messageBuilder = createMessageBuilderForPOJOFunction(objectMapper, (Map) request);
}
Object providedHeaders = ((Map) request).remove("headers");
if (providedHeaders != null && providedHeaders instanceof Map) {
@@ -163,6 +159,24 @@ final class AWSLambdaUtils {
return messageBuilder.copyHeaders(headers).build();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static MessageBuilder createMessageBuilderForPOJOFunction(ObjectMapper objectMapper, Map request) {
Object body = request.remove("body");
try {
body = body instanceof String
? String.valueOf(body).getBytes(StandardCharsets.UTF_8)
: objectMapper.writeValueAsBytes(body);
}
catch (Exception e) {
throw new IllegalStateException(e);
}
logger.info("Body is " + body);
MessageBuilder messageBuilder = MessageBuilder.withPayload(body).copyHeaders(request);
messageBuilder.setHeader(AWS_API_GATEWAY, true);
return messageBuilder;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static byte[] generateOutput(Message requestMessage, Message<byte[]> responseMessage,
ObjectMapper objectMapper, Type functionOutputType) {