More defensive check for MockAsyncContext

Avoid automatically unwrapping the request in TestDispatcherServlet,
if we find the MockAsyncContext.

Issue: SPR-17353
This commit is contained in:
Rossen Stoyanchev
2018-10-09 11:51:21 -04:00
parent d551710c32
commit fc2f3ecf44

View File

@@ -71,13 +71,22 @@ final class TestDispatcherServlet extends DispatcherServlet {
super.service(request, response);
if (request.getAsyncContext() != null) {
MockHttpServletRequest mockRequest = WebUtils.getNativeRequest(request, MockHttpServletRequest.class);
Assert.notNull(mockRequest, "Expected MockHttpServletRequest");
MockAsyncContext mockAsyncContext = ((MockAsyncContext) mockRequest.getAsyncContext());
Assert.notNull(mockAsyncContext, "MockAsyncContext not found. Did request wrapper not delegate startAsync?");
MockAsyncContext asyncContext;
if (request.getAsyncContext() instanceof MockAsyncContext) {
asyncContext = (MockAsyncContext) request.getAsyncContext();
}
else {
MockHttpServletRequest mockRequest = WebUtils.getNativeRequest(request, MockHttpServletRequest.class);
Assert.notNull(mockRequest, "Expected MockHttpServletRequest");
asyncContext = (MockAsyncContext) mockRequest.getAsyncContext();
Assert.notNull(asyncContext, () ->
"Outer request wrapper " + request.getClass().getName() + " has an AsyncContext," +
"but it is not a MockAsyncContext, while the nested " +
mockRequest.getClass().getName() + " does not have an AsyncContext at all.");
}
CountDownLatch dispatchLatch = new CountDownLatch(1);
mockAsyncContext.addDispatchHandler(dispatchLatch::countDown);
asyncContext.addDispatchHandler(dispatchLatch::countDown);
getMvcResult(request).setAsyncDispatchLatch(dispatchLatch);
}
}