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]