1 package org.roller.presentation.filters; 2 3 import org.apache.commons.logging.Log; 4 import org.apache.commons.logging.LogFactory; 5 6 import java.io.ByteArrayOutputStream ; 7 import java.io.IOException ; 8 import java.util.zip.GZIPOutputStream ; 9 10 import javax.servlet.Filter ; 11 import javax.servlet.FilterChain ; 12 import javax.servlet.FilterConfig ; 13 import javax.servlet.ServletException ; 14 import javax.servlet.ServletRequest ; 15 import javax.servlet.ServletResponse ; 16 import javax.servlet.http.HttpServletRequest ; 17 import javax.servlet.http.HttpServletResponse ; 18 19 30 31 public class CompressionFilter implements Filter 32 { 33 private static Log mLogger = 34 LogFactory.getFactory().getInstance(CompressionFilter.class); 35 36 44 public void doFilter( 45 ServletRequest request, 46 ServletResponse response, 47 FilterChain chain) 48 throws ServletException , IOException 49 { 50 HttpServletRequest req = (HttpServletRequest ) request; 51 HttpServletResponse res = (HttpServletResponse ) response; 52 if (!isGzipSupported(req)) 53 { 54 chain.doFilter(req, res); 56 } 57 else 58 { 59 res.setHeader("Content-Encoding", "gzip"); 61 62 ByteArrayResponseWrapper responseWrapper = 64 new ByteArrayResponseWrapper(response); 65 66 chain.doFilter(req, responseWrapper); 67 68 ByteArrayOutputStream outputStream = responseWrapper.getByteArrayOutputStream(); 69 70 if (mLogger.isDebugEnabled()) 72 { 73 mLogger.debug("Pre-zip size:" + outputStream.size()); 74 } 75 76 ByteArrayOutputStream byteStream = new ByteArrayOutputStream (); 79 GZIPOutputStream zipOut = new GZIPOutputStream (byteStream); 80 81 zipOut.write(responseWrapper.getByteArrayOutputStream().toByteArray()); 83 84 zipOut.close(); 86 87 if (mLogger.isDebugEnabled()) 88 { 89 mLogger.debug("Gzip size:" + byteStream.size()); 90 } 91 92 res.setContentLength(byteStream.size()); 94 95 ByteArrayOutputStreamWrapper newOut = 96 (ByteArrayOutputStreamWrapper) responseWrapper.getOutputStream(); 97 newOut.clear(); 98 newOut.setFinallized(); 99 100 101 newOut.write(byteStream.toByteArray()); 102 newOut.close(); 103 } 104 } 105 106 109 public void init(FilterConfig config) throws ServletException 110 { 111 } 112 113 public void destroy() 114 { 115 } 116 117 private boolean isGzipSupported(HttpServletRequest req) 118 { 119 String browserEncodings = req.getHeader("Accept-Encoding"); 120 return ( 121 (browserEncodings != null) 122 && (browserEncodings.indexOf("gzip") != -1)); 123 } 124 125 } 126 | Popular Tags |