You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@locus.apache.org on 2000/11/04 23:33:59 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/core ContextManager.java Handler.java ServletWrapper.java

craigmcc    00/11/04 14:33:59

  Modified:    src/share/org/apache/tomcat/core Tag: tomcat_32
                        ContextManager.java Handler.java
                        ServletWrapper.java
  Log:
  Fix a spec compliance bug -- Tomcat 3.2 was swallowing exceptions thrown
  by a servlet (or JSP page) called via RequestDispatcher.include(), rather
  than throwing them on to the calling servlet.  (See Servlet 2.2
  Specification, Section 8.5.)
  
  Now, an included servlet throwing an exception will have its exception
  rethrown (wrapped in a new ServletException as a root cause if needed)
  rather than trying to run the normal error handling machinery that deals
  with exceptions thrown by a top-level servlet.
  
  Note:  This fix needs to be evaluated for unintended side effects!
  
  PR: BugRat Bug Report #213
  Submitted by:	Ethan Wallwork <et...@net-linx.com>
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.100.2.14 +14 -2     jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java
  
  Index: ContextManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v
  retrieving revision 1.100.2.13
  retrieving revision 1.100.2.14
  diff -u -r1.100.2.13 -r1.100.2.14
  --- ContextManager.java	2000/11/04 20:28:47	1.100.2.13
  +++ ContextManager.java	2000/11/04 22:33:58	1.100.2.14
  @@ -1042,7 +1042,13 @@
   
   	req.setAttribute("tomcat.servlet.error.request", req);
   
  -	errorServlet.service( req, res );
  +        try {
  +            errorServlet.service( req, res );
  +        } catch( IOException e ) {
  +            ;   // ASSERT: Only thrown by included servlets
  +        } catch( ServletException e ) {
  +            ;   // ASSERT: Only thrown by included servlets
  +        }
       }
   
       // XXX XXX Security - we should log the message, but nothing
  @@ -1120,7 +1126,13 @@
   	req.setAttribute("tomcat.servlet.error.throwable", t);
   	req.setAttribute("tomcat.servlet.error.request", req);
   
  -	errorServlet.service( req, res );
  +        try {
  +            errorServlet.service( req, res );
  +        } catch( IOException e ) {
  +            ;   // ASSERT: Only thrown by included servlets
  +        } catch( ServletException e) {
  +            ;   // ASSERT: Only thrown by included servlets
  +        }
       }
   
       public ServletWrapper getHandlerForPath( Context ctx, String path ) {
  
  
  
  1.7.2.2   +34 -3     jakarta-tomcat/src/share/org/apache/tomcat/core/Handler.java
  
  Index: Handler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Handler.java,v
  retrieving revision 1.7.2.1
  retrieving revision 1.7.2.2
  diff -u -r1.7.2.1 -r1.7.2.2
  --- Handler.java	2000/08/27 00:40:04	1.7.2.1
  +++ Handler.java	2000/11/04 22:33:58	1.7.2.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Handler.java,v 1.7.2.1 2000/08/27 00:40:04 larryi Exp $
  - * $Revision: 1.7.2.1 $
  - * $Date: 2000/08/27 00:40:04 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Handler.java,v 1.7.2.2 2000/11/04 22:33:58 craigmcc Exp $
  + * $Revision: 1.7.2.2 $
  + * $Date: 2000/11/04 22:33:58 $
    *
    * ====================================================================
    *
  @@ -235,8 +235,16 @@
       }
   
       /** Call the service method, and notify all listeners
  +     *
  +     * @exception IOException if an input/output error occurs and we are
  +     *  processing an included servlet (otherwise it is swallowed and
  +     *  handled by the top level error handler mechanism)
  +     * @exception ServletException if a servlet throws an exception and
  +     *  we are processing an included servlet (otherwise it is swallowed
  +     *  and handled by the top level error handler mechanism)
        */
       public void service(Request req, Response res) 
  +        throws IOException, ServletException
       {
   	if( ! initialized ) {
   	    try {
  @@ -250,6 +258,15 @@
   		    return;
   		}
   		context.log("Exception in init  " + ex.getMessage(), ex );
  +                if (res.isIncluded()) {
  +                    if (ex instanceof IOException)
  +                        throw (IOException) ex;
  +                    else if (ex instanceof ServletException)
  +                        throw (ServletException) ex;
  +                    else
  +                        throw new ServletException
  +                            ("Included Servlet Init Exception", ex);
  +                }
   		contextM.handleError( req, res, ex );
   		return;
   	    }
  @@ -270,7 +287,21 @@
   	    contextM.doPostService( req, res );
   
   	if( t==null ) return;
  +
  +        // Rethrow an exception if we are inside an include
  +        if (res.isIncluded()) {
  +            context.log("Rethrowing included exception: " + t);
  +            if (t instanceof IOException)
  +                throw (IOException) t;
  +            else if (t instanceof ServletException)
  +                throw (ServletException) t;
  +            else
  +                throw new ServletException("Included Servlet Exception", t);
  +        }
  +
  +        // Otherwise, handle a top-level error as usual
   	contextM.handleError( req, res, t );
  +
       }
   
   //     protected void handleError( Request req, Response res, Throwable t) {
  
  
  
  1.60.2.3  +23 -9     jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ServletWrapper.java
  
  Index: ServletWrapper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ServletWrapper.java,v
  retrieving revision 1.60.2.2
  retrieving revision 1.60.2.3
  diff -u -r1.60.2.2 -r1.60.2.3
  --- ServletWrapper.java	2000/08/27 00:40:04	1.60.2.2
  +++ ServletWrapper.java	2000/11/04 22:33:58	1.60.2.3
  @@ -327,10 +327,18 @@
       }
   
       /** Override service to hook reloading - it can be done in a clean
  -	interceptor. It also hooks jsp - we should have a separate
  -	JspHandler
  -    */
  -    public void service(Request req, Response res) 
  +     * interceptor. It also hooks jsp - we should have a separate
  +     * JspHandler
  +     *
  +     * @exception IOException if an input/output error occurs and we are
  +     *  processing an included servlet (otherwise it is swallowed and
  +     *  handled by the top level error handler mechanism)
  +     * @exception ServletException if a servlet throws an exception and
  +     *  we are processing an included servlet (otherwise it is swallowed
  +     *  and handled by the top level error handler mechanism)
  +     */
  +    public void service(Request req, Response res)
  +        throws IOException, ServletException
       {
   	try {
   	    handleReload(req);
  @@ -368,11 +376,17 @@
   
   	// called only if unavailable==null or timer expired.
   	// will do an init
  -	super.service( req, res );
  -
  -	// if unavailable set, assume problem in init()
  -	if (unavailable!=null)
  -		handleUnavailable( req, res);
  +        try {
  +            super.service( req, res );
  +        } catch( IOException e ) {
  +            throw e;
  +        } catch( UnavailableException e ) {
  +            // if unavailable set, assume problem in init()
  +            handleUnavailable( req, res );
  +            throw e;
  +        } catch( ServletException e ) {
  +            throw e;
  +        }
       }
   
       protected void doService(Request req, Response res)