Author: fhanik Date: Tue Nov 21 08:35:19 2006 New Revision: 477737 URL: http://svn.apache.org/viewvc?view=rev&rev=477737 Log: Fix the logic of the checkSameObjects method. The method did not take into account that the lastServiceRequest/Response could be wrapped themselves.
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java?view=diff&rev=477737&r1=477736&r2=477737 ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Tue Nov 21 08:35:19 2006 @@ -969,10 +969,8 @@ } private void checkSameObjects() throws ServletException { - ServletRequest originalRequest = - ApplicationFilterChain.getLastServicedRequest(); - ServletResponse originalResponse = - ApplicationFilterChain.getLastServicedResponse(); + ServletRequest originalRequest = ApplicationFilterChain.getLastServicedRequest(); + ServletResponse originalResponse = ApplicationFilterChain.getLastServicedResponse(); // Some forwards, eg from valves will not set original values if (originalRequest == null || originalResponse == null) { @@ -982,41 +980,47 @@ boolean same = false; ServletRequest dispatchedRequest = appRequest; + //find the bottom most request, the one that was passed into the service method + while ( originalRequest instanceof ServletRequestWrapper && ((ServletRequestWrapper) originalRequest).getRequest()!=null ) { + originalRequest = ((ServletRequestWrapper) originalRequest).getRequest(); + } + //compare with the dispatched request while (!same) { if (originalRequest.equals(dispatchedRequest)) { same = true; } if (!same && dispatchedRequest instanceof ServletRequestWrapper) { - dispatchedRequest = - ((ServletRequestWrapper) dispatchedRequest).getRequest(); + dispatchedRequest = ((ServletRequestWrapper) dispatchedRequest).getRequest(); } else { break; } } if (!same) { - throw new ServletException(sm.getString( - "applicationDispatcher.specViolation.request")); + throw new ServletException(sm.getString("applicationDispatcher.specViolation.request")); } same = false; ServletResponse dispatchedResponse = appResponse; + //find the bottom most response, the one that was passed into the service method + while ( originalResponse instanceof ServletResponseWrapper && ((ServletResponseWrapper) originalResponse).getResponse()!=null ) { + originalResponse = ((ServletResponseWrapper) originalResponse).getResponse(); + } + //compare with the dispatched response while (!same) { if (originalResponse.equals(dispatchedResponse)) { same = true; } if (!same && dispatchedResponse instanceof ServletResponseWrapper) { - dispatchedResponse = - ((ServletResponseWrapper) dispatchedResponse).getResponse(); + dispatchedResponse = ((ServletResponseWrapper) dispatchedResponse).getResponse(); } else { break; } } if (!same) { - throw new ServletException(sm.getString( - "applicationDispatcher.specViolation.response")); + throw new ServletException(sm.getString("applicationDispatcher.specViolation.response")); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]