craigmcc 01/07/19 11:37:02 Modified: catalina/src/share/org/apache/catalina/core ApplicationDispatcher.java catalina/src/share/org/apache/catalina/servlets InvokerHttpRequest.java InvokerServlet.java Log: Correct an bad interaction between request dispatching and the invoker servlet that was introduced in recent changes. These changes were required by Servlet 2.3 PFD3 updates that disallowed the previous request dispatcher implementation technique of wrapping the outermost application request before calling the dispatched-to servlet. These changes also fix the JSP-Servlet-JSP example, which was broken by the earlier changes. PR: Bugzilla #2692 Submitted by: Remy Maucherat Revision Changes Path 1.22 +19 -5 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java Index: ApplicationDispatcher.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- ApplicationDispatcher.java 2001/07/17 04:21:12 1.21 +++ ApplicationDispatcher.java 2001/07/19 18:37:02 1.22 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java,v 1.21 2001/07/17 04:21:12 craigmcc Exp $ - * $Revision: 1.21 $ - * $Date: 2001/07/17 04:21:12 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java,v 1.22 2001/07/19 18:37:02 craigmcc Exp $ + * $Revision: 1.22 $ + * $Date: 2001/07/19 18:37:02 $ * * ==================================================================== * @@ -105,7 +105,7 @@ * <code>javax.servlet.ServletResponseWrapper</code>. * * @author Craig R. McClanahan - * @version $Revision: 1.21 $ $Date: 2001/07/17 04:21:12 $ + * @version $Revision: 1.22 $ $Date: 2001/07/19 18:37:02 $ */ final class ApplicationDispatcher @@ -420,6 +420,8 @@ } // Commit and close the response before we return + if (debug >= 1) + log(" Committing and closing response"); response.flushBuffer(); try { PrintWriter writer = response.getWriter(); @@ -609,7 +611,11 @@ // Allocate a servlet instance to process this request try { if (!unavailable) { + // if (debug >= 2) + // log(" Allocating servlet instance"); servlet = wrapper.allocate(); + // if ((debug >= 2) && (servlet == null)) + // log(" No servlet instance returned!"); } } catch (ServletException e) { log(sm.getString("applicationDispatcher.allocateException", @@ -633,6 +639,8 @@ else request.removeAttribute(Globals.JSP_FILE_ATTR); if (servlet != null) { + // if (debug >= 2) + // log(" Calling service(), jspFile=" + jspFile); if ((hrequest != null) && (hresponse != null)) { servlet.service((HttpServletRequest) request, (HttpServletResponse) response); @@ -666,8 +674,11 @@ // Deallocate the allocated servlet instance try { - if (servlet != null) + if (servlet != null) { + // if (debug >= 2) + // log(" Deallocating servlet instance"); wrapper.deallocate(servlet); + } } catch (ServletException e) { log(sm.getString("applicationDispatcher.deallocateException", wrapper.getName()), e); @@ -832,6 +843,9 @@ ServletRequest previous = null; ServletRequest current = outerRequest; while (current != null) { + if ("org.apache.catalina.servlets.InvokerHttpRequest". + equals(current.getClass().getName())) + break; // KLUDGE - Make nested RD.forward() using invoker work if (!(current instanceof ServletRequestWrapper)) break; if (current instanceof ApplicationHttpRequest) 1.2 +7 -68 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerHttpRequest.java Index: InvokerHttpRequest.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerHttpRequest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- InvokerHttpRequest.java 2001/07/17 00:14:16 1.1 +++ InvokerHttpRequest.java 2001/07/19 18:37:02 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerHttpRequest.java,v 1.1 2001/07/17 00:14:16 craigmcc Exp $ - * $Revision: 1.1 $ - * $Date: 2001/07/17 00:14:16 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerHttpRequest.java,v 1.2 2001/07/19 18:37:02 craigmcc Exp $ + * $Revision: 1.2 $ + * $Date: 2001/07/19 18:37:02 $ * * ==================================================================== * @@ -88,7 +88,7 @@ * to the servlet, because a new servlet mapping will have been created. * * @author Craig R. McClanahan - * @version $Revision: 1.1 $ $Date: 2001/07/17 00:14:16 $ + * @version $Revision: 1.2 $ $Date: 2001/07/19 18:37:02 $ */ class InvokerHttpRequest extends HttpServletRequestWrapper { @@ -105,9 +105,7 @@ public InvokerHttpRequest(HttpServletRequest request) { super(request); - this.contextPath = request.getContextPath(); this.pathInfo = request.getPathInfo(); - this.queryString = request.getQueryString(); this.requestURI = request.getRequestURI(); this.servletPath = request.getServletPath(); @@ -118,12 +116,6 @@ /** - * The context path for this request. - */ - protected String contextPath = null; - - - /** * Descriptive information about this implementation. */ protected static final String info = @@ -137,12 +129,6 @@ /** - * The query string for this request. - */ - protected String queryString = null; - - - /** * The request URI for this request. */ protected String requestURI = null; @@ -165,17 +151,6 @@ /** - * Override the <code>getContextPath()</code> method of the wrapped - * request. - */ - public String getContextPath() { - - return (this.contextPath); - - } - - - /** * Override the <code>getPathInfo()</code> method of the wrapped request. */ public String getPathInfo() { @@ -186,23 +161,11 @@ /** - * Override the <code>getQueryString()</code> method of the wrapped - * request. + * Override the <code>getRequestURI()</code> method of the wrapped request. */ - public String getQueryString() { - - return (this.queryString); - - } - - - /** - * Override the <code>getRequestURI()</code> method of the wrapped - * request. - */ public String getRequestURI() { - return (this.requestURI); + return (this.requestURI); } @@ -233,18 +196,6 @@ /** - * Set the context path for this request. - * - * @param contextPath The new context path - */ - void setContextPath(String contextPath) { - - this.contextPath = contextPath; - - } - - - /** * Set the path information for this request. * * @param pathInfo The new path info @@ -257,25 +208,13 @@ /** - * Set the query string for this request. - * - * @param queryString The new query string - */ - void setQueryString(String queryString) { - - this.queryString = queryString; - - } - - - /** * Set the request URI for this request. * * @param requestURI The new request URI */ void setRequestURI(String requestURI) { - this.requestURI = requestURI; + this.requestURI = requestURI; } 1.8 +41 -21 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- InvokerServlet.java 2001/07/17 04:21:13 1.7 +++ InvokerServlet.java 2001/07/19 18:37:02 1.8 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java,v 1.7 2001/07/17 04:21:13 craigmcc Exp $ - * $Revision: 1.7 $ - * $Date: 2001/07/17 04:21:13 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/InvokerServlet.java,v 1.8 2001/07/19 18:37:02 craigmcc Exp $ + * $Revision: 1.8 $ + * $Date: 2001/07/19 18:37:02 $ * * ==================================================================== * @@ -72,6 +72,7 @@ import javax.servlet.UnavailableException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.ContainerServlet; import org.apache.catalina.Context; @@ -86,7 +87,7 @@ * in the web application deployment descriptor. * * @author Craig R. McClanahan - * @version $Revision: 1.7 $ $Date: 2001/07/17 04:21:13 $ + * @version $Revision: 1.8 $ $Date: 2001/07/19 18:37:02 $ */ public final class InvokerServlet @@ -268,41 +269,33 @@ // 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("included='" + included + "', requestURI='" + + inRequestURI + "'"); log(" servletPath='" + inServletPath + "', pathInfo='" + - inPathInfo + "', queryString='" + inQueryString + "'"); + inPathInfo + "'"); } // Make sure a servlet name or class name was specified if (inPathInfo == null) { if (debug >= 1) - log("serveRequest: Invalid pathInfo '" + inPathInfo + "'"); + log("Invalid pathInfo '" + inPathInfo + "'"); if (included) throw new ServletException (sm.getString("invokerServlet.invalidPath", inRequestURI)); @@ -317,6 +310,9 @@ String pathInfo = inPathInfo; String servletClass = pathInfo.substring(1); int slash = servletClass.indexOf('/'); + // if (debug >= 2) + // log(" Calculating with servletClass='" + servletClass + + // "', pathInfo='" + pathInfo + "', slash=" + slash); if (slash >= 0) { pathInfo = servletClass.substring(slash); servletClass = servletClass.substring(0, slash); @@ -324,7 +320,7 @@ pathInfo = ""; } if (debug >= 1) - log("serveRequest: Processing servlet '" + servletClass + + log("Processing servlet '" + servletClass + "' with path info '" + pathInfo + "'"); String name = "org.apache.catalina.INVOKER." + servletClass; String pattern = inServletPath + "/" + servletClass + "/*"; @@ -334,7 +330,7 @@ wrapper = (Wrapper) context.findChild(servletClass); if (wrapper != null) { if (debug >= 1) - log("serveRequest: Using wrapper for servlet '" + + log("Using wrapper for servlet '" + wrapper.getName() + "' with mapping '" + pattern + "'"); context.addServletMapping(pattern, wrapper.getName()); } @@ -343,7 +339,7 @@ else { if (debug >= 1) - log("serveRequest: Creating wrapper for '" + servletClass + + log("Creating wrapper for '" + servletClass + "' with mapping '" + pattern + "'"); // Create and install a new wrapper @@ -355,12 +351,13 @@ context.addChild(wrapper); context.addServletMapping(pattern, name); } catch (Throwable t) { + log(sm.getString("invokerServlet.cannotCreate", + inRequestURI), t); if (included) throw new ServletException (sm.getString("invokerServlet.cannotCreate", inRequestURI), t); else { - log("serveRequest.create", t); response.sendError(HttpServletResponse.SC_NOT_FOUND, inRequestURI); return; @@ -372,6 +369,7 @@ // Create a request wrapper to pass on to the invoked servlet InvokerHttpRequest wrequest = new InvokerHttpRequest(request); + wrequest.setRequestURI(inRequestURI); StringBuffer sb = new StringBuffer(inServletPath); sb.append("/"); sb.append(servletClass); @@ -380,11 +378,12 @@ wrequest.setPathInfo(null); else wrequest.setPathInfo(pathInfo); - wrequest.setQueryString(request.getQueryString()); // Allocate a servlet instance to perform this request Servlet instance = null; try { + // if (debug >= 2) + // log(" Allocating servlet instance"); instance = wrapper.allocate(); } catch (ServletException e) { log(sm.getString("invokerServlet.allocate", inRequestURI), e); @@ -423,9 +422,14 @@ request.setAttribute(Globals.JSP_FILE_ATTR, jspFile); else request.removeAttribute(Globals.JSP_FILE_ATTR); + // if (debug >= 2) + // log(" Calling service() method, jspFile=" + + // jspFile); instance.service(wrequest, response); request.removeAttribute(Globals.JSP_FILE_ATTR); } catch (IOException e) { + // if (debug >= 2) + // log(" service() method IOException", e); request.removeAttribute(Globals.JSP_FILE_ATTR); try { wrapper.deallocate(instance); @@ -434,6 +438,8 @@ } throw e; } catch (ServletException e) { + // if (debug >= 2) + // log(" service() method ServletException", e); request.removeAttribute(Globals.JSP_FILE_ATTR); try { wrapper.deallocate(instance); @@ -442,6 +448,8 @@ } throw e; } catch (RuntimeException e) { + // if (debug >= 2) + // log(" service() method RuntimeException", e); request.removeAttribute(Globals.JSP_FILE_ATTR); try { wrapper.deallocate(instance); @@ -449,10 +457,22 @@ ; } throw e; + } catch (Throwable e) { + // if (debug >= 2) + // log(" service() method Throwable", e); + request.removeAttribute(Globals.JSP_FILE_ATTR); + try { + wrapper.deallocate(instance); + } catch (Throwable f) { + ; + } + throw new ServletException("Invoker service() exception", e); } // Deallocate the allocated servlet instance try { + // if (debug >= 2) + // log(" deallocate servlet instance"); wrapper.deallocate(instance); } catch (ServletException e) { log(sm.getString("invokerServlet.deallocate", inRequestURI), e);