You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2015/05/23 17:05:43 UTC

svn commit: r1681356 - in /commons/proper/compress/trunk/src: changes/ main/java/org/apache/commons/compress/compressors/ main/java/org/apache/commons/compress/compressors/deflate/ test/java/org/apache/commons/compress/compressors/

Author: bodewig
Date: Sat May 23 15:05:43 2015
New Revision: 1681356

URL: http://svn.apache.org/r1681356
Log:
COMPRESS-316 detect DEFLATE streams with ZLIB header, submitted by Nick Burch

Modified:
    commons/proper/compress/trunk/src/changes/changes.xml
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
    commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java

Modified: commons/proper/compress/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1681356&r1=1681355&r2=1681356&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/changes/changes.xml (original)
+++ commons/proper/compress/trunk/src/changes/changes.xml Sat May 23 15:05:43 2015
@@ -54,6 +54,11 @@ breaks backwards compatibility for code
 This also changes the superclass of ZCompressorInputStream.    
 ">
 
+      <action issue="COMPRESS-316" type="add" date="2015-05-23"
+              due-to=""Nick Burch">
+        CompressorStreamFactory can now auto-detect DEFLATE streams
+        with ZLIB header.
+      </action>
       <action issue="COMPRESS-314" type="fix" date="2015-05-08">
         TarArchiveInputStream can now read entries with group or
         user ids &gt; 0x80000000.

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java?rev=1681356&r1=1681355&r2=1681356&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java Sat May 23 15:05:43 2015
@@ -237,6 +237,10 @@ public class CompressorStreamFactory {
                 return new ZCompressorInputStream(in);
             }
 
+            if (DeflateCompressorInputStream.matches(signature, signatureLength)) {
+                return new DeflateCompressorInputStream(in);
+            }
+
             if (XZUtils.matches(signature, signatureLength) &&
                 XZUtils.isXZCompressionAvailable()) {
                 return new XZCompressorInputStream(in, decompressConcatenated);

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java?rev=1681356&r1=1681355&r2=1681356&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java Sat May 23 15:05:43 2015
@@ -30,6 +30,12 @@ import org.apache.commons.compress.compr
  * @since 1.9
  */
 public class DeflateCompressorInputStream extends CompressorInputStream {
+    private static final int MAGIC_1 = 0x78;
+    private static final int MAGIC_2a = 0x01;
+    private static final int MAGIC_2b = 0x5e;
+    private static final int MAGIC_2c = 0x9c;
+    private static final int MAGIC_2d = 0xda;
+    
     private final InputStream in;
 
     /**
@@ -88,4 +94,25 @@ public class DeflateCompressorInputStrea
     public void close() throws IOException {
         in.close();
     }
+    
+    /**
+     * Checks if the signature matches what is expected for a zlib / deflated file
+     *  with the zlib header.
+     * 
+     * @param signature
+     *            the bytes to check
+     * @param length
+     *            the number of bytes to check
+     * @return true, if this stream is zlib / deflate compressed with a header
+     * stream, false otherwise
+     * 
+     * @since 1.9
+     */
+    public static boolean matches(byte[] signature, int length) {
+        return length > 3 && signature[0] == MAGIC_1 && (
+                signature[1] == (byte) MAGIC_2a ||
+                signature[1] == (byte) MAGIC_2b ||
+                signature[1] == (byte) MAGIC_2c ||
+                signature[1] == (byte) MAGIC_2d);
+    }
 }

Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java?rev=1681356&r1=1681355&r2=1681356&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java (original)
+++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java Sat May 23 15:05:43 2015
@@ -30,6 +30,7 @@ import org.apache.commons.compress.compr
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.compressors.CompressorStreamFactory;
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
+import org.apache.commons.compress.compressors.deflate.DeflateCompressorInputStream;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
 import org.apache.commons.compress.compressors.pack200.Pack200CompressorInputStream;
 import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
@@ -104,6 +105,10 @@ public final class DetectCompressorTestC
         assertNotNull(xz);
         assertTrue(xz instanceof XZCompressorInputStream);
 
+        CompressorInputStream zlib = getStreamFor("bla.tar.deflatez");
+        assertNotNull(zlib);
+        assertTrue(zlib instanceof DeflateCompressorInputStream);
+
         try {
             factory.createCompressorInputStream(new ByteArrayInputStream(new byte[0]));
             fail("No exception thrown for an empty input stream");