https://issues.apache.org/bugzilla/show_bug.cgi?id=52121

--- Comment #6 from Konstantin Kolinko <knst.koli...@gmail.com> 2011-11-04 
12:08:34 UTC ---
Several additional notes

A link to the thread by Christopher Taylor mentioned by OP:
http://tomcat.markmail.org/thread/v56xpi5uz4end7cd

Note, that the Christopher Taylor's thread contains an attachment but only
containing the corrupted gzip stream.

1. I can observe the CRC error with 3-rd party tool, 7-zip.

It cannot decompress the file in Christopher Taylor's message, nether it can
the one produced by the test case for this issue before I committed my changes.
It reports CRC error.

Christopher Taylor's file was produced by Tomcat 7.0.14.

Thus not only Java report that the stream is broken.

2. According to the sources of deflate.c of zlib library that can be found in
many placed, changing compression level which is performed by "deflateParams"
call indeed causes deflate(strm, Z_PARTIAL_FLUSH) flushing the buffer.

That is in some old version of the code. In more recent ones it is just a
deflate(strm, Z_BLOCK).


3. Looking at the content of the streams produced by compression. Both the
stream in Christopher Taylor's message and the one produced by the JUnit test
case for this bug have uncompressed data near the end of the stream.

That is "</id><version>"... or "<div "... respectively - about 200 bytes of
plain text.

It just means that the flush in deflateParams() call failed to flush the whole
stream.

That happens when the output buffer used by deflate.c (that is configured by
'size' parameter in GZIPOutputStream constructor) is too small. There is a loop
that deals with this in DeflaterOutputStream.deflate(). Because the effective
compression level at that time is Deflater.NO_COMPRESSION the data is flushed
uncompressed.

The following follows:
1) If I increase size of the buffer by the following change in
FlushableGZIPOutputStream constructor, the problem reported here disappears:

-        super(os);
+        super(os, 64*1024);


4. The Java bugs 4255743 and 4813885 that are mentioned in the Javadoc for the
FlushableGZIPOutputStream class are both fixed in Java 7.

There is an additional boolean argument to GZIPOutputStream and
DeflaterOutputStream constructors in Java 7, "syncFlush". If it is set to true,
then calling mere flush() results in flushing the compressor.

5. Some documentation mentions that there is a trick in gzip when partial flush
is performed. It sends either one block or two blocks.

http://www.bolet.org/~pornin/deflate-flush.html

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to