Skip to content

Commit e87a86e

Browse files
committed
Bug fix in servlet request impl to null-check headers in case Lambda gets sent an event without the multiValueHeaders property (#281). Also moved the ServletContext to be managed by the ServletRequestReader istead of set on each request by the LambdaContainerHandler. Additional bug fix to set the correct dispatcher type when startAsync is called on the request
1 parent 301f718 commit e87a86e

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
1919
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
2020
import com.amazonaws.serverless.proxy.model.ContainerConfig;
21+
import com.amazonaws.serverless.proxy.model.Headers;
2122
import com.amazonaws.services.lambda.runtime.Context;
2223

2324
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -31,13 +32,7 @@
3132
import org.slf4j.Logger;
3233
import org.slf4j.LoggerFactory;
3334

34-
import javax.servlet.AsyncContext;
35-
import javax.servlet.ReadListener;
36-
import javax.servlet.RequestDispatcher;
37-
import javax.servlet.ServletException;
38-
import javax.servlet.ServletInputStream;
39-
import javax.servlet.ServletRequest;
40-
import javax.servlet.ServletResponse;
35+
import javax.servlet.*;
4136
import javax.servlet.http.*;
4237
import javax.ws.rs.core.HttpHeaders;
4338
import javax.ws.rs.core.MediaType;
@@ -119,10 +114,6 @@ public void setResponse(AwsHttpServletResponse response) {
119114
this.response = response;
120115
}
121116

122-
public AwsLambdaServletContainerHandler getContainerHandler() {
123-
return containerHandler;
124-
}
125-
126117
public void setContainerHandler(AwsLambdaServletContainerHandler containerHandler) {
127118
this.containerHandler = containerHandler;
128119
}
@@ -380,6 +371,9 @@ public String getCharacterEncoding() {
380371
@Override
381372
public void setCharacterEncoding(String s)
382373
throws UnsupportedEncodingException {
374+
if (request.getMultiValueHeaders() == null) {
375+
request.setMultiValueHeaders(new Headers());
376+
}
383377
String currentContentType = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
384378
if (currentContentType == null || "".equals(currentContentType)) {
385379
log.debug("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set");
@@ -679,6 +673,7 @@ public boolean isAsyncSupported() {
679673
public AsyncContext startAsync()
680674
throws IllegalStateException {
681675
asyncContext = new AwsAsyncContext(this, response, containerHandler);
676+
setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC);
682677
log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId()));
683678
return asyncContext;
684679
}
@@ -688,6 +683,7 @@ public AsyncContext startAsync()
688683
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse)
689684
throws IllegalStateException {
690685
asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler);
686+
setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC);
691687
log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId()));
692688
return asyncContext;
693689
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.amazonaws.serverless.proxy.model.ContainerConfig;
1919
import com.amazonaws.services.lambda.runtime.Context;
2020

21+
import javax.servlet.ServletContext;
2122
import javax.ws.rs.core.HttpHeaders;
2223
import javax.ws.rs.core.SecurityContext;
2324

@@ -27,11 +28,15 @@
2728
*/
2829
public class AwsProxyHttpServletRequestReader extends RequestReader<AwsProxyRequest, AwsProxyHttpServletRequest> {
2930
static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer";
30-
31+
private ServletContext servletContext;
3132
//-------------------------------------------------------------
3233
// Methods - Implementation
3334
//-------------------------------------------------------------
3435

36+
public void setServletContext(ServletContext ctx) {
37+
servletContext = ctx;
38+
}
39+
3540
@Override
3641
public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config)
3742
throws InvalidRequestEventException {
@@ -48,6 +53,7 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC
4853
request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, getContentTypeWithCharset(contentType, config));
4954
}
5055
AwsProxyHttpServletRequest servletRequest = new AwsProxyHttpServletRequest(request, lambdaContext, securityContext, config);
56+
servletRequest.setServletContext(servletContext);
5157
servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext());
5258
servletRequest.setAttribute(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables());
5359
servletRequest.setAttribute(API_GATEWAY_EVENT_PROPERTY, request);

0 commit comments

Comments
 (0)