Author: markt Date: Tue Aug 28 23:57:35 2012 New Revision: 1378389 URL: http://svn.apache.org/viewvc?rev=1378389&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53725 Flushing the single byte needs special handling to avoid corruption in some edge cases. There may still be other edge cases where this fails.
Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/FlushableGZIPOutputStream.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/FlushableGZIPOutputStream.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/FlushableGZIPOutputStream.java?rev=1378389&r1=1378388&r2=1378389&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/FlushableGZIPOutputStream.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/FlushableGZIPOutputStream.java Tue Aug 28 23:57:35 2012 @@ -41,6 +41,7 @@ public class FlushableGZIPOutputStream e */ private byte[] lastByte = new byte[1]; private boolean hasLastByte = false; + private boolean flushingLastByte = false; @Override public void write(byte[] bytes) throws IOException { @@ -98,7 +99,9 @@ public class FlushableGZIPOutputStream e if (hasLastByte) { // Clear the flag first, because write() may fail hasLastByte = false; + flushingLastByte = true; super.write(lastByte, 0, 1); + flushingLastByte = false; } } @@ -137,6 +140,6 @@ public class FlushableGZIPOutputStream e if (len > 0) { out.write(buf, 0, len); } - } while (len > 0 || !def.needsInput()); + } while (len !=0 && !flushingLastByte || !def.needsInput()); } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org