Author: pero
Date: Thu Jun  7 02:33:59 2007
New Revision: 545127

URL: http://svn.apache.org/viewvc?view=rev&rev=545127
Log:
Fix correct ApplicationDispatcher forward/include handling after an exception 
is thrown. This patch fix a memory leak
as <code>STRICT_SERVLET_COMPLIANCE</code> system property is enabled and that 
cluster  crossContext session replication
working correct after an exception is thrown at a 
RequestDispatcher.forward/include call.
But I don't really like this double try/catch implementation ;-(


Modified:
    
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
    tomcat/container/tc5.5.x/webapps/docs/changelog.xml

Modified: 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
URL: 
http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java?view=diff&rev=545127&r1=545126&r2=545127
==============================================================================
--- 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
 (original)
+++ 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
 Thu Jun  7 02:33:59 2007
@@ -336,7 +336,11 @@
         HttpServletResponse hresponse = null;
         if (response instanceof HttpServletResponse)
             hresponse = (HttpServletResponse) response;
-
+        
+        IOException ioException = null;
+        ServletException servletException = null;
+        RuntimeException runtimeException = null;
+        
         // Handle a non-HTTP forward by passing the existing request/response
         if ((hrequest == null) || (hresponse == null)) {
 
@@ -361,11 +365,19 @@
             wrequest.setPathInfo(hrequest.getPathInfo());
             wrequest.setQueryString(hrequest.getQueryString());
 
-            processRequest(request,response,state);
-
-            wrequest.recycle();
-            unwrapRequest(state);
-
+            try {
+                processRequest(request,response,state);
+            } catch ( ServletException sexp) {
+                servletException = sexp ;
+            } catch ( IOException iexp) {
+                ioException = iexp ;
+            } catch ( RuntimeException rexp) {
+                runtimeException = rexp ;
+            } finally {
+                wrequest.recycle();
+                // is called at invoke
+                // unwrapRequest(state);
+            }
         }
 
         // Handle an HTTP path-based forward
@@ -399,11 +411,19 @@
                 wrequest.setQueryString(queryString);
                 wrequest.setQueryParams(queryString);
             }
-
-            processRequest(request,response,state);
-
-            wrequest.recycle();
-            unwrapRequest(state);
+            try { 
+                processRequest(request,response,state);
+            } catch ( ServletException sexp) {
+                servletException = sexp ;
+            } catch ( IOException iexp) {
+                ioException = iexp ;
+            } catch ( RuntimeException rexp) {
+                runtimeException = rexp ;
+            } finally {
+                wrequest.recycle();
+                // is called at invoke
+                // unwrapRequest(state);
+            }
 
         }
 
@@ -439,6 +459,14 @@
             }
         }
 
+        // Rethrow an exception if one was thrown by the invoked servlet
+        if (ioException != null)
+            throw ioException;
+        if (servletException != null)
+            throw servletException;
+        if (runtimeException != null)
+            throw runtimeException;
+
     }
 
     
@@ -553,9 +581,12 @@
             wrequest.setAttribute(
                     ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
                     servletPath);
-            invoke(state.outerRequest, state.outerResponse, state);
-
-            wrequest.recycle();
+            try {
+                invoke(state.outerRequest, state.outerResponse, state);
+            } finally {
+                wrequest.recycle();
+            }
+            
         }
 
         // Handle an HTTP path based include
@@ -591,9 +622,11 @@
             wrequest.setAttribute(
                     ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
                     servletPath);
-            invoke(state.outerRequest, state.outerResponse, state);
-
-            wrequest.recycle();
+            try {
+                invoke(state.outerRequest, state.outerResponse, state);
+            } finally {
+                wrequest.recycle();
+            }
         }
 
     }

Modified: tomcat/container/tc5.5.x/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/webapps/docs/changelog.xml?view=diff&rev=545127&r1=545126&r2=545127
==============================================================================
--- tomcat/container/tc5.5.x/webapps/docs/changelog.xml (original)
+++ tomcat/container/tc5.5.x/webapps/docs/changelog.xml Thu Jun  7 02:33:59 2007
@@ -102,7 +102,12 @@
       </add>
       <add>
         And getSession() operation to StandardManager and DeltaManager JMX 
Interface (pero)
-      </add>     
+      </add>
+      <fix>
+         <bug>30949</bug>: Fix correct ApplicationDispatcher forward/include 
handling after an exception is thrown. 
+         This patch fix a memory leak as 
<code>STRICT_SERVLET_COMPLIANCE</code> system property is enabled and that 
cluster 
+         crossContext session replication working correct after an exception 
is thrown at a RequestDispatcher.forward/include() call. (pero)
+      </fix>     
     </changelog>
   </subsection>
   <subsection name="Webapps">



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to