diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java b/java/org/apache/catalina/servlets/DefaultServlet.java index 8eb1ba8524cd..e93a16123db0 100644 --- a/java/org/apache/catalina/servlets/DefaultServlet.java +++ b/java/org/apache/catalina/servlets/DefaultServlet.java @@ -2144,7 +2144,9 @@ protected boolean checkIfMatch(HttpServletRequest request, HttpServletResponse r return true; } boolean hasAsteriskValue = false;// check existence of special header value '*' + int headerCount = 0; while (headerValues.hasMoreElements() && !conditionSatisfied) { + headerCount++; String headerValue = headerValues.nextElement(); if ("*".equals(headerValue)) { hasAsteriskValue = true; @@ -2163,7 +2165,11 @@ protected boolean checkIfMatch(HttpServletRequest request, HttpServletResponse r } } } - if (hasAsteriskValue && headerValues.hasMoreElements()) { + if (headerValues.hasMoreElements()) { + headerCount++; + } + + if (hasAsteriskValue && headerCount > 1) { // Note that an If-Match header field with a list value containing "*" and other values (including other // instances of "*") is syntactically invalid (therefore not allowed to be generated) and furthermore is // unlikely to be interoperable. @@ -2238,13 +2244,14 @@ protected boolean checkIfNoneMatch(HttpServletRequest request, HttpServletRespon } boolean hasAsteriskValue = false;// check existence of special header value '*' boolean conditionSatisfied = true; + int headerCount = 0; while (headerValues.hasMoreElements()) { - + headerCount++; String headerValue = headerValues.nextElement(); if (headerValue.equals("*")) { hasAsteriskValue = true; - if (headerValues.hasMoreElements()) { + if (headerCount > 1 || headerValues.hasMoreElements()) { conditionSatisfied = false; break; } else { @@ -2284,8 +2291,11 @@ protected boolean checkIfNoneMatch(HttpServletRequest request, HttpServletRespon } } + if (headerValues.hasMoreElements()) { + headerCount++; + } - if (hasAsteriskValue && headerValues.hasMoreElements()) { + if (hasAsteriskValue && headerCount > 1) { // Note that an If-None-Match header field with a list value containing "*" and other values (including // other instances of "*") is syntactically invalid (therefore not allowed to be generated) and furthermore // is unlikely to be interoperable.