package de.axone.web; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import de.axone.data.Charsets; public class FeatureHttpServletResponseWrapper extends HttpServletResponseWrapper { private ServletOutputStream out; private GZIPOutputStream gOut; private PrintWriter writer; private boolean useGzip; public FeatureHttpServletResponseWrapper( HttpServletResponse resp, boolean useGzip ) throws IOException{ super( resp ); this.useGzip = useGzip; if( useGzip ){ gOut = new GZIPOutputStream( resp.getOutputStream() ); out = new ServletOutputStreamImpl( gOut ); writer = new PrintWriter( new OutputStreamWriter( gOut, Charsets.UTF8 ) ); setHeader( "Content-Encoding", "gzip" ); } } public FeatureHttpServletResponseWrapper( HttpServletResponse resp ) throws IOException{ this( resp, false ); } public void finish() throws IOException{ if( gOut != null ) gOut.finish(); } @Override public ServletOutputStream getOutputStream() throws IOException { if( useGzip ){ return out; } else { return super.getOutputStream(); } } @Override public PrintWriter getWriter() throws IOException { if( useGzip ){ return writer; } else { return super.getWriter(); } } public static class ServletOutputStreamImpl extends ServletOutputStream { public OutputStream wrapped; public ServletOutputStreamImpl( OutputStream wrapped ){ this.wrapped = wrapped; } @Override public void write( int b ) throws IOException { wrapped.write( b ); } } }