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/10 02:19:18 UTC
cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets InvokerServlet.java LocalStrings.properties
craigmcc 00/11/09 17:19:18
Modified: catalina/src/share/org/apache/catalina/servlets
InvokerServlet.java LocalStrings.properties
Log:
Make the invoker servlet work when called underneath a request dispatcher
path-based include.
Revision Changes Path
1.3 +102 -33 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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- InvokerServlet.java 2000/09/28 19:00:26 1.2
+++ InvokerServlet.java 2000/11/10 01:19:17 1.3
@@ -1,7 +1,7 @@
/*
- * $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 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java,v 1.3 2000/11/10 01:19:17 craigmcc Exp $
+ * $Revision: 1.3 $
+ * $Date: 2000/11/10 01:19:17 $
*
* ====================================================================
*
@@ -73,9 +73,11 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
+import org.apache.catalina.Globals;
import org.apache.catalina.HttpRequest;
import org.apache.catalina.HttpResponse;
import org.apache.catalina.Wrapper;
+import org.apache.catalina.util.StringManager;
/**
@@ -84,7 +86,7 @@
* in the web application deployment descriptor.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.2 $ $Date: 2000/09/28 19:00:26 $
+ * @version $Revision: 1.3 $ $Date: 2000/11/10 01:19:17 $
*/
public final class InvokerServlet
@@ -106,6 +108,13 @@
private int debug = 0;
+ /**
+ * The string manager for this package.
+ */
+ private static StringManager sm =
+ StringManager.getManager(Constants.Package);
+
+
// --------------------------------------------------------- Public Methods
@@ -217,21 +226,61 @@
HttpServletResponse response)
throws IOException, ServletException {
- // Identify the class name of the servlet we want
- if (debug >= 1)
- log("serveRequest: Serving request " + request.getMethod() +
- " " + request.getRequestURI());
- String pathInfo = request.getPathInfo();
- if (pathInfo == null) {
+ // Disallow calling this servlet via a named dispatcher
+ if (request.getAttribute(Globals.NAMED_DISPATCHER_ATTR) != null)
+ throw new ServletException
+ (sm.getString("invokerServlet.notNamed"));
+
+ // Identify the input parameters and our "included" state
+ String inRequestURI = null;
+ String inContextPath = null;
+ String inServletPath = null;
+ String inPathInfo = null;
+ String inQueryString = null;
+ boolean included =
+ (request.getAttribute(Globals.REQUEST_URI_ATTR) != null);
+ if (included) {
+ inRequestURI =
+ (String) request.getAttribute(Globals.REQUEST_URI_ATTR);
+ inContextPath =
+ (String) request.getAttribute(Globals.CONTEXT_PATH_ATTR);
+ inServletPath =
+ (String) request.getAttribute(Globals.SERVLET_PATH_ATTR);
+ inPathInfo =
+ (String) request.getAttribute(Globals.PATH_INFO_ATTR);
+ inQueryString =
+ (String) request.getAttribute(Globals.QUERY_STRING_ATTR);
+ } else {
+ inRequestURI = request.getRequestURI();
+ inContextPath = request.getContextPath();
+ inServletPath = request.getServletPath();
+ inPathInfo = request.getPathInfo();
+ inQueryString = request.getQueryString();
+ }
+ if (debug >= 1) {
+ log("serveRequest: included='" + included + "', requestURI='" +
+ inRequestURI + "', contextPath='" + inContextPath + "'");
+ log(" servletPath='" + inServletPath + "', pathInfo='" +
+ inPathInfo + "', queryString='" + inQueryString + "'");
+ }
+
+ // Make sure a servlet name or class name was specified
+ if (inPathInfo == null) {
if (debug >= 1)
- log("serveRequest: Invalid pathInfo '" + pathInfo + "'");
- response.sendError(HttpServletResponse.SC_NOT_FOUND,
- request.getRequestURI());
- return;
+ log("serveRequest: Invalid pathInfo '" + inPathInfo + "'");
+ if (included)
+ throw new ServletException
+ (sm.getString("invokerServlet.invalidPath", inRequestURI));
+ else {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND,
+ inRequestURI);
+ return;
+ }
}
- String servletClass = pathInfo.substring(1);
- // Identify the servlet name or class, and related information we will need
+ // Identify the outgoing servlet name or class, and outgoing path info
+ String pathInfo = inPathInfo;
+ String servletClass = pathInfo.substring(1);
int slash = servletClass.indexOf("/");
if (slash >= 0) {
pathInfo = servletClass.substring(slash);
@@ -239,8 +288,11 @@
} else {
pathInfo = "";
}
+ if (debug >= 1)
+ log("serveRequest: Processing servlet '" + servletClass +
+ "' with path info '" + pathInfo + "'");
String name = "org.apache.catalina.INVOKER." + servletClass;
- String pattern = request.getServletPath() + "/" + servletClass + "/*";
+ String pattern = inServletPath + "/" + servletClass + "/*";
Wrapper wrapper = null;
// Are we referencing an existing servlet name?
@@ -268,10 +320,16 @@
context.addChild(wrapper);
context.addServletMapping(pattern, name);
} catch (Throwable t) {
- log("serveRequest.create", t);
- response.sendError(HttpServletResponse.SC_NOT_FOUND,
- request.getRequestURI());
- return;
+ if (included)
+ throw new ServletException
+ (sm.getString("invokerServlet.cannotCreate",
+ inRequestURI), t);
+ else {
+ log("serveRequest.create", t);
+ response.sendError(HttpServletResponse.SC_NOT_FOUND,
+ inRequestURI);
+ return;
+ }
}
// Ensure that we can actually allocate and release an instance
@@ -279,33 +337,44 @@
Servlet instance = wrapper.allocate();
wrapper.deallocate(instance);
} catch (ServletException e) {
- log("serveRequest.test", e);
+ log("serveRequest.load", e);
+ context.removeServletMapping(pattern);
+ context.removeChild(wrapper);
Throwable rootCause = e.getRootCause();
+ if (rootCause == null)
+ rootCause = e;
+ if (included)
+ throw new ServletException
+ (sm.getString("invokerServlet.cannotLoad",
+ inRequestURI), rootCause);
if ((rootCause != null) &&
- (rootCause instanceof ClassNotFoundException))
+ (rootCause instanceof ClassNotFoundException)) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
- request.getRequestURI());
- else
+ inRequestURI);
+ } else {
response.sendError
(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
- request.getRequestURI());
- context.removeServletMapping(pattern);
- context.removeChild(wrapper);
+ inRequestURI);
+ }
return;
} catch (Throwable t) {
- log("serveRequest.test", t);
- response.sendError
- (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
- request.getRequestURI());
+ log("serveRequest.load", t);
context.removeServletMapping(pattern);
context.removeChild(wrapper);
+ if (included)
+ throw new ServletException
+ (sm.getString("invokerServlet.cannotLoad",
+ inRequestURI), t);
+ response.sendError
+ (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ inRequestURI);
return;
}
}
// Pass this request on to the identified or newly created wrapper
- StringBuffer sb = new StringBuffer(request.getServletPath());
+ StringBuffer sb = new StringBuffer(inServletPath);
sb.append("/");
sb.append(servletClass);
sb.append(pathInfo);
1.3 +3 -0 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/LocalStrings.properties,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- LocalStrings.properties 2000/10/05 02:30:22 1.2
+++ LocalStrings.properties 2000/11/10 01:19:17 1.3
@@ -2,6 +2,9 @@
defaultservlet.upto=Up to:
defaultservlet.subdirectories=Subdirectories:
defaultservlet.files=Files:
+invokerServlet.cannotCreate=Cannot create servlet wrapper for path {0}
+invokerServlet.invalidPath=No servlet name or class was specified in path {0}
+invokerServlet.notNamed=Cannot call invoker servlet with a named dispatcher
managerServlet.alreadyContext=FAIL - Application already exists at path {0}
managerServlet.cannotInvoke=Cannot invoke manager servlet through invoker
managerServlet.deployed=OK - Deployed application at context path {0}