@ -25,7 +25,9 @@ import javax.servlet.AsyncContext;
@@ -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 {
@@ -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 {
@@ -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 ( ) ;