/* * Copyright @ 2013 CurisTEC, S.A.S. All Rights Reserved. */ package net.curisit.securis; import java.io.IOException; import jakarta.enterprise.context.ApplicationScoped; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import net.curisit.securis.utils.GZipServletResponseWrapper; /** * GzipFilter *
* Servlet filter that compresses *.js responses with GZIP when the client
* advertises Accept-Encoding: gzip.
*/
@ApplicationScoped
@WebFilter(urlPatterns = "*.js")
public class GzipFilter implements Filter {
@SuppressWarnings("unused")
private static final Logger LOG = LogManager.getLogger(GzipFilter.class);
/** init
Filter init hook (unused). */ @Override public void init(FilterConfig fc) throws ServletException { } /** * doFilter *
* Wrap the response with a GZIP-compressing wrapper if supported by the client. */ @Override public void doFilter(ServletRequest sreq, ServletResponse sres, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) sreq; HttpServletResponse httpResponse = (HttpServletResponse) sres; if (acceptsGZipEncoding(httpRequest)) { httpResponse.addHeader("Content-Encoding", "gzip"); GZipServletResponseWrapper gzipResponse = new GZipServletResponseWrapper(httpResponse); chain.doFilter(sreq, gzipResponse); gzipResponse.close(); } else { chain.doFilter(sreq, sres); } } /** * acceptsGZipEncoding *
* @return {@code true} when request header contains "gzip" in Accept-Encoding.
*/
private boolean acceptsGZipEncoding(HttpServletRequest httpRequest) {
String acceptEncoding = httpRequest.getHeader("Accept-Encoding");
return acceptEncoding != null && acceptEncoding.indexOf("gzip") != -1;
}
/** destroy
Filter destroy hook (unused). */ @Override public void destroy() { } }