|
25 | 25 | import javax.servlet.ServletRequest;
|
26 | 26 | import javax.servlet.ServletResponse;
|
27 | 27 | import javax.servlet.http.HttpServletRequest;
|
| 28 | +import javax.servlet.http.HttpServletRequestWrapper; |
28 | 29 | import javax.servlet.http.HttpServletResponse;
|
| 30 | +import javax.servlet.http.HttpServletResponseWrapper; |
29 | 31 |
|
30 | 32 | import org.apache.catalina.connector.CoyoteInputStream;
|
31 | 33 | import org.apache.catalina.connector.CoyoteOutputStream;
|
@@ -102,14 +104,30 @@ private static final class TomcatServerHttpRequest extends ServletServerHttpRequ
|
102 | 104 | }
|
103 | 105 |
|
104 | 106 | private static HttpHeaders createTomcatHttpHeaders(HttpServletRequest request) {
|
| 107 | + RequestFacade requestFacade = getRequestFacade(request); |
105 | 108 | 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); |
107 | 110 | Assert.state(connectorRequest != null, "No Tomcat connector request");
|
108 | 111 | Request tomcatRequest = connectorRequest.getCoyoteRequest();
|
109 | 112 | TomcatHeadersAdapter headers = new TomcatHeadersAdapter(tomcatRequest.getMimeHeaders());
|
110 | 113 | return new HttpHeaders(headers);
|
111 | 114 | }
|
112 | 115 |
|
| 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 | + |
113 | 131 | @Override
|
114 | 132 | protected DataBuffer readFromInputStream() throws IOException {
|
115 | 133 | boolean release = true;
|
@@ -159,14 +177,30 @@ private static final class TomcatServerHttpResponse extends ServletServerHttpRes
|
159 | 177 | }
|
160 | 178 |
|
161 | 179 | private static HttpHeaders createTomcatHttpHeaders(HttpServletResponse response) {
|
| 180 | + ResponseFacade responseFacade = getResponseFacade(response); |
162 | 181 | 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); |
164 | 183 | Assert.state(connectorResponse != null, "No Tomcat connector response");
|
165 | 184 | Response tomcatResponse = connectorResponse.getCoyoteResponse();
|
166 | 185 | TomcatHeadersAdapter headers = new TomcatHeadersAdapter(tomcatResponse.getMimeHeaders());
|
167 | 186 | return new HttpHeaders(headers);
|
168 | 187 | }
|
169 | 188 |
|
| 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 | + |
170 | 204 | @Override
|
171 | 205 | protected void applyHeaders() {
|
172 | 206 | HttpServletResponse response = getNativeResponse();
|
|
0 commit comments