amyroh      2002/09/05 15:28:16

  Modified:    catalina/src/share/org/apache/catalina/servlets
                        CGIServlet.java
  Log:
  Port CGI changes to Tomcat 5.
  
  Revision  Changes    Path
  1.3       +104 -92   
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java
  
  Index: CGIServlet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CGIServlet.java   26 Aug 2002 23:01:31 -0000      1.2
  +++ CGIServlet.java   5 Sep 2002 22:28:15 -0000       1.3
  @@ -686,7 +686,6 @@
       /** For future testing use only; does nothing right now */
       public static void main(String[] args) {
           System.out.println("$Header$");
  -
       }
   
   
  @@ -1508,11 +1507,10 @@
            * </UL>
            * </p>
            *
  -         * For more information, see java.lang.Runtime#exec(String command,
  -         * String[] envp, File dir)
  -         *
            * @exception IOException if problems during reading/writing occur
            *
  +         * @see    java.lang.Runtime#exec(String command, String[] envp,
  +         *                                File dir)
            */
           protected void run() throws IOException {
   
  @@ -1548,8 +1546,6 @@
               BufferedReader commandsStdErr = null;
               BufferedOutputStream commandsStdIn = null;
               Process proc = null;
  -            byte[] bBuf = new byte[1024];
  -            char[] cBuf = new char[1024];
               int bufRead = -1;
   
               //create query arguments
  @@ -1577,8 +1573,8 @@
                   env.put("CONTENT_LENGTH", new Integer(contentLength));
               }*/
   
  -        StringBuffer perlCommand = new StringBuffer("perl ");
           if (command.endsWith(".pl") || command.endsWith(".cgi")) {
  +            StringBuffer perlCommand = new StringBuffer("perl ");
               perlCommand.append(cmdAndArgs.toString());
               cmdAndArgs = perlCommand;
           }
  @@ -1625,7 +1621,7 @@
                           log("runCGI stdin IS available ["
                               + stdin.available() + "]");
                       }
  -                    bBuf = new byte[1024];
  +                    byte[] bBuf = new byte[1024];
                       bufRead = -1;
                       try {
                           while ((bufRead = stdin.read(bBuf)) != -1) {
  @@ -1652,8 +1648,33 @@
         if(!"".equals(sContentLength)) {
             commandsStdIn = new BufferedOutputStream(proc.getOutputStream());
             byte[] content = new byte[Integer.parseInt(sContentLength)];
  -          stdin.read(content);
  -          commandsStdIn.write(content);
  +
  +          int lenRead = stdin.read(content);
  +
  +          if ("POST".equals(env.get("REQUEST_METHOD"))) {
  +              String paramStr = getPostInput(params);
  +              if (paramStr != null) {
  +                  byte[] paramBytes = paramStr.getBytes();
  +                  commandsStdIn.write(paramBytes);
  +
  +                  int contentLength = paramBytes.length;
  +                  if (lenRead > 0) {
  +                      String lineSep = System.getProperty("line.separator");
  +
  +                      commandsStdIn.write(lineSep.getBytes());
  +
  +                      contentLength = lineSep.length() + lenRead;
  +                  }
  +
  +                  env.put("CONTENT_LENGTH", new Integer(contentLength));
  +              }
  +          }
  +
  +          if (lenRead > 0) {
  +              commandsStdIn.write(content, 0, lenRead);
  +          }
  +
  +
             commandsStdIn.flush();
             commandsStdIn.close();
         }
  @@ -1664,6 +1685,7 @@
                *                               bugParade/bugs/4223650.html
                */
   
  +            boolean isRunning = true;
               commandsStdOut = new BufferedReader
                   (new InputStreamReader(proc.getInputStream()));
               commandsStdErr = new BufferedReader
  @@ -1679,99 +1701,89 @@
               } catch (IOException ignored) {
                   //NOOP: no output will be written
               }
  +            final BufferedReader stdErrRdr = commandsStdErr ;
   
  -            boolean inHeader = true;
  -            int pauseCount = 0;
  +            new Thread() {
  +                public void run () {
  +                    sendToLog(stdErrRdr) ;
  +                } ;
  +            }.start() ;
   
  -            boolean isRunning = true;
   
               while (isRunning) {
   
  -                if (commandsStdErr != null && commandsStdErr.ready()) {
  -                    // about to read something; reset pause count
  -                    pauseCount = 0;
  -
  -                    bufRead = commandsStdErr.read(cBuf);
  -                    if (bufRead == -1) {
  -                        commandsStdErr.close();
  -                        commandsStdErr = null;
  -                        isRunning = (commandsStdOut != null);
  -                    } else {
  -                        if (servletContainerStdout != null) {
  -                            if (inHeader) {
  -                                servletContainerStdout.write(cBuf, 0, bufRead);
  -                            } else {
  -                                log("runCGI: Throwing away StdErr \"" +
  -                                    new String(cBuf, 0, bufRead) + "\"");
  -                            }
  +                try {
  +
  +                    //set headers
  +                    String line = null;
  +                    while (((line = commandsStdOut.readLine()) != null)
  +                           && !("".equals(line))) {
  +                        if (debug >= 2) {
  +                            log("runCGI: addHeader(\"" + line + "\")");
                           }
  -                    }
  -                } else if (commandsStdOut != null && commandsStdOut.ready()) {
  -                    // about to read something; reset pause count
  -                    pauseCount = 0;
  -
  -                    if (inHeader) {
  -                        //set headers
  -                        String line = commandsStdOut.readLine();
  -                        if (line == null || "".equals(line)) {
  -                            inHeader = false;
  +                        if (line.startsWith("HTTP")) {
  +                            //TODO: should set status codes (NPH support)
  +                            /*
  +                             * response.setStatus(getStatusCode(line));
  +                             */
  +                        } else if (line.indexOf(":") >= 0) {
  +                            response.addHeader
  +                                (line.substring(0, line.indexOf(":")).trim(),
  +                                line.substring(line.indexOf(":") + 1).trim());
                           } else {
  -                            if (debug >= 2) {
  -                                log("runCGI: addHeader(\"" + line + "\")");
  -                            }
  -                            if (line.startsWith("HTTP")) {
  -                                //TODO: should set status codes (NPH support)
  -                                /*
  -                                 * response.setStatus(getStatusCode(line));
  -                                 */
  -                            } else if (line.indexOf(":") >= 0) {
  -                                response.addHeader
  -                                    (line.substring(0, line.indexOf(":")).trim(),
  -                                     line.substring(line.indexOf(":") + 1).trim());
  -                            } else {
  -                                log("runCGI: bogus header line \"" + line + "\"");
  -                            }
  +                            log("runCGI: bad header line \"" + line + "\"");
                           }
  +                    }
   
  -                    } else {
  -                        //write output
  -                        bufRead = commandsStdOut.read(cBuf);
  -                        if (bufRead == -1) {
  -                            commandsStdOut.close();
  -                            commandsStdOut = null;
  -                            isRunning = (commandsStdErr != null);
  -                        } else {
  -                            if (servletContainerStdout != null) {
  -                                if (debug >= 4) {
  -                                    log("runCGI: write(\"" + new String(cBuf, 0, 
bufRead) + "\")");
  -                                }
  -                                servletContainerStdout.write(cBuf, 0, bufRead);
  +                    //write output
  +                    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);
                           }
                       }
   
  -                } else {
  -                    try {
  -                        int exitVal = proc.exitValue();
  -                        pauseCount++;
  -                        if (pauseCount > 2) {
  -                            isRunning = false;
  -                        } else {
  -                            // pause for half a second
  -                            try {
  -                                Thread.sleep(500);
  -                            } catch (InterruptedException ie) {
  -                            }
  -                        }
  -                    } catch (IllegalThreadStateException ex) {
  +                    if (servletContainerStdout != null) {
  +                        servletContainerStdout.flush();
                       }
  -                }
   
  -                if (servletContainerStdout != null) {
  -                    servletContainerStdout.flush();
  +                    proc.exitValue(); // Throws exception if alive
  +
  +                    isRunning = false;
  +
  +                } catch (IllegalThreadStateException e) {
  +                    try {
  +                        Thread.currentThread().sleep(500);
  +                    } catch (InterruptedException ignored) {
  +                    }
                   }
               } //replacement for Process.waitFor()
  +            commandsStdOut.close()  ;
  +        }
   
  +        private void sendToLog(BufferedReader rdr) {
  +            String line = null;
  +            int lineCount = 0 ;
  +            try {
  +                while ((line = rdr.readLine()) != null) {
  +                    log("runCGI (stderr):" +  line) ;
  +                }
  +                lineCount++ ;
  +            } catch (IOException e) {
  +                log("sendToLog error", e) ;
  +            } finally {
  +                try {
  +                    rdr.close() ;
  +                } catch (IOException ce) {
  +                    log("sendToLog error", ce) ;
  +                } ;
  +            } ;
  +            if ( lineCount > 0 && debug > 2) {
  +                log("runCGI: " + lineCount + " lines received on stderr") ;
  +            } ;
           }
   
   
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to