Author: markt
Date: Thu Dec 29 06:06:58 2005
New Revision: 359798

URL: http://svn.apache.org/viewcvs?rev=359798&view=rev
Log:
Fix for bug 38012. Allow CGI scripts to issue redirects. Actually a more
general fix that allows CGI to set response status.

Modified:
    
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java
    tomcat/container/tc5.5.x/webapps/docs/changelog.xml

Modified: 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java?rev=359798&r1=359797&r2=359798&view=diff
==============================================================================
--- 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java
 (original)
+++ 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/servlets/CGIServlet.java
 Thu Dec 29 06:06:58 2005
@@ -1772,10 +1772,7 @@
                             log("runCGI: addHeader(\"" + line + "\")");
                         }
                         if (line.startsWith("HTTP")) {
-                            //TODO: should set status codes (NPH support)
-                            /*
-                             * response.setStatus(getStatusCode(line));
-                             */
+                            response.setStatus(getStatus(line));
                         } else if (line.indexOf(":") >= 0) {
                             String header =
                                 line.substring(0, line.indexOf(":")).trim();
@@ -1851,6 +1848,36 @@
             }
         }
 
+        /**
+         * Parses the status header and extracts the status code.
+         * 
+         * @param line The HTTP Status-Line (RFC2616, section 6.1)
+         * @return The extracted status code or the code representing an
+         * internal error if a valid status code cannot be extracted. 
+         */
+        private int getStatus(String line) {
+            int statusStart = line.indexOf(' ');
+            
+            if (statusStart < 0 || line.length() < statusStart + 4) {
+                // Not a valid status line
+                log ("runCGI: invalid status line:" + line);
+                return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+            }
+            
+            String status = line.substring(statusStart + 1, statusStart + 4);
+            
+            int statusCode;
+            try {
+                statusCode = Integer.parseInt(status);
+            } catch (NumberFormatException nfe) {
+                // Not a valid status code
+                log ("runCGI: invalid status code:" + status);
+                return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+            }
+            
+            return statusCode;
+        }
+        
         private void sendToLog(BufferedReader rdr) {
             String line = null;
             int lineCount = 0 ;

Modified: tomcat/container/tc5.5.x/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/webapps/docs/changelog.xml?rev=359798&r1=359797&r2=359798&view=diff
==============================================================================
--- tomcat/container/tc5.5.x/webapps/docs/changelog.xml (original)
+++ tomcat/container/tc5.5.x/webapps/docs/changelog.xml Thu Dec 29 06:06:58 2005
@@ -34,6 +34,9 @@
        Remove leftover static logger which was used to log application level 
messages in
        ApplicationContextFacade (remm)
       </fix>
+      <fix>
+        <bug>38012</bug>: Where a CGI script sets a response code, use it. 
(markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



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

Reply via email to