markt       2004/04/17 16:28:23

  Modified:    catalina/src/share/org/apache/catalina/servlets
                        CGIServlet.java
  Log:
  Fix bug 19545. CGI issues with CONTENT_LENGTH namely:
  - CONTENT_LENGTH was recalculated after script had been executed and hence had no 
effect
  - Parameters were being sent to the script twice
  Patch supplied by [EMAIL PROTECTED] (with some minor mods)
  Ported from TC4
  
  Revision  Changes    Path
  1.18      +43 -123   
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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- CGIServlet.java   27 Feb 2004 14:58:46 -0000      1.17
  +++ CGIServlet.java   17 Apr 2004 23:28:23 -0000      1.18
  @@ -20,6 +20,7 @@
   import java.io.BufferedOutputStream;
   import java.io.BufferedReader;
   import java.io.BufferedWriter;
  +import java.io.ByteArrayOutputStream;
   import java.io.File;
   import java.io.FileOutputStream;
   import java.io.IOException;
  @@ -1633,119 +1634,49 @@
                   }
               }
   
  -            /*String postIn = getPostInput(params);
  -            int contentLength = (postIn.length()
  -                    + System.getProperty("line.separator").length());
  -            if ("POST".equals(env.get("REQUEST_METHOD"))) {
  -                env.put("CONTENT_LENGTH", new Integer(contentLength));
  -            }*/
  -
  -        //if (command.endsWith(".pl") || command.endsWith(".cgi")) {
               StringBuffer command = new StringBuffer(cgiExecutable);
               command.append(" ");
               command.append(cmdAndArgs.toString());
               cmdAndArgs = command;
  -        //}
   
  -            rt = Runtime.getRuntime();
  -            proc = rt.exec(cmdAndArgs.toString(), hashToStringArray(env), wd);
  -
  -            /*
  -             * provide input to cgi
  -             * First  -- parameters
  -             * Second -- any remaining input
  -             */
  -            /*commandsStdIn = new BufferedOutputStream(proc.getOutputStream());
  -            if (debug >= 2 ) {
  -                log("runCGI stdin=[" + stdin + "], qs="
  -                    + env.get("QUERY_STRING"));
  -            }
  -            if ("POST".equals(env.get("REQUEST_METHOD"))) {
  -                if (debug >= 2) {
  -                    log("runCGI: writing ---------------\n");
  -                    log(postIn);
  -                    log("runCGI: new content_length=" + contentLength
  -                        + "---------------\n");
  -                }
  -                commandsStdIn.write(postIn.getBytes());
  -            }
  -            if (stdin != null) {
  -                //REMIND: document this
  -                /* assume if nothing is available after a time, that nothing is
  -                 * coming...
  -                 */
  -                /*if (stdin.available() <= 0) {
  -                    if (debug >= 2 ) {
  -                        log("runCGI stdin is NOT available ["
  -                            + stdin.available() + "]");
  -                    }
  -                    try {
  -                        Thread.currentThread().sleep(iClientInputTimeout);
  -                    } catch (InterruptedException ignored) {
  -                    }
  -                }
  -                if (stdin.available() > 0) {
  -                    if (debug >= 2 ) {
  -                        log("runCGI stdin IS available ["
  -                            + stdin.available() + "]");
  -                    }
  -                    byte[] bBuf = new byte[1024];
  -                    bufRead = -1;
  -                    try {
  -                        while ((bufRead = stdin.read(bBuf)) != -1) {
  -                            if (debug >= 2 ) {
  -                                log("runCGI: read [" + bufRead
  -                                    + "] bytes from stdin");
  -                            }
  -                            commandsStdIn.write(bBuf, 0, bufRead);
  -                        }
  -                        if (debug >= 2 ) {
  -                            log("runCGI: DONE READING from stdin");
  +            String sContentLength = (String) env.get("CONTENT_LENGTH");
  +            ByteArrayOutputStream contentStream = null;
  +            if(!"".equals(sContentLength)) {
  +                byte[] content = new byte[Integer.parseInt(sContentLength)];
  +                int lenRead = stdin.read(content);
  +                contentStream = new ByteArrayOutputStream(
  +                        Integer.parseInt(sContentLength));
  +                if ("POST".equals(env.get("REQUEST_METHOD"))) {
  +                    String paramStr = getPostInput(params);
  +                    if (paramStr != null) {
  +                        byte[] paramBytes = paramStr.getBytes();
  +                        contentStream.write(paramBytes);
  +
  +                        int contentLength = paramBytes.length;
  +                        if (lenRead > 0) {
  +                            String lineSep = System.getProperty("line.separator");
  +                            contentStream.write(lineSep.getBytes());
  +                            contentLength = lineSep.length() + lenRead;
                           }
  -                    } catch (IOException ioe) {
  -                        //REMIND: replace with logging
  -                        //REMIND: should I throw this exception?
  -                        log("runCGI: couldn't write all bytes.");
  -                        ioe.printStackTrace();
  +                        env.put("CONTENT_LENGTH", new Integer(contentLength));
                       }
                   }
  +
  +                if (lenRead > 0) {
  +                    contentStream.write(content, 0, lenRead);
  +                }
  +                contentStream.close();
  +            }
  +
  +            rt = Runtime.getRuntime();
  +            proc = rt.exec(cmdAndArgs.toString(), hashToStringArray(env), wd);
  +
  +            if(contentStream != null) {
  +                commandsStdIn = new BufferedOutputStream(proc.getOutputStream());
  +                proc.getOutputStream().write(contentStream.toByteArray());
  +                commandsStdIn.flush();
  +                commandsStdIn.close();
               }
  -            commandsStdIn.flush();
  -            commandsStdIn.close();*/
  -      String sContentLength = (String) env.get("CONTENT_LENGTH");
  -      if(!"".equals(sContentLength)) {
  -          commandsStdIn = new BufferedOutputStream(proc.getOutputStream());
  -          byte[] content = new byte[Integer.parseInt(sContentLength)];
  -
  -          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();
  -      }
   
               /* we want to wait for the process to exit,  Process.waitFor()
                * is useless in our situation; see
  @@ -1866,38 +1797,27 @@
           protected String getPostInput(Hashtable params) {
               String lineSeparator = System.getProperty("line.separator");
               Enumeration paramNames = params.keys();
  -            StringBuffer postInput = new StringBuffer("");
               StringBuffer qs = new StringBuffer("");
               if (paramNames != null && paramNames.hasMoreElements()) {
                   while (paramNames.hasMoreElements()) {
                       String k = (String) paramNames.nextElement();
                       String v = params.get(k).toString();
                       if ((k.indexOf("=") < 0) && (v.indexOf("=") < 0)) {
  -                        postInput.append(k);
                           qs.append(k);
  -                        postInput.append("=");
                           qs.append("=");
  -                        postInput.append(v);
                           qs.append(v);
  -                        postInput.append(lineSeparator);
                           qs.append("&");
                       }
                   }
               }
  -
               if (qs.length() > 0) {
  -                qs.append(lineSeparator);
  -                return qs.append(postInput.toString()).toString();
  +                // Remove last "&"
  +                qs.setLength(qs.length() - 1);
  +                return qs.toString();
               } else {
                   return null;
               }
           }
  -
  -
  -
       } //class CGIRunner
  -
  -
  -
   
   } //class CGIServlet
  
  
  

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

Reply via email to