Skip to content

Commit 5e4a896

Browse files
committed
Make TomcatHttpHandlerAdapter aware of request/response wrappers
This commit makes TomcatServerHttpRequest aware of HttpServletRequestWrappers, and TomcatServerHttpResponse aware of HttpServletResponseWrappers. Issue: SPR-17611
1 parent 09da10c commit 5e4a896

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import javax.servlet.ServletRequest;
2626
import javax.servlet.ServletResponse;
2727
import javax.servlet.http.HttpServletRequest;
28+
import javax.servlet.http.HttpServletRequestWrapper;
2829
import javax.servlet.http.HttpServletResponse;
30+
import javax.servlet.http.HttpServletResponseWrapper;
2931

3032
import org.apache.catalina.connector.CoyoteInputStream;
3133
import org.apache.catalina.connector.CoyoteOutputStream;
@@ -102,14 +104,30 @@ private static final class TomcatServerHttpRequest extends ServletServerHttpRequ
102104
}
103105

104106
private static HttpHeaders createTomcatHttpHeaders(HttpServletRequest request) {
107+
RequestFacade requestFacade = getRequestFacade(request);
105108
org.apache.catalina.connector.Request connectorRequest = (org.apache.catalina.connector.Request)
106-
ReflectionUtils.getField(COYOTE_REQUEST_FIELD, request);
109+
ReflectionUtils.getField(COYOTE_REQUEST_FIELD, requestFacade);
107110
Assert.state(connectorRequest != null, "No Tomcat connector request");
108111
Request tomcatRequest = connectorRequest.getCoyoteRequest();
109112
TomcatHeadersAdapter headers = new TomcatHeadersAdapter(tomcatRequest.getMimeHeaders());
110113
return new HttpHeaders(headers);
111114
}
112115

116+
private static RequestFacade getRequestFacade(HttpServletRequest request) {
117+
if (request instanceof RequestFacade) {
118+
return (RequestFacade) request;
119+
}
120+
else if (request instanceof HttpServletRequestWrapper) {
121+
HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request;
122+
HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest();
123+
return getRequestFacade(wrappedRequest);
124+
}
125+
else {
126+
throw new IllegalArgumentException("Cannot convert [" + request.getClass() +
127+
"] to org.apache.catalina.connector.RequestFacade");
128+
}
129+
}
130+
113131
@Override
114132
protected DataBuffer readFromInputStream() throws IOException {
115133
boolean release = true;
@@ -159,14 +177,30 @@ private static final class TomcatServerHttpResponse extends ServletServerHttpRes
159177
}
160178

161179
private static HttpHeaders createTomcatHttpHeaders(HttpServletResponse response) {
180+
ResponseFacade responseFacade = getResponseFacade(response);
162181
org.apache.catalina.connector.Response connectorResponse = (org.apache.catalina.connector.Response)
163-
ReflectionUtils.getField(COYOTE_RESPONSE_FIELD, response);
182+
ReflectionUtils.getField(COYOTE_RESPONSE_FIELD, responseFacade);
164183
Assert.state(connectorResponse != null, "No Tomcat connector response");
165184
Response tomcatResponse = connectorResponse.getCoyoteResponse();
166185
TomcatHeadersAdapter headers = new TomcatHeadersAdapter(tomcatResponse.getMimeHeaders());
167186
return new HttpHeaders(headers);
168187
}
169188

189+
private static ResponseFacade getResponseFacade(HttpServletResponse response) {
190+
if (response instanceof ResponseFacade) {
191+
return (ResponseFacade) response;
192+
}
193+
else if (response instanceof HttpServletResponseWrapper) {
194+
HttpServletResponseWrapper wrapper = (HttpServletResponseWrapper) response;
195+
HttpServletResponse wrappedResponse = (HttpServletResponse) wrapper.getResponse();
196+
return getResponseFacade(wrappedResponse);
197+
}
198+
else {
199+
throw new IllegalArgumentException("Cannot convert [" + response.getClass() +
200+
"] to org.apache.catalina.connector.ResponseFacade");
201+
}
202+
}
203+
170204
@Override
171205
protected void applyHeaders() {
172206
HttpServletResponse response = getNativeResponse();

0 commit comments

Comments
 (0)