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
}
+ private AcceleratorFilter getFilter() {
+ return AcceleratorFilter.this;
+ }
+
private void finish() throws IOException {
flushBuffer();
out.close();
*/
response.reset();
pos = 0;
+ size = 0;
stream = null;
writer = null;
}
writer.flush();
else if (stream != null)
stream.flush();
-
- out.flush();
}
@Override
public void write(int i) throws IOException {
if (pos == bufferSize) {
out().write(buffer);
- pos = 0;
committed = true;
- cacheControl.decorate(request, response, this);
+ /** Dekoration nur beim ersten Schreib-Schub anstoßen */
+ if (pos == size) {
+ if (!cacheControl.decorate(request, response)) {
+ zipped = false;
+ os = null;
+ pos = 0;
+ throw new NotModifiedException();
+ }
+ }
+ pos = 0;
}
buffer[pos++] = (byte) i;
size++;
return;
committed = true;
- cacheControl.decorate(request, response, this);
+ /** Dekoration nur beim ersten Schreib-Schub anstoßen */
+ 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, this);
+ if (!cacheControl.decorate(request, response))
+ throw new NotModifiedException();
sos.close();
}
else {
}
}
}
+
+class NotModifiedException extends IOException {}
\ No newline at end of file