Return-Path: Delivered-To: apmail-jakarta-tomcat-user-archive@apache.org Received: (qmail 59330 invoked from network); 7 Jan 2003 19:57:46 -0000 Received: from exchange.sun.com (192.18.33.10) by daedalus.apache.org with SMTP; 7 Jan 2003 19:57:46 -0000 Received: (qmail 20577 invoked by uid 97); 7 Jan 2003 19:56:37 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-user@jakarta.apache.org Received: (qmail 20528 invoked by uid 97); 7 Jan 2003 19:56:37 -0000 Mailing-List: contact tomcat-user-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Users List" Reply-To: "Tomcat Users List" Delivered-To: mailing list tomcat-user@jakarta.apache.org Received: (qmail 20477 invoked by uid 98); 7 Jan 2003 19:56:36 -0000 X-Antivirus: nagoya (v4218 created Aug 14 2002) X-Authentication-Warning: mehen.visi.com: www set sender to hoju@visi.com using -f Message-ID: <1041969315.3e1b30a368865@my.visi.com> Date: Tue, 7 Jan 2003 19:55:15 +0000 From: Jacob Kjome To: Tomcat Users List Subject: RE: GZIP filter problem.... References: <399E1F52E73BD41194A800D0B74A08AB01E4DE28@skipper.cincom.com> In-Reply-To: <399E1F52E73BD41194A800D0B74A08AB01E4DE28@skipper.cincom.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Internet Messaging Program (IMP) 4.0-cvs X-Originating-IP: 129.179.77.171 X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Hi Charlie, Thanks for the tip. Actually, that seems to make no difference. I finally decided to test it with a plain HTML page. It successfully GZIP'ed an html document with an original data size of 636 bytes down to 369 bytes and the output didn't get garbled on the browser side. This was with specifying the compressed header after I did response.getOuputStream() but before I actually wrote the data. So, that validates that my GZIP filter generally works correctly. The curious thing is that I also tried it with a simple .jsp page. I got the same sort of garbled data as I got when sending xml data from a servlet. In all cases, I can see the decompressed data just fine in debugging. So, this leads me to believe there is either a bug in Tomcat or there is some other header or something that I need to set. GZIP'ing static files, such as .html files, works fine. GZIP'ing data coming from a servlet or .jsp doesn't work. This narrows it down. Can you think of anything else which might be the issue here? Should I report a bug against Tomcat? I hate to do that until I really understand the problem, though. Thanks for continued your help! Jake Quoting "Cox, Charlie" : > try setting the encoding before you request the output stream. You may be > losing the header by requesting the output stream first. > > httpResponse.setHeader("Content-Encoding", "gzip"); > OutputStream out = response.getOutputStream(); > > I know you can't set headers after writing to the output stream, but I'm not > sure if you can after getting a reference to the outputstream. IIRC, the > getOutputStream() determines whether you have written anything or not(i.e. > try getWriter() immediately after getOutputStream() and it will throw an > error) > > Charlie > > > -----Original Message----- > > From: Jacob Kjome [mailto:hoju@visi.com] > > Sent: Tuesday, January 07, 2003 9:19 AM > > To: Tomcat Users List > > Subject: RE: GZIP filter problem.... > > > > > > > > Hi Charlie, > > > > I looked at it a little bit, but, to be honest, that one is less > > straightforward (kind of messy, actually) and I'm not even > > sure it is doing > > any compression as it doesn't provide any logging stating the > > difference > > between the original size of the response and the compressed > > size (although > > it logs lots of other stuff). I'll continue to investigate, > > however, I > > guess my point is that I've seen a good number of examples of > > how to do the > > GZIP compression and the example I am following pretty much > > does exactly > > what all of them recommend. There is one from "More Servlets > > and Java > > Server Pages" by Marty Hall that also doesn't work under Tomcat-4.1.18 > > ( > > http://archive.moreservlets.com/Filter-Code/filters/WEB-INF/cl > asses/moreservlets/filters/CompressionFilter.java > > ). I have a really hard time believing that all these people > > are just > > plain wrong about how they did this. The code looks valid > > based on all > > examples I've seen, and I've proven that the GZIP compression > > was done > > properly because I was able to decompress and print that to > > logging. I > > just can't get it to the browsers (IE5.5/6.0 and Mozilla) to > > understand the > > output. > > > > So, apart from looking at the example in Tomcat which, > > presumably, works > > (and I will continue to study it), is there anything in my > > code that is > > just obviously incorrect? If not, why doesn't it work? > > > > Jake > > > > At 07:03 AM 1/7/2003 -0500, you wrote: > > >did you look at CompressionFilter.java that is part of the examples > > >distributed with Tomcat? > > > > > >Charlie > > > > > > > -----Original Message----- > > > > From: Jacob Kjome [mailto:hoju@visi.com] > > > > Sent: Monday, January 06, 2003 8:22 PM > > > > To: Tomcat Users List > > > > Subject: GZIP filter problem.... > > > > > > > > > > > > > > > > I'm trying to use a GZIP servlet filter under Tomcat-4.1.18. > > > > I am basing this filter on > > > > an existing example at Orion ( > > > > http://www.orionserver.com/tutorials/filters/5.html ) > > > > > > > > It GZIPs fine and, in my debugging, I can decompress the > > data back to > > > > what it was originally (more on that below). The problem > > > > is, all I get when I send the data out to the browser is > > > > non-decompressed garbled data. That is, the browser doesn't > > > > seem to understand that it is > > > > gzip'ed stream and doesn't decode it. Here is the relevant > > > > code. Can anyone see what the > > > > problem might be? Note that in the no compression case where > > > > I simply call > > > > dofilter(res, wrapper.getData()) it works just fine, so it isn't a > > > > problem with the filter in general.... > > > > > > > > > > > > ... > > > > ... > > > > ... > > > > httpResponse.setHeader("Vary", "Accept-Encoding"); > > > > OutputStream out = response.getOutputStream(); > > > > httpResponse.setHeader("Content-Encoding", "gzip"); > > > > ByteArrayOutputStream compressed = new ByteArrayOutputStream(); > > > > GZIPOutputStream gzout = new GZIPOutputStream(compressed); > > > > gzout.write(wrapper.getData()); > > > > gzout.finish(); > > > > gzout.close(); > > > > > > > > if (logger.isDebugEnabled()) { > > > > logger.debug("compressed data..."); > > > > logger.debug(compressed); > > > > > > > > ByteArrayInputStream bais = new > > > > ByteArrayInputStream(compressed.toByteArray()); > > > > GZIPInputStream gzin = new GZIPInputStream(bais); > > > > byte[] buffer = new byte[1024]; > > > > int n, i = 0, m = buffer.length; > > > > while ((n = gzin.read (buffer, i, m - i)) >= 0) { > > > > i += n; > > > > if (i >= m) { > > > > byte[] newBuffer = new byte[m *= 2]; > > > > System.arraycopy (buffer, 0, newBuffer, 0, i); > > > > buffer = newBuffer; > > > > } > > > > } > > > > byte[] result = new byte[i]; > > > > System.arraycopy (buffer, 0, result, 0, i); > > > > ByteArrayOutputStream decompressed = new > > ByteArrayOutputStream(); > > > > DataOutputStream daos = new DataOutputStream(decompressed); > > > > daos.write(result); > > > > daos.flush(); > > > > daos.close(); > > > > logger.debug("decompressed data..."); > > > > logger.debug(decompressed); > > > > } > > > > > > > > out.write(compressed.toByteArray()); > > > > response.setContentLength(compressed.size()); > > > > if (logger.isDebugEnabled()) logger.debug("Wrote filter > > > > compressed data: "+compressed.size()+" bytes"); > > > > out.flush(); > > > > response.flushBuffer(); > > > > out.close(); > > > > ... > > > > ... > > > > ... > > > > > > > > > > > > Here is an example of the debugging output so you can see > > that I can > > > > compress and decompress the data without issue... > > > > > > > > compressed data... > > > > < �����Q(K-*��ϳU2�3P���q��M��+�f2�sSm*'�s > > > > �**��� > > > > R� > > > > rRA��0? ��'sX > > > > decompressed data... > > > > > > > > > > > name="someOtherName"/> > > > > > > > > Note that the contentType was set by the servlet as > > "text/xml" and was > > > > not reset by the filter. > > > > > > > > Any ideas? It wouldn't be a bug in Tomcat, would it? I > > just don't > > > > see anything wrong with the code??? > > > > > > > > > > > > Thanks, > > > > > > > > Jake > > > > > > > > > > > > -- > > > > Best regards, > > > > Jacob mailto:hoju@visi.com > > > > > > > > > > > > -- > > > > To unsubscribe, e-mail: > > > > > >For additional commands, e-mail: > > > > > > > > >-- > > >To unsubscribe, e-mail: > > >For additional commands, e-mail: > > > -- > To unsubscribe, e-mail: > For additional commands, e-mail: -- To unsubscribe, e-mail: For additional commands, e-mail: