X-Git-Url: https://juplo.de/gitweb/?p=percentcodec;a=blobdiff_plain;f=cachecontrol%2Fsrc%2Fmain%2Fjava%2Fde%2Fhalbekunst%2Fjuplo%2Fcachecontrol%2FAcceleratorFilter.java;h=8e63222abfb185e7e3bb2b4b5e889c8304b66b6e;hp=f9cd886f6d3c6d5a6fd1a5c58cad33a60c39c589;hb=2debc69d4dcf8618c2fc06aa0633fabbf4f98f52;hpb=5f8def1103a2a408579d1b6ae29e447a272a9558 diff --git a/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java b/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java index f9cd886f..8e63222a 100644 --- a/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java +++ b/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java @@ -62,21 +62,36 @@ public class AcceleratorFilter implements Filter { return; } - // TODO: Das macht so wahrscheinlich keinen Sinn... - /** Prüfen, ob es sich um eine Anfrage für einen JSP-Include handelt */ - if (request.getAttribute(REQUEST_URI_ATTRIBUTE) != null) { - log.debug("Includes cannot be accelerated"); - chain.doFilter(request, response); - return; - } - 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); - chain.doFilter(request, wrapper); - wrapper.finish(); + try { + chain.doFilter(request, wrapper); + wrapper.finish(); + } + catch (NotModifiedException nm) { + log.trace("Not modified: {}", httpRequest.getRequestURI()); + } } @Override @@ -146,6 +161,10 @@ public class AcceleratorFilter implements Filter { } + private AcceleratorFilter getFilter() { + return AcceleratorFilter.this; + } + private void finish() throws IOException { flushBuffer(); out.close(); @@ -344,8 +363,6 @@ public class AcceleratorFilter implements Filter { writer.flush(); else if (stream != null) stream.flush(); - - out.flush(); } @Override @@ -652,8 +669,14 @@ public class AcceleratorFilter implements Filter { out().write(buffer); committed = true; /** Dekoration nur beim ersten Schreib-Schub anstoßen */ - if (pos == size) - cacheControl.decorate(request, response); + if (pos == size) { + if (!cacheControl.decorate(request, response)) { + zipped = false; + os = null; + pos = 0; + throw new NotModifiedException(); + } + } pos = 0; } buffer[pos++] = (byte) i; @@ -667,8 +690,14 @@ public class AcceleratorFilter implements Filter { committed = true; /** Dekoration nur beim ersten Schreib-Schub anstoßen */ - if (pos == size) - cacheControl.decorate(request, response); + if (pos == size) { + if (!cacheControl.decorate(request, response)) { + zipped = false; + os = null; + pos = 0; + throw new NotModifiedException(); + } + } out().write(buffer, 0, pos); out().flush(); pos = 0; @@ -679,7 +708,8 @@ public class AcceleratorFilter implements Filter { if (size == 0) { committed = true; zipped = false; - cacheControl.decorate(request, response); + if (!cacheControl.decorate(request, response)) + throw new NotModifiedException(); sos.close(); } else { @@ -690,3 +720,5 @@ public class AcceleratorFilter implements Filter { } } } + +class NotModifiedException extends IOException {} \ No newline at end of file