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]

Reply via email to