Make TomcatHttpHandlerAdapter aware of request/response wrappers

This commit makes TomcatServerHttpRequest aware of
HttpServletRequestWrappers, and TomcatServerHttpResponse aware of
HttpServletResponseWrappers.

Issue: SPR-17611
This commit is contained in:
Arjen Poutsma 2018-12-19 12:15:30 +01:00
parent 09da10cc6c
commit 5e4a8966ee
1 changed files with 36 additions and 2 deletions

View File

@ -25,7 +25,9 @@ import javax.servlet.AsyncContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.apache.catalina.connector.CoyoteInputStream;
import org.apache.catalina.connector.CoyoteOutputStream;
@ -102,14 +104,30 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
}
private static HttpHeaders createTomcatHttpHeaders(HttpServletRequest request) {
RequestFacade requestFacade = getRequestFacade(request);
org.apache.catalina.connector.Request connectorRequest = (org.apache.catalina.connector.Request)
ReflectionUtils.getField(COYOTE_REQUEST_FIELD, request);
ReflectionUtils.getField(COYOTE_REQUEST_FIELD, requestFacade);
Assert.state(connectorRequest != null, "No Tomcat connector request");
Request tomcatRequest = connectorRequest.getCoyoteRequest();
TomcatHeadersAdapter headers = new TomcatHeadersAdapter(tomcatRequest.getMimeHeaders());
return new HttpHeaders(headers);
}
private static RequestFacade getRequestFacade(HttpServletRequest request) {
if (request instanceof RequestFacade) {
return (RequestFacade) request;
}
else if (request instanceof HttpServletRequestWrapper) {
HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request;
HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest();
return getRequestFacade(wrappedRequest);
}
else {
throw new IllegalArgumentException("Cannot convert [" + request.getClass() +
"] to org.apache.catalina.connector.RequestFacade");
}
}
@Override
protected DataBuffer readFromInputStream() throws IOException {
boolean release = true;
@ -159,14 +177,30 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
}
private static HttpHeaders createTomcatHttpHeaders(HttpServletResponse response) {
ResponseFacade responseFacade = getResponseFacade(response);
org.apache.catalina.connector.Response connectorResponse = (org.apache.catalina.connector.Response)
ReflectionUtils.getField(COYOTE_RESPONSE_FIELD, response);
ReflectionUtils.getField(COYOTE_RESPONSE_FIELD, responseFacade);
Assert.state(connectorResponse != null, "No Tomcat connector response");
Response tomcatResponse = connectorResponse.getCoyoteResponse();
TomcatHeadersAdapter headers = new TomcatHeadersAdapter(tomcatResponse.getMimeHeaders());
return new HttpHeaders(headers);
}
private static ResponseFacade getResponseFacade(HttpServletResponse response) {
if (response instanceof ResponseFacade) {
return (ResponseFacade) response;
}
else if (response instanceof HttpServletResponseWrapper) {
HttpServletResponseWrapper wrapper = (HttpServletResponseWrapper) response;
HttpServletResponse wrappedResponse = (HttpServletResponse) wrapper.getResponse();
return getResponseFacade(wrappedResponse);
}
else {
throw new IllegalArgumentException("Cannot convert [" + response.getClass() +
"] to org.apache.catalina.connector.ResponseFacade");
}
}
@Override
protected void applyHeaders() {
HttpServletResponse response = getNativeResponse();