craigmcc    00/11/09 13:18:10

  Modified:    src/share/org/apache/tomcat/facade Tag: tomcat_32
                        RequestDispatcherImpl.java
               src/share/org/apache/tomcat/resources Tag: tomcat_32
                        LocalStrings.properties
  Log:
  Previous changes implemented "exception rethrowing" in the case of a path
  based include().  This patch adds the following enhancements:
  
  - If an included servlet throws an exception other than IOException or
    ServletException, wrap it in a new ServletException (as the root cause)
    and throw that instead.
  
  - Add exception throwing support in the following additional cases:
    * Path based forward() - getServletContext().getRequestDispatcher()
    * Name based include() - getServletContext().getNamedDispatcher()
    * Name based forward() - getServletContext().getNamedDispatcher()
  
  - When processing a named based include, set the "included" flag on the
    response so that attempts to modify headers and cookies in the included
    servlet are (correctly) ignored.
  
  Currently passes all the Watchdog servlet tests, and all the Watchdog JSP
  tests except for some taglib-related ones that are unrelated to this
  particular issue.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.8.2.5   +97 -8     
jakarta-tomcat/src/share/org/apache/tomcat/facade/Attic/RequestDispatcherImpl.java
  
  Index: RequestDispatcherImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/facade/Attic/RequestDispatcherImpl.java,v
  retrieving revision 1.8.2.4
  retrieving revision 1.8.2.5
  diff -u -r1.8.2.4 -r1.8.2.5
  --- RequestDispatcherImpl.java        2000/11/09 13:27:36     1.8.2.4
  +++ RequestDispatcherImpl.java        2000/11/09 21:18:09     1.8.2.5
  @@ -188,7 +188,28 @@
   
        // CM should have set the wrapper - call it
        ServletWrapper wr=realRequest.getWrapper();
  -     if( wr!=null ) wr.service(realRequest, realResponse);
  +        Throwable t = null;
  +        if( wr != null ) {
  +            try {
  +                wr.service(realRequest, realResponse);
  +            } catch (Throwable t1) {
  +                t = t1;
  +            }
  +        }
  +
  +        // Clean up the request and response as needed
  +        ;       // No action required
  +
  +        // Rethrow any exception thrown by the forwarded-to servlet
  +        if (t != null) {
  +            if (t instanceof IOException)
  +                throw (IOException) t;
  +            else if (t instanceof ServletException)
  +                throw (ServletException) t;
  +            else
  +                throw new ServletException
  +                    (sm.getString("dispatcher.forwardException", t));
  +        }
   
        // close the response - output after this point will be discarded.
        realResponse.finish();
  @@ -348,12 +369,17 @@
            realResponse.setIncluded( false );
        }
   
  +        // Rethrow any exception thrown by the included servlet
        if (t != null) {
            if (t instanceof IOException)
                throw (IOException) t;
            else if (t instanceof ServletException)
                throw (ServletException) t;
  +            else
  +                throw new ServletException
  +                    (sm.getString("dispatcher.includeException", t));
        }
  +
       }
   
        
  @@ -364,13 +390,48 @@
       public void includeNamed(ServletRequest request, ServletResponse response)
        throws ServletException, IOException
       {
  -     // Use the original request - as in specification !
   
        // We got here if name!=null, so assert it
        ServletWrapper wrapper = context.getServletByName( name );
  -     Request realR=((HttpServletRequestFacade)request).getRealRequest();
  -     if( wrapper!=null)
  -         wrapper.service( realR, realR.getResponse());
  +
  +     // Use the original request - as in specification !
  +        Request realRequest = ((HttpServletRequestFacade)request).
  +         getRealRequest();
  +     Response realResponse = realRequest.getResponse();
  +
  +        // Set the "included" flag so that things like header setting in the
  +        // included servlet will be correctly ignored
  +     boolean old_included=realResponse.isIncluded();
  +     if( ! old_included ) {
  +         realResponse.setIncluded( true );
  +     }
  +
  +        // Call the included servlet
  +        Throwable t = null;
  +     if( wrapper!=null) {
  +            try {
  +                wrapper.service( realRequest, realRequest.getResponse());
  +            } catch (Throwable t1) {
  +                t = t1;
  +            }
  +        }
  +
  +        // Clean up the request and response as needed
  +     if( ! old_included ) {
  +         realResponse.setIncluded( false );
  +     }
  +
  +        // Rethrow any exception thrown by the included servlet
  +     if (t != null) {
  +         if (t instanceof IOException)
  +             throw (IOException) t;
  +         else if (t instanceof ServletException)
  +             throw (ServletException) t;
  +            else
  +                throw new ServletException
  +                    (sm.getString("dispatcher.includeException", t));
  +     }
  +
       }
   
       /** Named forward
  @@ -378,11 +439,39 @@
       public void forwardNamed(ServletRequest request, ServletResponse response)
        throws ServletException, IOException
       {
  +
  +     // We got here if name!=null, so assert it
        ServletWrapper wrapper = context.getServletByName( name );
  -     Request realR=((HttpServletRequestFacade)request).getRealRequest();
  +
  +     // Use the original request - as in specification !
  +        Request realRequest = ((HttpServletRequestFacade)request).
  +         getRealRequest();
  +     Response realResponse = realRequest.getResponse();
  +
  +        // Call the forwarded-to servlet
  +        Throwable t = null;
  +     if( wrapper!=null) {
  +            try {
  +                wrapper.service( realRequest, realRequest.getResponse());
  +            } catch (Throwable t1) {
  +                t = t1;
  +            }
  +        }
  +
  +        // Clean up the request and response as needed
  +        ;       // No action required
  +
  +        // Rethrow any exception thrown by the forwarded-to servlet
  +     if (t != null) {
  +         if (t instanceof IOException)
  +             throw (IOException) t;
  +         else if (t instanceof ServletException)
  +             throw (ServletException) t;
  +            else
  +                throw new ServletException
  +                    (sm.getString("dispatcher.forwardException", t));
  +     }
   
  -     if( wrapper!=null)
  -         wrapper.service( realR, realR.getResponse());
       }    
   
       /**
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.4.2.3   +5 -1      
jakarta-tomcat/src/share/org/apache/tomcat/resources/LocalStrings.properties
  
  Index: LocalStrings.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/resources/LocalStrings.properties,v
  retrieving revision 1.4.2.2
  retrieving revision 1.4.2.3
  diff -u -r1.4.2.2 -r1.4.2.3
  --- LocalStrings.properties   2000/09/28 02:07:06     1.4.2.2
  +++ LocalStrings.properties   2000/11/09 21:18:09     1.4.2.3
  @@ -1,4 +1,4 @@
  -# $Id: LocalStrings.properties,v 1.4.2.2 2000/09/28 02:07:06 larryi Exp $
  +# $Id: LocalStrings.properties,v 1.4.2.3 2000/11/09 21:18:09 craigmcc Exp $
   #
   
   # Localized strings for package org.apache.tomcat.core
  @@ -21,6 +21,10 @@
   defaulterrorpage.thisdocumenthasmoved=This document has moved
   defaulterrorpage.internalservleterror=Internal Servlet Error:
   defaulterrorpage.notfoundrequest=Not found request:
  +
  +#RequestDispatcherImpl.java
  +dispatcher.forwardException=Forwarded servlet threw exception
  +dispatcher.includeException=Included servlet threw exception
   
   #Tomcat.java
   tomcat.usage=usage: 
  
  
  

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

Reply via email to