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]

Reply via email to