remm 2002/06/13 15:34:42 Modified: catalina/src/share/org/apache/catalina/servlets DefaultServlet.java Log: - Apply patch to fix bug 8013: DefaultServlet Throws NumberFormatException. - Now uses Request.getDateHeader instead of using instance local date formats, which is not thread safe. - Patch submitted by James Carman <james at carmanconsulting.com>. Very useful patch. Thanks ! Revision Changes Path 1.56 +176 -132 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/DefaultServlet.java Index: DefaultServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/DefaultServlet.java,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- DefaultServlet.java 11 May 2002 05:06:25 -0000 1.55 +++ DefaultServlet.java 13 Jun 2002 22:34:42 -0000 1.56 @@ -763,135 +763,11 @@ ResourceInfo resourceInfo) throws IOException { - String eTag = getETag(resourceInfo); - long fileLength = resourceInfo.length; - long lastModified = resourceInfo.date; - - StringTokenizer commaTokenizer; - - String headerValue; - - // Checking If-Match - headerValue = request.getHeader("If-Match"); - if (headerValue != null) { - if (headerValue.indexOf('*') == -1) { - - commaTokenizer = new StringTokenizer(headerValue, ","); - boolean conditionSatisfied = false; - - while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) { - String currentToken = commaTokenizer.nextToken(); - if (currentToken.trim().equals(eTag)) - conditionSatisfied = true; - } - - // If none of the given ETags match, 412 Precodition failed is - // sent back - if (!conditionSatisfied) { - response.sendError - (HttpServletResponse.SC_PRECONDITION_FAILED); - return false; - } - - } - } - - // Checking If-Modified-Since - headerValue = request.getHeader("If-Modified-Since"); - if (headerValue != null) { - - // If an If-None-Match header has been specified, if modified since - // is ignored. - if (request.getHeader("If-None-Match") == null) { - - Date date = null; - - // Parsing the HTTP Date - for (int i = 0; (date == null) && (i < formats.length); i++) { - try { - date = formats[i].parse(headerValue); - } catch (ParseException e) { - ; - } - } - - if ((date != null) - && (lastModified <= (date.getTime() + 1000)) ) { - // The entity has not been modified since the date - // specified by the client. This is not an error case. - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - return false; - } - - } - - } - - // Checking If-None-Match - headerValue = request.getHeader("If-None-Match"); - if (headerValue != null) { - - boolean conditionSatisfied = false; - - if (!headerValue.equals("*")) { - - commaTokenizer = new StringTokenizer(headerValue, ","); - - while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) { - String currentToken = commaTokenizer.nextToken(); - if (currentToken.trim().equals(eTag)) - conditionSatisfied = true; - } + return checkIfMatch(request, response, resourceInfo) + && checkIfModifiedSince(request, response, resourceInfo) + && checkIfNoneMatch(request, response, resourceInfo) + && checkIfUnmodifiedSince(request, response, resourceInfo); - } else { - conditionSatisfied = true; - } - - if (conditionSatisfied) { - - // For GET and HEAD, we should respond with - // 304 Not Modified. - // For every other method, 412 Precondition Failed is sent - // back. - if ( ("GET".equals(request.getMethod())) - || ("HEAD".equals(request.getMethod())) ) { - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - return false; - } else { - response.sendError - (HttpServletResponse.SC_PRECONDITION_FAILED); - return false; - } - } - - } - - // Checking If-Unmodified-Since - headerValue = request.getHeader("If-Unmodified-Since"); - if (headerValue != null) { - - Date date = null; - - // Parsing the HTTP Date - for (int i = 0; (date == null) && (i < formats.length); i++) { - try { - date = formats[i].parse(headerValue); - } catch (ParseException e) { - ; - } - } - - if ( (date != null) && (lastModified > date.getTime()) ) { - // The entity has not been modified since the date - // specified by the client. This is not an error case. - response.sendError - (HttpServletResponse.SC_PRECONDITION_FAILED); - return false; - } - - } - - return true; } @@ -1670,6 +1546,174 @@ // -------------------------------------------------------- Private Methods + + + /** + * Check if the if-match condition is satisfied. + * + * @param request The servlet request we are processing + * @param response The servlet response we are creating + * @param resourceInfo File object + * @return boolean true if the resource meets the specified condition, + * and false if the condition is not satisfied, in which case request + * processing is stopped + */ + private boolean checkIfMatch(HttpServletRequest request, + HttpServletResponse response, + ResourceInfo resourceInfo) + throws IOException { + + String eTag = getETag(resourceInfo); + String headerValue = request.getHeader("If-Match"); + if (headerValue != null) { + if (headerValue.indexOf('*') == -1) { + + StringTokenizer commaTokenizer = new StringTokenizer + (headerValue, ","); + boolean conditionSatisfied = false; + + while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) { + String currentToken = commaTokenizer.nextToken(); + if (currentToken.trim().equals(eTag)) + conditionSatisfied = true; + } + + // If none of the given ETags match, 412 Precodition failed is + // sent back + if (!conditionSatisfied) { + response.sendError + (HttpServletResponse.SC_PRECONDITION_FAILED); + return false; + } + + } + } + return true; + + } + + + /** + * Check if the if-modified-since condition is satisfied. + * + * @param request The servlet request we are processing + * @param response The servlet response we are creating + * @param resourceInfo File object + * @return boolean true if the resource meets the specified condition, + * and false if the condition is not satisfied, in which case request + * processing is stopped + */ + private boolean checkIfModifiedSince(HttpServletRequest request, + HttpServletResponse response, + ResourceInfo resourceInfo) + throws IOException { + + long headerValue = request.getDateHeader("If-Modified-Since"); + long lastModified = resourceInfo.date; + if (headerValue != -1) { + + // If an If-None-Match header has been specified, if modified since + // is ignored. + if ((request.getHeader("If-None-Match") == null) + && (lastModified <= headerValue + 1000)) { + // The entity has not been modified since the date + // specified by the client. This is not an error case. + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + return false; + } + } + return true; + + } + + + /** + * Check if the if-none-match condition is satisfied. + * + * @param request The servlet request we are processing + * @param response The servlet response we are creating + * @param resourceInfo File object + * @return boolean true if the resource meets the specified condition, + * and false if the condition is not satisfied, in which case request + * processing is stopped + */ + private boolean checkIfNoneMatch(HttpServletRequest request, + HttpServletResponse response, + ResourceInfo resourceInfo) + throws IOException { + + String eTag = getETag(resourceInfo); + String headerValue = request.getHeader("If-None-Match"); + if (headerValue != null) { + + boolean conditionSatisfied = false; + + if (!headerValue.equals("*")) { + + StringTokenizer commaTokenizer = + new StringTokenizer(headerValue, ","); + + while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) { + String currentToken = commaTokenizer.nextToken(); + if (currentToken.trim().equals(eTag)) + conditionSatisfied = true; + } + + } else { + conditionSatisfied = true; + } + + if (conditionSatisfied) { + + // For GET and HEAD, we should respond with + // 304 Not Modified. + // For every other method, 412 Precondition Failed is sent + // back. + if ( ("GET".equals(request.getMethod())) + || ("HEAD".equals(request.getMethod())) ) { + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + return false; + } else { + response.sendError + (HttpServletResponse.SC_PRECONDITION_FAILED); + return false; + } + } + } + return true; + + } + + + /** + * Check if the if-unmodified-since condition is satisfied. + * + * @param request The servlet request we are processing + * @param response The servlet response we are creating + * @param resourceInfo File object + * @return boolean true if the resource meets the specified condition, + * and false if the condition is not satisfied, in which case request + * processing is stopped + */ + private boolean checkIfUnmodifiedSince(HttpServletRequest request, + HttpServletResponse response, + ResourceInfo resourceInfo) + throws IOException { + + long lastModified = resourceInfo.date; + long headerValue = request.getDateHeader("If-Unmodified-Since"); + if (headerValue != -1) { + if ( lastModified > headerValue ) { + // The entity has not been modified since the date + // specified by the client. This is not an error case. + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); + return false; + } + + } + return true; + + } /**
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>