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]