Author: markt
Date: Thu Nov 30 13:41:20 2017
New Revision: 1816712

URL: http://svn.apache.org/viewvc?rev=1816712&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=57870
When running on Java 7 or later, take advantage of the new syncFlush< parameter 
when constructing a GZIPOutputStream rather than using the custom 
FlushableGZIPOutputStream implementation as a work-around.

Modified:
    
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre7Compat.java
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
    
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/GzipOutputFilter.java?rev=1816712&r1=1816711&r2=1816712&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
 Thu Nov 30 13:41:20 2017
@@ -25,6 +25,7 @@ import org.apache.coyote.OutputBuffer;
 import org.apache.coyote.Response;
 import org.apache.coyote.http11.OutputFilter;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 
 /**
  * Gzip output filter.
@@ -74,7 +75,12 @@ public class GzipOutputFilter implements
     public int doWrite(ByteChunk chunk, Response res)
         throws IOException {
         if (compressionStream == null) {
-            compressionStream = new 
FlushableGZIPOutputStream(fakeOutputStream);
+            if (JreCompat.isJre7Available()) {
+                compressionStream =
+                        
JreCompat.getInstance().getFlushableGZipOutputStream(fakeOutputStream);
+            } else {
+                compressionStream = new 
FlushableGZIPOutputStream(fakeOutputStream);
+            }
         }
         compressionStream.write(chunk.getBytes(), chunk.getStart(), 
                                 chunk.getLength());

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre7Compat.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre7Compat.java?rev=1816712&r1=1816711&r2=1816712&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre7Compat.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre7Compat.java Thu 
Nov 30 13:41:20 2017
@@ -16,27 +16,34 @@
  */
 package org.apache.tomcat.util.compat;
 
+import java.io.OutputStream;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Locale;
+import java.util.zip.GZIPOutputStream;
 
 class Jre7Compat extends JreCompat {
 
     private static final int RUNTIME_MAJOR_VERSION = 7;
 
     private static final Method forLanguageTagMethod;
+    private static final Constructor<GZIPOutputStream> 
gzipOutputStreamConstructor;
 
 
     static {
         Method m = null;
+        Constructor<GZIPOutputStream> c = null;
         try {
             m = Locale.class.getMethod("forLanguageTag", String.class);
+            c = GZIPOutputStream.class.getConstructor(OutputStream.class, 
boolean.class);
         } catch (SecurityException e) {
             // Should never happen
         } catch (NoSuchMethodException e) {
             // Expected on Java < 7
         }
         forLanguageTagMethod = m;
+        gzipOutputStreamConstructor = c;
     }
 
 
@@ -58,6 +65,22 @@ class Jre7Compat extends JreCompat {
         }
     }
 
+
+    @Override
+    public GZIPOutputStream getFlushableGZipOutputStream(OutputStream os) {
+        try {
+            return gzipOutputStreamConstructor.newInstance(os, Boolean.TRUE);
+        } catch (InstantiationException e) {
+            throw new UnsupportedOperationException(e);
+        } catch (IllegalAccessException e) {
+            throw new UnsupportedOperationException(e);
+        } catch (IllegalArgumentException e) {
+            throw new UnsupportedOperationException(e);
+        } catch (InvocationTargetException e) {
+            throw new UnsupportedOperationException(e);
+        }
+    }
+
 
     @Override
     public int jarFileRuntimeMajorVersion() {

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java?rev=1816712&r1=1816711&r2=1816712&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java Thu 
Nov 30 13:41:20 2017
@@ -18,11 +18,13 @@ package org.apache.tomcat.util.compat;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.Deque;
 import java.util.Locale;
 import java.util.jar.JarFile;
+import java.util.zip.GZIPOutputStream;
 
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLServerSocket;
@@ -55,8 +57,7 @@ public class JreCompat {
             jre9Available = true;
             jre8Available = true;
             jre7Available = true;
-        }
-        else if (Jre8Compat.isSupported()) {
+        } else if (Jre8Compat.isSupported()) {
             instance = new Jre8Compat();
             jre9Available = false;
             jre8Available = true;
@@ -127,6 +128,12 @@ public class JreCompat {
         return true;
     }
 
+    
+    @SuppressWarnings("unused")
+    public GZIPOutputStream getFlushableGZipOutputStream(OutputStream os) {
+        throw new UnsupportedOperationException(
+                sm.getString("jreCompat.noFlushableGzipOutputStream"));
+    }
 
     // Java 6 implementation of Java 8 methods
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties?rev=1816712&r1=1816711&r2=1816712&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties 
Thu Nov 30 13:41:20 2017
@@ -13,6 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+jreCompat.noFlushableGzipOutputStream=Java Runtime does not support flushable 
GZIP output streams. You must use Java 7 or later to use this feature.
 jreCompat.noServerCipherSuiteOrder=Java Runtime does not support 
"useServerCipherSuitesOrder". You must use Java 8 or later to use this feature.
 
 jre9Compat.invalidModuleUri=The module URI provided [{0}] could not be 
converted to a URL for the JarScanner to process

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1816712&r1=1816711&r2=1816712&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu Nov 30 13:41:20 2017
@@ -100,6 +100,17 @@
       </fix>
     </changelog>
   </subsection>
+  <subsection name="Coyote">
+    <changelog>
+      <fix>
+        <bug>57870</bug>: When running on Java 7 or later, take advantage of 
the
+        new <code>syncFlush</code> parameter when constructing a
+        <code>GZIPOutputStream</code> rather than using the custom
+        <code>FlushableGZIPOutputStream</code> implementation as a work-around.
+        (markt)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Jasper">
     <changelog>
       <add>



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

Reply via email to