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
}
+ private AcceleratorFilter getFilter() {
+ return AcceleratorFilter.this;
+ }
+
private void finish() throws IOException {
flushBuffer();
out.close();
writer.flush();
else if (stream != null)
stream.flush();
-
- out.flush();
}
@Override
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;
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;
if (size == 0) {
committed = true;
zipped = false;
- cacheControl.decorate(request, response);
+ if (!cacheControl.decorate(request, response))
+ throw new NotModifiedException();
sos.close();
}
else {
}
}
}
+
+class NotModifiedException extends IOException {}
\ No newline at end of file