Fehler durch mehrfaches Mappen des AcceleratorFilters auf ein URI behandelt
authorKai Moritz <kai@coolibri.de>
Sat, 2 Jun 2012 21:29:55 +0000 (23:29 +0200)
committerKai Moritz <kai@coolibri.de>
Thu, 2 Aug 2012 07:03:26 +0000 (09:03 +0200)
Wenn die selbe Filter-Instanz mehrfach auf eine URL gemappt ist, wird eine
Warnung ausgegeben und ein doppeltes Wrapping der HttpServletResponse
verhindert, weil das zu Fehlern führen würde.

Wenn unterschiedliche Filter-Instanzen auf die selbe URL gemappt sind, wird
ein 500er-Fehler erzeugt, da das mehrfache Wrapping der HttpServletResponse
sonst zu unkalkulierbaren Fehlern führen würde.

cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java

index e881a8e..8e63222 100644 (file)
@@ -64,7 +64,25 @@ public class AcceleratorFilter implements Filter {
 
     HttpServletRequest httpRequest = (HttpServletRequest)request;
     HttpServletResponse httpResponse = (HttpServletResponse)response;
-    AccelerationWrapper wrapper = new AccelerationWrapper(httpRequest, httpResponse);
+
+    AccelerationWrapper wrapper;
+
+    wrapper = (AccelerationWrapper)request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER);
+    if (wrapper != null) {
+      if (wrapper.getFilter() == this) {
+        /** Ignore multiple mappings of the same filter-instance */
+        log.warn("Ignoring multiple mappings on same URL: {}", httpRequest.getRequestURI());
+        chain.doFilter(request, response);
+        return;
+      }
+      else {
+        log.error("Only one instance of AcceleratorFilter must be mapped to any URL: {}", httpRequest.getRequestURI());
+        httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Only one instance of AcceleratorFilter must be mapped to any URL!");
+        return;
+      }
+    }
+
+    wrapper = new AccelerationWrapper(httpRequest, httpResponse);
     httpRequest.setAttribute(RESPONSE_WRAPPER, wrapper);
     cacheControl.init(wrapper);
     try {
@@ -143,6 +161,10 @@ public class AcceleratorFilter implements Filter {
     }
 
 
+    private AcceleratorFilter getFilter() {
+      return AcceleratorFilter.this;
+    }
+
     private void finish() throws IOException {
       flushBuffer();
       out.close();