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/09/28 21:00:37 UTC

cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets InvokerServlet.java

craigmcc    00/09/28 12:00:30

  Modified:    catalina/src/share/org/apache/catalina/core
                        StandardWrapper.java
               catalina/src/share/org/apache/catalina/servlets
                        InvokerServlet.java
  Log:
  Clean up the error handling behavior of the invoker servlet (/servlet/*
  mapping) when you do not specify a servlet class or name, or the servlet
  class or name you specify is not found.  Now, all of the following cases
  will return a 404 (not found) error:
  
  	http://localhost:8080/servlet
  	http://localhost:8080/servlet/
  	http://localhost:8080/servlet/nonExistentServlet
  
  instead of the previous 503 error.
  
  A 500 (internal server error) will be returned if the servlet actually
  exists but cannot be initialized (for example, the init() method returns
  an UnavailableException).
  
  PR: BugRat Bug Report #177
  Submitted by:	Anil Amarakoon <an...@awcoldstream.com>
  
  Revision  Changes    Path
  1.9       +6 -5      jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java
  
  Index: StandardWrapper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- StandardWrapper.java	2000/09/06 00:11:18	1.8
  +++ StandardWrapper.java	2000/09/28 19:00:18	1.9
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v 1.8 2000/09/06 00:11:18 craigmcc Exp $
  - * $Revision: 1.8 $
  - * $Date: 2000/09/06 00:11:18 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v 1.9 2000/09/28 19:00:18 craigmcc Exp $
  + * $Revision: 1.9 $
  + * $Date: 2000/09/28 19:00:18 $
    *
    * ====================================================================
    *
  @@ -101,7 +101,7 @@
    * make them efficient are counter-productive.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.8 $ $Date: 2000/09/06 00:11:18 $
  + * @version $Revision: 1.9 $ $Date: 2000/09/28 19:00:18 $
    */
   
   public final class StandardWrapper
  @@ -370,7 +370,8 @@
        */
       public void setParent(Container container) {
   
  -	if (!(container instanceof Context))
  +        if ((container != null) &&
  +            !(container instanceof Context))
   	    throw new IllegalArgumentException
   		(sm.getString("standardWrapper.notContext"));
   	super.setParent(container);
  
  
  
  1.2       +39 -6     jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java
  
  Index: InvokerServlet.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- InvokerServlet.java	2000/08/11 23:39:52	1.1
  +++ InvokerServlet.java	2000/09/28 19:00:26	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java,v 1.1 2000/08/11 23:39:52 craigmcc Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/08/11 23:39:52 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java,v 1.2 2000/09/28 19:00:26 craigmcc Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/09/28 19:00:26 $
    *
    * ====================================================================
    *
  @@ -67,6 +67,7 @@
   
   import java.io.IOException;
   import javax.servlet.RequestDispatcher;
  +import javax.servlet.Servlet;
   import javax.servlet.ServletException;
   import javax.servlet.http.HttpServlet;
   import javax.servlet.http.HttpServletRequest;
  @@ -83,7 +84,7 @@
    * in the web application deployment descriptor.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.1 $ $Date: 2000/08/11 23:39:52 $
  + * @version $Revision: 1.2 $ $Date: 2000/09/28 19:00:26 $
    */
   
   public final class InvokerServlet
  @@ -224,7 +225,7 @@
   	if (pathInfo == null) {
   	    if (debug >= 1)
   	        log("serveRequest:  Invalid pathInfo '" + pathInfo + "'");
  -	    response.sendError(HttpServletResponse.SC_BAD_REQUEST,
  +	    response.sendError(HttpServletResponse.SC_NOT_FOUND,
   	                       request.getRequestURI());
   	    return;
           }
  @@ -253,9 +254,12 @@
   
   	// No, create a new wrapper for the specified servlet class
           else {
  +
   	    if (debug >= 1)
   		log("serveRequest:  Creating wrapper for '" + servletClass +
   		    "' with mapping '" + pattern + "'");
  +
  +            // Create and install a new wrapper
   	    try {
   	        wrapper = context.createWrapper();
   		wrapper.setName(name);
  @@ -264,11 +268,40 @@
   		context.addChild(wrapper);
   		context.addServletMapping(pattern, name);
               } catch (Throwable t) {
  -		log("serveRequest", t);
  +		log("serveRequest.create", t);
   		response.sendError(HttpServletResponse.SC_NOT_FOUND,
   				   request.getRequestURI());
   		return;
               }
  +
  +            // Ensure that we can actually allocate and release an instance
  +            try {
  +                Servlet instance = wrapper.allocate();
  +                wrapper.deallocate(instance);
  +            } catch (ServletException e) {
  +                log("serveRequest.test", e);
  +                Throwable rootCause = e.getRootCause();
  +                if ((rootCause != null) &&
  +                    (rootCause instanceof ClassNotFoundException))
  +                    response.sendError(HttpServletResponse.SC_NOT_FOUND,
  +                                       request.getRequestURI());
  +                else
  +                    response.sendError
  +                        (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
  +                         request.getRequestURI());
  +                context.removeServletMapping(pattern);
  +                context.removeChild(wrapper);
  +                return;
  +            } catch (Throwable t) {
  +                log("serveRequest.test", t);
  +                response.sendError
  +                    (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
  +                     request.getRequestURI());
  +                context.removeServletMapping(pattern);
  +                context.removeChild(wrapper);
  +                return;
  +            }
  +
   	}
   
   	// Pass this request on to the identified or newly created wrapper