Fehler bei ungültigem If-Modified-Since in CacheControlInterceptor behoben
authorKai Moritz <kai@coolibri.de>
Thu, 23 Jun 2011 16:00:30 +0000 (18:00 +0200)
committerKai Moritz <kai@coolibri.de>
Thu, 23 Jun 2011 17:27:13 +0000 (19:27 +0200)
 * Wenn die Implementierung von Cacheable einen ungültigen (d.h. negativen)
   Zeitstempel für Last-Modified geliefert hat, hat CacheControlInterceptor
   fälschlich stets mit 304 Not-Modified geantwortet.
 * Exception abgefangen, die CacheControlInterceptor geworfen hat, wenn der
   Request für If-Modified-Since eine Zeitangabe vor dem 1.1.1970 enthalten
   hat.

utils/cachecontrol/src/main/java/de/halbekunst/utils/cachecontrol/CacheControlInterceptor.java

index 35b7753..bc2dd3d 100644 (file)
@@ -65,7 +65,14 @@ public class CacheControlInterceptor implements HandlerInterceptor {
         return true;
       }
 
         return true;
       }
 
-      long ifModifiedSince = request.getDateHeader(HEADER_IF_MODIFIED_SINCE);
+      long ifModifiedSince = -1;
+      try {
+        ifModifiedSince = request.getDateHeader(HEADER_IF_MODIFIED_SINCE);
+      }
+      catch (Exception e) {
+        log.error("Exception while fetching If-Modified-Since: {}", e);
+      }
+
       long lastModified = cacheable.getLastModified(request);
 
       /**
       long lastModified = cacheable.getLastModified(request);
 
       /**
@@ -89,11 +96,14 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       }
 
 
       }
 
 
-      if (ifModifiedSince >= lastModified) {
+      if (ifModifiedSince >= lastModified && lastModified > 0) {
         /**
          * request.getDateHeader liefert die Zeit als long, oder -1, wenn der
          * Header nicht existiert. D.h., wenn "If-Modified-Since" nicht gesetzt
          * ist, wird die komplette Seite ausgeliefert.
         /**
          * request.getDateHeader liefert die Zeit als long, oder -1, wenn der
          * Header nicht existiert. D.h., wenn "If-Modified-Since" nicht gesetzt
          * ist, wird die komplette Seite ausgeliefert.
+         * Der zusätzliche Test, ob lastModified größer 0 ist, ist nötig, um
+         * Fehler auszuschließen, wenn die Implementierung von Cachable
+         * negative Werte für Last-Modified zurückliefert.
          */
         if (log.isDebugEnabled())
           log.debug("Not modified since {}: {}", new Date(ifModifiedSince), request.getRequestURI());
          */
         if (log.isDebugEnabled())
           log.debug("Not modified since {}: {}", new Date(ifModifiedSince), request.getRequestURI());
@@ -166,7 +176,7 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       }
 
       return true;
       }
 
       return true;
-  }
+    }
     catch (ClassCastException e) {
       return true;
     }
     catch (ClassCastException e) {
       return true;
     }