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 > 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");