Currently under Tomcat 4.1.12 SSI "normal" configuration which invokes a CGI script does not work. The reason for this is pretty obvious: The SSI servelet uses the pathInfo (PATH_INFO) value and calls the request dispatcher for any resources needed. The request dispatcher eats the pathInfo value and the CGI servlet can't find the CGI program, because it relies on pathInfo to tell it where the script is.
I made minor changes to three files in the current 4.1.12 distro to solve this problem. The strategy is thus: SSI-invoked resources flag the request with an attibute. When CGI servlet finally gets the request dispached, he checks whether SSI servlet invoked the resource via said attribute. If this is the case, he ignores the request.getPathInfo() method in favor of an already-present attribute on the request which already has the PATH_INFO environment value in it. Voila, everything works now. Diffs attached. Nick Bauman Software Engineer Cortexity Development 3600 N. Dupont Minneapolis, MN 55412 M: 612-232-7120
diff -uNr jakarta-tomcat-4.1.12-orig/catalina/src/share/org/apache/catalina/Globals.java jakarta-tomcat-4.1.12-src/catalina/src/share/org/apache/catalina/Globals.java --- jakarta-tomcat-4.1.12-orig/catalina/src/share/org/apache/catalina/Globals.java 2002-09-23 03:24:20.000000000 -0600 +++ jakarta-tomcat-4.1.12-src/catalina/src/share/org/apache/catalina/Globals.java 2002-12-03 20:48:00.000000000 -0600 @@ -290,5 +290,13 @@ public static final String WORK_DIR_ATTR = "javax.servlet.context.tempdir"; - + /** + * The servlet context attribute under which we store a flag used + * to mark this request as having been processed by the SSIServlet. + * We do this because of the pathInfo mangling happening when using + * the CGIServlet in conjunction with the SSI servlet. (value stored + * as an object of type String) + */ + public static final String SSI_FLAG_ATTR = + "org.apache.catalina.ssi.SSIServlet"; } diff -uNr jakarta-tomcat-4.1.12-orig/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java jakarta-tomcat-4.1.12-src/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java --- jakarta-tomcat-4.1.12-orig/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java 2002-09-23 03:24:18.000000000 -0600 +++ jakarta-tomcat-4.1.12-src/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java 2002-12-03 20:54:32.000000000 -0600 @@ -966,8 +966,12 @@ String sCGIName = null; String[] sCGINames; - - sPathInfoOrig = this.pathInfo; + if(null != req.getAttribute(Globals.SSI_FLAG_ATTR)) { + // invoked by SSIServlet, which eats our req.getPathInfo() data + sPathInfoOrig = (String) req.getAttribute(Globals.PATH_INFO_ATTR); + } else { + sPathInfoOrig = this.pathInfo; + } sPathInfoOrig = sPathInfoOrig == null ? "" : sPathInfoOrig; sPathTranslatedOrig = req.getPathTranslated(); diff -uNr jakarta-tomcat-4.1.12-orig/catalina/src/share/org/apache/catalina/ssi/SSIServlet.java jakarta-tomcat-4.1.12-src/catalina/src/share/org/apache/catalina/ssi/SSIServlet.java --- jakarta-tomcat-4.1.12-orig/catalina/src/share/org/apache/catalina/ssi/SSIServlet.java 2002-09-23 03:24:18.000000000 -0600 +++ jakarta-tomcat-4.1.12-src/catalina/src/share/org/apache/catalina/ssi/SSIServlet.java 2002-12-03 19:44:06.000000000 -0600 @@ -64,38 +64,24 @@ package org.apache.catalina.ssi; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; import java.io.PrintWriter; -import java.io.Reader; import java.io.StringWriter; -import java.io.Writer; import java.net.URL; import java.net.URLConnection; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.Collection; import java.util.Date; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Locale; -import java.text.SimpleDateFormat; -import java.util.StringTokenizer; -import java.util.TimeZone; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; + import javax.servlet.ServletContext; -import javax.servlet.ServletOutputStream; +import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.catalina.Globals; + /** * Servlet to process SSI requests within a webpage. * Mapped to a path from within web.xml. @@ -234,7 +220,7 @@ res.setDateHeader("Expires", ( new java.util.Date()).getTime() + expires.longValue() * 1000); } - + req.setAttribute(Globals.SSI_FLAG_ATTR,"true"); processSSI( req, res, resource ); }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>