[Winstone-devel] winstone/src/java/winstone/filters/gzip ByteArrayServletOutputStream.java,NONE,1.1
Status: Beta
Brought to you by:
rickknowles
From: Rick K. <ric...@us...> - 2005-08-24 06:43:42
|
Update of /cvsroot/winstone/winstone/src/java/winstone/filters/gzip In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13776/src/java/winstone/filters/gzip Added Files: ByteArrayServletOutputStream.java GzipResponseWrapper.java GzipFilter.java Log Message: added gzip and multipart processing sample filters - note that the multipart filter depends on javamail, which isn't available from the maven repository, so you'll need to add it manually, then enable the dependencies in the project.xml file (once again, Sun's legal brilliance at work) --- NEW FILE: GzipResponseWrapper.java --- /* * Generator Runtime Servlet Framework * Copyright (C) 2004 Rick Knowles * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * Version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License Version 2 for more details. * * You should have received a copy of the GNU Library General Public License * Version 2 along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package winstone.filters.gzip; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletContext; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /** * Wraps the response object with an output buffer, and which waits until * the full response is written, after which it commits and writes a * gzip compressed version, with the transfer encoding header set to gzipped. * * @author <a href="mailto:ric...@ho...">Rick Knowles</a> * @version $Id: GzipResponseWrapper.java,v 1.1 2005/08/24 06:43:34 rickknowles Exp $ */ public class GzipResponseWrapper extends HttpServletResponseWrapper { private ByteArrayServletOutputStream bufferStream; private PrintWriter bufferWriter; private Integer minimumSizeForCompression; private ServletContext context; public GzipResponseWrapper(HttpServletResponse response, ServletContext context, Integer minimumSizeForCompression) { super(response); this.context = context; this.minimumSizeForCompression = minimumSizeForCompression; } public void close() throws IOException { if (this.bufferWriter != null) { this.bufferWriter.flush(); } // reset content length, and echo out if (this.bufferStream != null) { byte content[] = this.bufferStream.getContent(); long startTime = System.currentTimeMillis(); if ((this.minimumSizeForCompression == null) || (this.minimumSizeForCompression.intValue() < content.length)) { int initialContentLength = content.length; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(buffer); gzip.write(content); gzip.close(); content = buffer.toByteArray(); buffer.close(); super.addHeader("Content-Encoding", "gzip"); this.context.log("Gzipped " + initialContentLength + " bytes of " + "response content to " + content.length + " bytes in " + (System.currentTimeMillis() - startTime) + "ms"); } // Set content length and write out super.setContentLength(content.length); ServletOutputStream out = null; try { out = super.getOutputStream(); } catch (IllegalStateException err) { throw new IOException("Can't use a gzip response wrapper on included files"); } out.write(content); out.flush(); } } public void setContentLength(int length) {/* do nothing */} /** * Returns a stream wrapper */ public ServletOutputStream getOutputStream() throws IOException { if (this.bufferStream != null) { return this.bufferStream; } else if (this.bufferWriter != null) { throw new IllegalStateException("getWriter has already been called"); } else { // Assumes we only map this filter to appropriate objects this.bufferStream = new ByteArrayServletOutputStream(); return this.bufferStream; } } /** * Returns a writer wrapper */ public PrintWriter getWriter() throws IOException { if (this.bufferWriter != null) { return this.bufferWriter; } else if (this.bufferStream != null) { throw new IllegalStateException("getOutputStream " + "has already been called"); } else { this.bufferStream = new ByteArrayServletOutputStream(); this.bufferWriter = new PrintWriter( new OutputStreamWriter(this.bufferStream, getCharacterEncoding()), true); return this.bufferWriter; } } } --- NEW FILE: ByteArrayServletOutputStream.java --- /* * Generator Runtime Servlet Framework * Copyright (C) 2004 Rick Knowles * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * Version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License Version 2 for more details. * * You should have received a copy of the GNU Library General Public License * Version 2 along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package winstone.filters.gzip; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.ServletOutputStream; /** * Acts as a simple byte array based output stream for servlet responses. * * @author <a href="mailto:ric...@ho...">Rick Knowles</a> * @version $Id: ByteArrayServletOutputStream.java,v 1.1 2005/08/24 06:43:34 rickknowles Exp $ */ public class ByteArrayServletOutputStream extends ServletOutputStream { private ByteArrayOutputStream bodyStream; public ByteArrayServletOutputStream() { this.bodyStream = new ByteArrayOutputStream(); } public byte[] getContent() { return this.bodyStream.toByteArray(); } public void write(int b) throws IOException { this.bodyStream.write(b); } public void flush() throws IOException { this.bodyStream.flush(); } } --- NEW FILE: GzipFilter.java --- /* * Generator Runtime Servlet Framework * Copyright (C) 2004 Rick Knowles * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * Version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License Version 2 for more details. * * You should have received a copy of the GNU Library General Public License * Version 2 along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package winstone.filters.gzip; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * A filter that checks if the request will accept a gzip encoded response, and * if so wraps the response in a gzip encoding response wrapper. * * @author <a href="mailto:ric...@ho...">Rick Knowles</a> * @version $Id: GzipFilter.java,v 1.1 2005/08/24 06:43:34 rickknowles Exp $ */ public class GzipFilter implements Filter { private static final String ACCEPT_ENCODING = "Accept-Encoding"; private Integer minimumSizeForCompression; private ServletContext context; public void init(FilterConfig config) throws ServletException { String minimumSizeForCompressionStr = config.getInitParameter("minimumSizeForCompression"); if ((minimumSizeForCompressionStr != null) && (minimumSizeForCompressionStr.equals(""))) { this.minimumSizeForCompression = new Integer(minimumSizeForCompressionStr); } this.context = config.getServletContext(); } public void destroy() { this.minimumSizeForCompression = null; this.context = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Enumeration headers = ((HttpServletRequest) request).getHeaders(ACCEPT_ENCODING); boolean acceptsGzipEncoding = false; while (headers.hasMoreElements() && !acceptsGzipEncoding) { acceptsGzipEncoding = (((String) headers.nextElement()).indexOf("gzip") != -1); } if (acceptsGzipEncoding) { GzipResponseWrapper encodedResponse = new GzipResponseWrapper( (HttpServletResponse) response, this.context, this.minimumSizeForCompression); chain.doFilter(request, encodedResponse); encodedResponse.close(); } else { chain.doFilter(request, response); } } } |