Author: markt Date: Mon Mar 6 14:30:18 2006 New Revision: 383695 URL: http://svn.apache.org/viewcvs?rev=383695&view=rev Log: Port fix for bug 38814 and Remy's patch to prevent the external process hanging.
Modified: tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java Modified: tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java?rev=383695&r1=383694&r2=383695&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java (original) +++ tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java Mon Mar 6 14:30:18 2006 @@ -20,12 +20,10 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; -import java.io.BufferedWriter; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.io.BufferedOutputStream; import java.io.IOException; import java.net.URLEncoder; @@ -1633,7 +1631,6 @@ * with major modifications by Martin Dengler */ Runtime rt = null; - BufferedReader commandsStdOut = null; InputStream cgiOutput = null; BufferedReader commandsStdErr = null; BufferedOutputStream commandsStdIn = null; @@ -1732,17 +1729,6 @@ boolean isRunning = true; commandsStdErr = new BufferedReader (new InputStreamReader(proc.getErrorStream())); - BufferedWriter servletContainerStdout = null; - - try { - if (response.getOutputStream() != null) { - servletContainerStdout = - new BufferedWriter(new OutputStreamWriter - (response.getOutputStream())); - } - } catch (IOException ignored) { - //NOOP: no output will be written - } final BufferedReader stdErrRdr = commandsStdErr ; new Thread() { @@ -1755,7 +1741,6 @@ new HTTPHeaderInputStream(proc.getInputStream()); BufferedReader cgiHeaderReader = new BufferedReader(new InputStreamReader(cgiHeaderStream)); - boolean isBinaryContent = false; while (isRunning) { try { @@ -1778,20 +1763,17 @@ } else { response.addHeader(header , value); } - if ((header.toLowerCase().equals("content-type")) - && (!value.toLowerCase().startsWith("text"))) { - isBinaryContent = true; - } } else { log("runCGI: bad header line \"" + line + "\""); } } //write output - if (isBinaryContent) { - byte[] bBuf = new byte[2048]; - OutputStream out = response.getOutputStream(); - cgiOutput = proc.getInputStream(); + byte[] bBuf = new byte[2048]; + + OutputStream out = response.getOutputStream(); + cgiOutput = proc.getInputStream(); + try { while ((bufRead = cgiOutput.read(bBuf)) != -1) { if (debug >= 4) { log("runCGI: output " + bufRead + @@ -1799,23 +1781,12 @@ } out.write(bBuf, 0, bufRead); } - } else { - commandsStdOut = new BufferedReader - (new InputStreamReader(proc.getInputStream())); - - char[] cBuf = new char[1024]; - while ((bufRead = commandsStdOut.read(cBuf)) != -1) { - if (servletContainerStdout != null) { - if (debug >= 4) { - log("runCGI: write(\"" + - new String(cBuf, 0, bufRead) + "\")"); - } - servletContainerStdout.write(cBuf, 0, bufRead); - } - } - - if (servletContainerStdout != null) { - servletContainerStdout.flush(); + } finally { + // Attempt to consume any leftover byte if something bad happens, + // such as a socket disconnect on the servlet side; otherwise, the + // external process could hang + if (bufRead != -1) { + while ((bufRead = cgiOutput.read(bBuf)) != -1) {} } } @@ -1831,11 +1802,7 @@ } } //replacement for Process.waitFor() // Close the output stream used - if (isBinaryContent) { - cgiOutput.close(); - } else { - commandsStdOut.close(); - } + cgiOutput.close(); } /** --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]