You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2012/08/29 02:46:20 UTC

svn commit: r1378403 - /tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/FlushableGZIPOutputStream.java

Author: kkolinko
Date: Wed Aug 29 00:46:20 2012
New Revision: 1378403

URL: http://svn.apache.org/viewvc?rev=1378403&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53725

Another attempt to fixing BZ 53725.
Do not restore compression level until the next write.

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=1378403&r1=1378402&r2=1378403&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 Wed Aug 29 00:46:20 2012
@@ -42,6 +42,12 @@ public class FlushableGZIPOutputStream e
     private byte[] lastByte = new byte[1];
     private boolean hasLastByte = false;
 
+    /**
+     * Flag that compression has to be re-enabled before the next write
+     * operation.
+     */
+    private boolean flagReenableCompression = false;
+
     @Override
     public void write(byte[] bytes) throws IOException {
         write(bytes, 0, bytes.length);
@@ -53,6 +59,7 @@ public class FlushableGZIPOutputStream e
         if (length > 0) {
             flushLastByte();
             if (length > 1) {
+                reenableCompression();
                 super.write(bytes, offset, length - 1);
             }
             rememberLastByte(bytes[offset + length - 1]);
@@ -89,6 +96,13 @@ public class FlushableGZIPOutputStream e
         super.close();
     }
 
+    private void reenableCompression() {
+        if (flagReenableCompression) {
+            flagReenableCompression = false;
+            def.setLevel(Deflater.DEFAULT_COMPRESSION);
+        }
+    }
+
     private void rememberLastByte(byte b) {
         lastByte[0] = b;
         hasLastByte = true;
@@ -96,6 +110,7 @@ public class FlushableGZIPOutputStream e
 
     private void flushLastByte() throws IOException {
         if (hasLastByte) {
+            reenableCompression();
             // Clear the flag first, because write() may fail
             hasLastByte = false;
             super.write(lastByte, 0, 1);
@@ -118,7 +133,7 @@ public class FlushableGZIPOutputStream e
             if (!def.finished()) {
                 def.setLevel(Deflater.NO_COMPRESSION);
                 flushLastByte();
-                def.setLevel(Deflater.DEFAULT_COMPRESSION);
+                flagReenableCompression = true;
             }
         }
         out.flush();
@@ -139,5 +154,4 @@ public class FlushableGZIPOutputStream e
             }
         } while (len != 0);
     }
-
 }



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