GH-438 Added initial support for ALB request/response

Added initila support for Application Load Balancer request and response events. This support for now is only protocol based (see https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#respond-to-load-balancer)
Added initial tests

Resolves #438
This commit is contained in:
Oleg Zhurakousky
2019-12-26 11:24:07 +01:00
parent b8c3565251
commit 01360df41e
2 changed files with 86 additions and 17 deletions

View File

@@ -21,7 +21,6 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -44,6 +43,7 @@ import org.springframework.cloud.function.context.catalog.FunctionInspector;
import org.springframework.cloud.function.utils.FunctionClassUtils;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.util.Assert;
@@ -78,12 +78,21 @@ public class FunctionInvoker implements RequestStreamHandler {
Message<byte[]> responseMessage = this.function.apply(requestMessage);
byte[] responseBytes = responseMessage.getPayload();
if (requestMessage.getHeaders().containsKey("httpMethod")) {
Map<String, Object> requestPayloadMap = this.getRequestPayloadAsMap(requestMessage);
if (requestPayloadMap != null && requestPayloadMap.containsKey("httpMethod")) {
Map<String, Object> response = new HashMap<String, Object>();
response.put("isBase64Encoded", false);
response.put("statusCode", 200);
int statusCode = responseMessage.getHeaders().containsKey("statusCode")
? (int) responseMessage.getHeaders().get("statusCode")
: 200;
HttpStatus httpStatus = HttpStatus.valueOf(statusCode);
response.put("statusCode", statusCode);
response.put("statusDescription", httpStatus.toString());
response.put("body", new String(responseMessage.getPayload(), StandardCharsets.UTF_8));
response.put("headers", Collections.singletonMap("foo", "bar"));
response.put("headers", responseMessage.getHeaders());
responseBytes = mapper.writeValueAsBytes(response);
}
@@ -138,4 +147,15 @@ public class FunctionInvoker implements RequestStreamHandler {
return message;
}
@SuppressWarnings("unchecked")
private Map<String, Object> getRequestPayloadAsMap(Message<byte[]> message) {
try {
return this.mapper.readValue(message.getPayload(), Map.class);
}
catch (Exception e) {
// ignore
}
return null;
}
}