- if (ifNoneMatch != null && ifNoneMatch.equals(eTag)) {
- log.debug("{}: ETag {} not changed -> 304 ", url, ifNoneMatch);
- response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
- return false;
+ if (ifNoneMatch != null) {
+ boolean weak = false;
+ if (ifNoneMatch.startsWith("W/")) {
+ weak = true;
+ ifNoneMatch = ifNoneMatch.substring(3, ifNoneMatch.length() - 1);
+ }
+ else {
+ ifNoneMatch = ifNoneMatch.substring(1, ifNoneMatch.length() - 1);
+ }
+
+ if (!weak || (request.getMethod().equals("GET") && request.getHeader(Headers.HEADER_RANGE) == null)) {
+ /**
+ * Die Gleichheit gilt nur, wenn die ETag's der Anfrage _und_ der
+ * Antwort stark sind (starke Gleichheit!), oder wenn die Antwort nur
+ * schwache Gleichheit fordert...
+ */
+ if (ifNoneMatch.equals(eTag) && (handle.isETagWeak() || !weak)) {
+ log.debug("{}: ETag {} not changed -> 304 ", url, ifNoneMatch);
+ response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+ return false;
+ }
+ }
+ else {
+ log.warn("{}: ignoring weak ETag W/\"{}\", because the request was no GET-request or the Range-Header was present!", url, ifNoneMatch);
+ }