FileDocCategorySizeDatePackage
CompressionFilter.javaAPI DocApache Tomcat 6.0.147628Fri Jul 20 04:20:34 BST 2007compressionFilters

CompressionFilter

public class CompressionFilter extends Object implements Filter
Implementation of javax.servlet.Filter used to compress the ServletResponse if it is bigger than a threshold.
author
Amy Roh
author
Dmitri Valdin
version
$Revision: 467217 $, $Date: 2006-10-24 05:14:34 +0200 (mar., 24 oct. 2006) $

Fields Summary
private FilterConfig
config
The filter configuration object we are associated with. If this value is null, this filter instance is not currently configured.
private int
minThreshold
Minimal reasonable threshold
protected int
compressionThreshold
The threshold number to compress
private int
debug
Debug level for this filter
Constructors Summary
Methods Summary
public voiddestroy()
Take this filter out of service.


        this.config = null;

    
public voiddoFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain)
The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. The FilterChain passed into this method allows the Filter to pass on the request and response to the next entity in the chain.

This method first examines the request to check whether the client support compression.
It simply just pass the request and response if there is no support for compression.
If the compression support is available, it creates a CompressionServletResponseWrapper object which compresses the content and modifies the header if the content length is big enough. It then invokes the next entity in the chain using the FilterChain object (chain.doFilter()),


        if (debug > 0) {
            System.out.println("@doFilter");
        }

        if (compressionThreshold == 0) {
            if (debug > 0) {
                System.out.println("doFilter gets called, but compressionTreshold is set to 0 - no compression");
            }
            chain.doFilter(request, response);
            return;
        }

        boolean supportCompression = false;
        if (request instanceof HttpServletRequest) {
            if (debug > 1) {
                System.out.println("requestURI = " + ((HttpServletRequest)request).getRequestURI());
            }

            // Are we allowed to compress ?
            String s = (String) ((HttpServletRequest)request).getParameter("gzip");
            if ("false".equals(s)) {
                if (debug > 0) {
                    System.out.println("got parameter gzip=false --> don't compress, just chain filter");
                }
                chain.doFilter(request, response);
                return;
            }

            Enumeration e =
                ((HttpServletRequest)request).getHeaders("Accept-Encoding");
            while (e.hasMoreElements()) {
                String name = (String)e.nextElement();
                if (name.indexOf("gzip") != -1) {
                    if (debug > 0) {
                        System.out.println("supports compression");
                    }
                    supportCompression = true;
                } else {
                    if (debug > 0) {
                        System.out.println("no support for compresion");
                    }
                }
            }
        }

        if (!supportCompression) {
            if (debug > 0) {
                System.out.println("doFilter gets called wo compression");
            }
            chain.doFilter(request, response);
            return;
        } else {
            if (response instanceof HttpServletResponse) {
                CompressionServletResponseWrapper wrappedResponse =
                    new CompressionServletResponseWrapper((HttpServletResponse)response);
                wrappedResponse.setDebugLevel(debug);
                wrappedResponse.setCompressionThreshold(compressionThreshold);
                if (debug > 0) {
                    System.out.println("doFilter gets called with compression");
                }
                try {
                    chain.doFilter(request, wrappedResponse);
                } finally {
                    wrappedResponse.finishResponse();
                }
                return;
            }
        }
    
public javax.servlet.FilterConfiggetFilterConfig()
Return filter config Required by Weblogic 6.1

        return config;
    
public voidinit(javax.servlet.FilterConfig filterConfig)
Place this filter into service.

param
filterConfig The filter configuration object


                    

        

        config = filterConfig;
        if (filterConfig != null) {
            String value = filterConfig.getInitParameter("debug");
            if (value!=null) {
                debug = Integer.parseInt(value);
            } else {
                debug = 0;
            }
            String str = filterConfig.getInitParameter("compressionThreshold");
            if (str!=null) {
                compressionThreshold = Integer.parseInt(str);
                if (compressionThreshold != 0 && compressionThreshold < minThreshold) {
                    if (debug > 0) {
                        System.out.println("compressionThreshold should be either 0 - no compression or >= " + minThreshold);
                        System.out.println("compressionThreshold set to " + minThreshold);
                    }
                    compressionThreshold = minThreshold;
                }
            } else {
                compressionThreshold = 0;
            }

        } else {
            compressionThreshold = 0;
        }

    
public voidsetFilterConfig(javax.servlet.FilterConfig filterConfig)
Set filter config This function is equivalent to init. Required by Weblogic 6.1

param
filterConfig The filter configuration object

        init(filterConfig);