Author: markt Date: Thu Dec 29 10:42:45 2005 New Revision: 359870 URL: http://svn.apache.org/viewcvs?rev=359870&view=rev Log: Bug 38012. Add support for the CGI specific status header.
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=359870&r1=359869&r2=359870&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 Thu Dec 29 10:42:45 2005 @@ -1766,13 +1766,17 @@ log("runCGI: addHeader(\"" + line + "\")"); } if (line.startsWith("HTTP")) { - response.setStatus(getStatus(line)); + response.setStatus(getSCFromHttpStatusLine(line)); } else if (line.indexOf(":") >= 0) { String header = line.substring(0, line.indexOf(":")).trim(); String value = - line.substring(line.indexOf(":") + 1).trim(); - response.addHeader(header , value); + line.substring(line.indexOf(":") + 1).trim(); + if (header.equalsIgnoreCase("status")) { + response.setStatus(getSCFromCGIStatusHeader(value)); + } else { + response.addHeader(header , value); + } if ((header.toLowerCase().equals("content-type")) && (!value.toLowerCase().startsWith("text"))) { isBinaryContent = true; @@ -1834,22 +1838,22 @@ } /** - * Parses the status header and extracts the status code. + * Parses the Status-Line 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(' '); + private int getSCFromHttpStatusLine(String line) { + int statusStart = line.indexOf(' ') + 1; - if (statusStart < 0 || line.length() < statusStart + 4) { - // Not a valid status line - log ("runCGI: invalid status line:" + line); + if (statusStart < 1 || line.length() < statusStart + 3) { + // Not a valid HTTP Status-Line + log ("runCGI: invalid HTTP Status-Line:" + line); return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; } - String status = line.substring(statusStart + 1, statusStart + 4); + String status = line.substring(statusStart, statusStart + 3); int statusCode; try { @@ -1862,7 +1866,36 @@ return statusCode; } - + + /** + * Parses the CGI Status Header value and extracts the status code. + * + * @param value The CGI Status value of the form <code> + * digit digit digit SP reason-phrase</code> + * @return The extracted status code or the code representing an + * internal error if a valid status code cannot be extracted. + */ + private int getSCFromCGIStatusHeader(String value) { + if (value.length() < 3) { + // Not a valid status value + log ("runCGI: invalid status value:" + value); + return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; + } + + String status = value.substring(0, 3); + + 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 ; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]