Skip to content

Commit b96a9f8

Browse files
committed
Fix for async context and setting response in proxy servlet request before processing
1 parent 0279250 commit b96a9f8

File tree

5 files changed

+26
-2
lines changed

5 files changed

+26
-2
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.io.IOException;
1212
import java.util.ArrayList;
1313
import java.util.List;
14+
import java.util.concurrent.atomic.AtomicBoolean;
1415

1516
/**
1617
* Async context for Serverless Java Container. This is used to support reactive embedded servers for our support for
@@ -23,6 +24,8 @@ public class AwsAsyncContext implements AsyncContext {
2324
private AwsLambdaServletContainerHandler handler;
2425
private List<AsyncListenerHolder> listeners;
2526
private long timeout;
27+
private AtomicBoolean dispatched;
28+
private AtomicBoolean completed;
2629

2730
private Logger log = LoggerFactory.getLogger(AwsAsyncContext.class);
2831

@@ -33,6 +36,8 @@ public AwsAsyncContext(HttpServletRequest request, HttpServletResponse response,
3336
handler = servletHandler;
3437
listeners = new ArrayList<>();
3538
timeout = 3000;
39+
dispatched = new AtomicBoolean(false);
40+
completed = new AtomicBoolean(false);
3641
}
3742

3843
@Override
@@ -57,6 +62,7 @@ public void dispatch() {
5762
notifyListeners(NotificationType.START_ASYNC, null);
5863
Servlet servlet = ((AwsServletContext)handler.getServletContext()).getServletForPath(req.getPathInfo());
5964
handler.doFilter(req, res, servlet);
65+
dispatched.set(true);
6066
} catch (ServletException | IOException e) {
6167
notifyListeners(NotificationType.ERROR, e);
6268
}
@@ -83,6 +89,7 @@ public void complete() {
8389
log.debug("Completing request");
8490
notifyListeners(NotificationType.COMPLETE, null);
8591
res.flushBuffer();
92+
completed.set(true);
8693
} catch (IOException e) {
8794
log.error("Could not flush response buffer", e);
8895
throw new RuntimeException(e);
@@ -126,6 +133,14 @@ public long getTimeout() {
126133
return timeout;
127134
}
128135

136+
public boolean isDispatched() {
137+
return dispatched.get();
138+
}
139+
140+
public boolean isCompleted() {
141+
return completed.get();
142+
}
143+
129144
private void notifyListeners(NotificationType type, Throwable t) {
130145
listeners.forEach((h) -> {
131146
try {

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest {
7676

7777
private AwsProxyRequest request;
7878
private SecurityContext securityContext;
79-
private AsyncContext asyncContext;
79+
private AwsAsyncContext asyncContext;
8080
private Map<String, List<String>> urlEncodedFormParameters;
8181
private Map<String, Part> multipartFormParameters;
8282
private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class);
@@ -670,7 +670,13 @@ public boolean isAsyncSupported() {
670670

671671
@Override
672672
public boolean isAsyncStarted() {
673-
return asyncContext != null;
673+
if (asyncContext == null) {
674+
return false;
675+
}
676+
if (asyncContext.isCompleted() || asyncContext.isDispatched()) {
677+
return false;
678+
}
679+
return true;
674680
}
675681

676682

aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt
142142

143143
// process filters & invoke servlet
144144
Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo());
145+
containerRequest.setResponse(containerResponse);
145146
doFilter(containerRequest, containerResponse, reqServlet);
146147
Timer.stop("SPRINGBOOT_HANDLE_REQUEST");
147148
}

aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt
143143

144144
// process filters
145145
Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo());
146+
containerRequest.setResponse(containerResponse);
146147
doFilter(containerRequest, containerResponse, reqServlet);
147148
Timer.stop("SPRING_HANDLE_REQUEST");
148149
}

aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt
138138

139139
// process filters & invoke servlet
140140
Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo());
141+
containerRequest.setResponse(containerResponse);
141142
doFilter(containerRequest, containerResponse, reqServlet);
142143
Timer.stop("SPRINGBOOT2_HANDLE_REQUEST");
143144
}

0 commit comments

Comments
 (0)