Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@apache.org Received: (qmail 10502 invoked from network); 18 Jun 2002 19:53:47 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 18 Jun 2002 19:53:47 -0000 Received: (qmail 1625 invoked by uid 97); 18 Jun 2002 19:53:40 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-dev@jakarta.apache.org Received: (qmail 1602 invoked by uid 97); 18 Jun 2002 19:53:40 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Developers List" Reply-To: "Tomcat Developers List" Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 1580 invoked by uid 97); 18 Jun 2002 19:53:39 -0000 X-Antivirus: nagoya (v4198 created Apr 24 2002) Date: 18 Jun 2002 19:53:26 -0000 Message-ID: <20020618195326.71890.qmail@icarus.apache.org> From: amyroh@apache.org To: jakarta-tomcat-4.0-cvs@apache.org Subject: cvs commit: jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters CompressionFilter.java CompressionFilterTestServlet.java CompressionResponseStream.java CompressionServletResponseWrapper.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N amyroh 2002/06/18 12:53:26 Modified: webapps/examples/WEB-INF/classes/compressionFilters CompressionFilter.java CompressionFilterTestServlet.java CompressionResponseStream.java CompressionServletResponseWrapper.java Log: Fix for CompressionFilter to work with Weblogic 6.1. It used to work incorrect for Web logic 6.1 in case the threshold is less than the len parameter in CompressionResponseStream.write(byte b[], int off, int len). The filter worked correctly on Tomcat since this situation never happens, but fails with Weblogic 6.1. Submitted by Dmitri Valdin. Thanks Dmitri. Revision Changes Path 1.6 +61 -13 jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java Index: CompressionFilter.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- CompressionFilter.java 6 Sep 2001 23:05:08 -0000 1.5 +++ CompressionFilter.java 18 Jun 2002 19:53:25 -0000 1.6 @@ -74,12 +74,14 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - + + /** * 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$, $Date$ */ @@ -92,6 +94,12 @@ private FilterConfig config = null; /** + * Minimal reasonable threshold + */ + private int minThreshold = 128; + + + /** * The threshold number to compress */ protected int compressionThreshold; @@ -111,18 +119,26 @@ config = filterConfig; if (filterConfig != null) { - String str = filterConfig.getInitParameter("compressionThreshold"); - if (str!=null) { - compressionThreshold = Integer.parseInt(str); - } else { - compressionThreshold = 0; - } 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; } @@ -162,19 +178,31 @@ 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()); + } Enumeration e = ((HttpServletRequest)request).getHeaders("Accept-Encoding"); while (e.hasMoreElements()) { - String name = (String)e.nextElement(); if (name.indexOf("gzip") != -1) { + 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 suuport for compresion"); + System.out.println("no support for compresion"); } } } @@ -190,6 +218,7 @@ 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"); @@ -203,5 +232,24 @@ } } } + + /** + * Set filter config + * This function is equivalent to init. Required by Weblogic 6.1 + * + * @param filterConfig The filter configuration object + */ + public void setFilterConfig(FilterConfig filterConfig) { + init(filterConfig); + } + + /** + * Return filter config + * Required by Weblogic 6.1 + */ + public FilterConfig getFilterConfig() { + return config; + } + } 1.4 +6 -5 jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java Index: CompressionFilterTestServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- CompressionFilterTestServlet.java 6 Sep 2001 04:18:54 -0000 1.3 +++ CompressionFilterTestServlet.java 18 Jun 2002 19:53:25 -0000 1.4 @@ -86,7 +86,8 @@ Enumeration e = ((HttpServletRequest)request).getHeaders("Accept-Encoding"); while (e.hasMoreElements()) { - String name = (String)e.nextElement(); out.println(name); + String name = (String)e.nextElement(); + out.println(name); if (name.indexOf("gzip") != -1) { out.println("gzip supported -- able to compress"); } 1.5 +63 -69 jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java Index: CompressionResponseStream.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- CompressionResponseStream.java 6 Sep 2001 23:05:08 -0000 1.4 +++ CompressionResponseStream.java 18 Jun 2002 19:53:25 -0000 1.5 @@ -76,6 +76,7 @@ * the CompressionServletResponseWrapper implementation. * * @author Amy Roh + * @author Dmitri Valdin * @version $Revision$, $Date$ */ @@ -95,7 +96,6 @@ super(); closed = false; - count = 0; this.response = response; this.output = response.getOutputStream(); @@ -112,14 +112,14 @@ protected int compressionThreshold = 0; /** - * The buffer through which all of our output bytes are passed. + * Debug level */ - protected byte[] buffer = null; - + private int debug = 0; + /** - * Is it big enough to compress? + * The buffer through which all of our output bytes are passed. */ - protected boolean compressionThresholdReached = false; + protected byte[] buffer = null; /** * The number of data bytes currently in the buffer. @@ -130,19 +130,13 @@ * The underlying gzip output stream to which we should write data. */ protected GZIPOutputStream gzipstream = null; - + /** * Has this stream been closed? */ protected boolean closed = false; /** - * The number of bytes which have already been written to this stream. - */ - protected int count = 0; - - - /** * The content length past which we will not write, or -1 if there is * no defined content length. */ @@ -161,6 +155,13 @@ // --------------------------------------------------------- Public Methods + /** + * Set debug level + */ + public void setDebugLevel(int debug) { + this.debug = debug; + } + /** * Set the compressionThreshold number and create buffer for this size @@ -168,7 +169,9 @@ protected void setBuffer(int threshold) { compressionThreshold = threshold; buffer = new byte[compressionThreshold]; - //System.out.println("buffer is set to "+compressionThreshold); + if (debug > 1) { + System.out.println("buffer is set to "+compressionThreshold); + } } /** @@ -177,7 +180,9 @@ */ public void close() throws IOException { - //System.out.println("close() @ CompressionResponseStream"); + if (debug > 1) { + System.out.println("close() @ CompressionResponseStream"); + } if (closed) throw new IOException("This output stream has already been closed"); @@ -203,12 +208,14 @@ */ public void flush() throws IOException { - //System.out.println("flush() @ CompressionResponseStream"); + if (debug > 1) { + System.out.println("flush() @ CompressionResponseStream"); + } if (closed) { throw new IOException("Cannot flush a closed output stream"); } - if (gzipstream!=null) { + if (gzipstream != null) { gzipstream.flush(); } @@ -216,11 +223,14 @@ public void flushToGZip() throws IOException { - //System.out.println("flushToGZip() @ CompressionResponseStream"); - + if (debug > 1) { + System.out.println("flushToGZip() @ CompressionResponseStream"); + } if (bufferCount > 0) { - //System.out.println("flushing out to GZipStream"); - gzipstream.write(buffer, 0, bufferCount); + if (debug > 1) { + System.out.println("flushing out to GZipStream, bufferCount = " + bufferCount); + } + writeToGZip(buffer, 0, bufferCount); bufferCount = 0; } @@ -235,44 +245,22 @@ */ public void write(int b) throws IOException { - //System.out.print("write "+b+" in CompressionResponseStream "); + if (debug > 1) { + System.out.println("write "+b+" in CompressionResponseStream "); + } if (closed) throw new IOException("Cannot write to a closed output stream"); - if ((bufferCount >= buffer.length) || (count>=compressionThreshold)) { - compressionThresholdReached = true; + if (bufferCount >= buffer.length) { + flushToGZip(); } - if (compressionThresholdReached) { - writeToGZip(b); - } else { - buffer[bufferCount++] = (byte) b; - count++; - } + buffer[bufferCount++] = (byte) b; } /** - * Write the specified byte to our compressed GZip output stream. - * - * @param b The byte to be written - * - * @exception IOException if an input/output error occurs - */ - - public void writeToGZip(int b) throws IOException { - - //System.out.println("writeToGZip (int b) compressing"); - if (gzipstream == null) { - gzipstream = new GZIPOutputStream(output); - response.addHeader("Content-Encoding", "gzip"); - } - gzipstream.write(b); - - } - - /** * Write b.length bytes from the specified byte array * to our output stream. * @@ -299,29 +287,45 @@ */ public void write(byte b[], int off, int len) throws IOException { - //System.out.println("second write in CompressionResponseStream"); + if (debug > 1) { + System.out.println("write, bufferCount = " + bufferCount + " len = " + len + " off = " + off); + } + if (debug > 2) { + System.out.write(b, off, len); + } + if (closed) throw new IOException("Cannot write to a closed output stream"); if (len == 0) return; + + // Can we write into buffer ? if (len <= (buffer.length - bufferCount)) { System.arraycopy(b, off, buffer, bufferCount, len); bufferCount += len; - count += len; return; } - // buffer full, start writing to gzipstream + // There is not enough space in buffer. Flush it ... + flushToGZip(); - writeToGZip(b, off, len); - count += len; + // ... and try again. Note, that bufferCount = 0 here ! + if (len <= (buffer.length - bufferCount)) { + System.arraycopy(b, off, buffer, bufferCount, len); + bufferCount += len; + return; + } + // write direct to gzip + writeToGZip(b, off, len); } public void writeToGZip(byte b[], int off, int len) throws IOException { - //System.out.println("writeToGZip 2 compressing"); + if (debug > 1) { + System.out.println("***** writeToGZip, len = " + len); + } if (gzipstream == null) { gzipstream = new GZIPOutputStream(output); response.addHeader("Content-Encoding", "gzip"); @@ -340,16 +344,6 @@ public boolean closed() { return (this.closed); - - } - - - /** - * Reset the count of bytes written to this stream to zero. - */ - public void reset() { - - count = 0; } 1.6 +42 -18 jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java Index: CompressionServletResponseWrapper.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- CompressionServletResponseWrapper.java 11 Mar 2002 20:11:05 -0000 1.5 +++ CompressionServletResponseWrapper.java 18 Jun 2002 19:53:26 -0000 1.6 @@ -83,6 +83,7 @@ * the CompressionServletResponseStream implementation.. * * @author Amy Roh + * @author Dmitri Valdin * @version $Revision$, $Date$ */ @@ -96,10 +97,11 @@ */ public CompressionServletResponseWrapper(HttpServletResponse response) { - super(response); origResponse = response; - + if (debug > 1) { + System.out.println("CompressionServletResponseWrapper constructor gets called"); + } } @@ -137,6 +139,10 @@ */ protected int threshold = 0; + /** + * Debug level + */ + private int debug = 0; // --------------------------------------------------------- Public Methods @@ -145,11 +151,21 @@ * Set threshold number */ public void setCompressionThreshold(int threshold) { - + if (debug > 1) { + System.out.println("setCompressionThreshold to " + threshold); + } this.threshold = threshold; + } + + /** + * Set debug level + */ + public void setDebugLevel(int debug) { + this.debug = debug; } + /** * Create and return a ServletOutputStream to write the content * associated with this Response. @@ -157,8 +173,15 @@ * @exception IOException if an input/output error occurs */ public ServletOutputStream createOutputStream() throws IOException { + if (debug > 1) { + System.out.println("createOutputStream gets called"); + } - return (new CompressionResponseStream(origResponse)); + CompressionResponseStream stream = new CompressionResponseStream(origResponse); + stream.setDebugLevel(debug); + stream.setBuffer(threshold); + + return stream; } @@ -167,7 +190,6 @@ * Finish a response. */ public void finishResponse() { - try { if (writer != null) { writer.close(); @@ -177,7 +199,6 @@ } } catch (IOException e) { } - } @@ -190,12 +211,10 @@ * @exception IOException if an input/output error occurs */ public void flushBuffer() throws IOException { - - if (writer != null) { - writer.flush(); - } else { - ((CompressionResponseStream)stream).flush(); + if (debug > 1) { + System.out.println("flush buffer @ CompressionServletResponseWrapper"); } + ((CompressionResponseStream)stream).flush(); } @@ -213,8 +232,11 @@ if (stream == null) stream = createOutputStream(); - ((CompressionResponseStream) stream).setBuffer(threshold); - return (stream); + if (debug > 1) { + System.out.println("stream is set to "+stream+" in getOutputStream"); + } + + return (stream); } @@ -234,7 +256,9 @@ throw new IllegalStateException("getOutputStream() has already been called for this response"); stream = createOutputStream(); - ((CompressionResponseStream) stream).setBuffer(threshold); + if (debug > 1) { + System.out.println("stream is set to "+stream+" in getWriter"); + } writer = new PrintWriter(stream); return (writer); -- To unsubscribe, e-mail: For additional commands, e-mail: