markt 2005/04/10 11:22:56 Modified: catalina/src/share/org/apache/catalina/core ApplicationDispatcher.java ApplicationHttpRequest.java Log: Fix bug 22013. RequestDispatcher.forward doesn't work with a relative path on a forwarded request - Patch supplied by Cedric Benazech Revision Changes Path 1.33 +3 -2 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.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- ApplicationDispatcher.java 26 Aug 2004 21:31:21 -0000 1.32 +++ ApplicationDispatcher.java 10 Apr 2005 18:22:56 -0000 1.33 @@ -861,7 +861,8 @@ if ((current instanceof ApplicationHttpRequest) || (current instanceof HttpRequest) || (current instanceof HttpServletRequest)) - wrapper = new ApplicationHttpRequest((HttpServletRequest) current); + wrapper = new ApplicationHttpRequest( + (HttpServletRequest) current, context); else wrapper = new ApplicationRequest(current); if (previous == null) 1.16 +51 -8 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationHttpRequest.java Index: ApplicationHttpRequest.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationHttpRequest.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- ApplicationHttpRequest.java 15 Jan 2005 20:27:05 -0000 1.15 +++ ApplicationHttpRequest.java 10 Apr 2005 18:22:56 -0000 1.16 @@ -23,8 +23,12 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; + +import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; + +import org.apache.catalina.Context; import org.apache.catalina.Globals; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.RequestUtil; @@ -49,7 +53,6 @@ class ApplicationHttpRequest extends HttpServletRequestWrapper { - // ------------------------------------------------------- Static Variables @@ -62,24 +65,28 @@ Globals.QUERY_STRING_ATTR }; - // ----------------------------------------------------------- Constructors + // ----------------------------------------------------------- Constructors /** - * Construct a new wrapped request around the specified servlet request. + * Construct a new wrapped request around the specified servlet request in + * the specified context. * * @param request The servlet request being wrapped + * @param context The Context this ApplicationHttpRequest is associated with */ - public ApplicationHttpRequest(HttpServletRequest request) { - + public ApplicationHttpRequest(HttpServletRequest request, Context context) { super(request); setRequest(request); - + this.context = context; } - // ----------------------------------------------------- Instance Variables + /** + * The Context this ApplicationHttpRequest is associated with. + */ + protected Context context; /** * The request attributes for this request. This is initialized from the @@ -377,6 +384,42 @@ /** + * Return a RequestDispatcher that wraps the resource at the specified + * path, which may be interpreted as relative to the current request path. + * + * @param path Path of the resource to be wrapped + */ + public RequestDispatcher getRequestDispatcher(String path) { + + if (context == null) + return (null); + + // If the path is already context-relative, just pass it through + if (path == null) + return (null); + else if (path.startsWith("/")) + return (context.getServletContext().getRequestDispatcher(path)); + + // Convert a request-relative path to a context-relative one + String servletPath = (String) getAttribute(Globals.SERVLET_PATH_ATTR); + if (servletPath == null) + servletPath = getServletPath(); + + int pos = servletPath.lastIndexOf('/'); + String relative = null; + if (pos >= 0) { + relative = RequestUtil.normalize + (servletPath.substring(0, pos + 1) + path); + } else { + relative = RequestUtil.normalize(servletPath + path); + } + + return (context.getServletContext().getRequestDispatcher(relative)); + + } + + + /** * Perform a shallow copy of the specified Map, and return the result. * * @param orig Origin Map to be copied
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]