Brian, There were two problems.
The first, and the simplest, is that the CGI servlet always looks for HTTP headers at the start of the script output. Therefore, you need to output 2 blank lines at the start of your script so the CGI servlet doesn't try to read the whole output as headers. The second was that the CGI servlet wasn't aware that it might be being called via an include. Hence it was looking for various bits of data on the original (non-CGI) request that just weren't there. I have patched the CGI servlet and made a new jar available at http://www.apache.org/~markt/servlets-cgi.jar. It works for me but I would be grateful if you could test it as well. All you need to do is replace the file in CATALINA_HOME/server/lib with this one. It is built for 5.5.x but there is a good chance it will work with 4.1.x as well (I haven't tested it on 4.1.x). If this works for you, I will apply the patch to 5.5.x and port the changes back to 4.1.x as well. Mark > -----Original Message----- > From: Brian Hill [mailto:[EMAIL PROTECTED] > Sent: Friday, December 10, 2004 7:41 PM > To: [EMAIL PROTECTED] > Cc: Tony Choi; Brian Hill > Subject: ssi including a cgi with query args is broken --- > same combo works under Apache > > Our site uses an SSI directive to include a cgi script. This works > under Apache but fails under Tomcat because the query > arguments are not > being handled the same way. Under Tomcat 5.5.4, they are > being searched > for as part of the filename. (The failure mode was different under > Tomcat 4.0. Under 4.0, the query args got stripped off, but not put > into the cgi script's environment.) > > Thanks for looking into this, and if for some reason you > don't think it > is worth fixing, any suggestions on a workaround. > > Also, I would be happy to test a patch class (I'd need directions for > where to put the patch class and how to configure the class loader to > find it). > > More details are below. --Brian > > brianhill > at > speakeasy > dot > net > > In this log/backtrace, you can see that the CGI jar is trying to find > the file: > > navTool.pl?REF+GENERAL+WHATIS > > This file doesn't exist. On our systems, navTool.pl exists and is in > WEB-INF/cgi/, and is expecting some query args. > > Dec 9, 2004 3:46:04 PM org.apache.catalina.core.ApplicationContext log > INFO: cgi: findCGI: path=/Docs/ref_general1.html, > /Library/Tomcat/webapps/PCW/WEB-INF/cgi > Dec 9, 2004 3:46:04 PM org.apache.catalina.core.ApplicationContext log > INFO: cgi: findCGI: currentLoc=/Library/Tomcat/webapps/PCW/WEB-INF/cgi > Dec 9, 2004 3:46:04 PM org.apache.catalina.core.ApplicationContext log > INFO: cgi: findCGI: currentLoc=/Library/Tomcat/webapps/PCW/WEB-INF/cgi > Dec 9, 2004 3:46:04 PM org.apache.catalina.core.ApplicationContext log > INFO: cgi: findCGI: > currentLoc=/Library/Tomcat/webapps/PCW/WEB-INF/cgi/Docs > Dec 9, 2004 3:46:04 PM org.apache.catalina.core.ApplicationContext log > SEVERE: ssi: #include--Couldn't include file: > /cgi-bin/navTool.pl?REF+GENERAL+WHATIS > java.io.IOException: Couldn't find file: > /cgi-bin/navTool.pl?REF+GENERAL+WHATIS > at > org.apache.catalina.ssi.SSIServletExternalResolver.getFileText > (SSIServletExternalResolver.java:391) > > at > org.apache.catalina.ssi.SSIMediator.getFileText(SSIMediator.java:154) > at > org.apache.catalina.ssi.SSIInclude.process(SSIInclude.java:40) > at > org.apache.catalina.ssi.SSIProcessor.process(SSIProcessor.java:145) > at > org.apache.catalina.ssi.SSIServlet.processSSI(SSIServlet.java:193) > at > org.apache.catalina.ssi.SSIServlet.requestHandler(SSIServlet.java:170) > at > org.apache.catalina.ssi.SSIServlet.doGet(SSIServlet.java:106) > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:689) > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:802) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilt > er(ApplicationFilterChain.java:237) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(Appli > cationFilterChain.java:157) > > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardW > rapperValve.java:214) > > at > org.apache.catalina.core.StandardContextValve.invoke(StandardC > ontextValve.java:178) > > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHost > Valve.java:126) > > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReport > Valve.java:105) > > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEn > gineValve.java:107) > > at > org.apache.catalina.valves.RequestDumperValve.invoke(RequestDu > mperValve.java:150) > > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdap > ter.java:148) > at > org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300) > at > org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:383) > at > org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743) > at > org.apache.jk.common.ChannelSocket.processConnection(ChannelSo > cket.java:675) > > at > org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) > at > org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run( > ThreadPool.java:684) > > at java.lang.Thread.run(Thread.java:552) > > To reproduce this problem, all you need is a web app with a > .shtml file > containing the line > > <!-- #include virtual="/cgi-bin/echoargs.pl?some_args" --> > > and a perl script WEB-INF/cgi/echoargs.pl containing the lines: > > #!/usr/bin/perl -w > my $query_args = $ENV{QUERY_STRING}; > if (defined($query_args)) { > print "query string is<br>\n"; > print "$query_args<br>\n"; > } else { > print "query string is undefined<br>\n"; > } > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]