COMPRESS-380 add DEFLATE64 support to ZipArchiveInputStream
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/ccc3067f Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/ccc3067f Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/ccc3067f Branch: refs/heads/master Commit: ccc3067f5216630d6c96f21f1ed2ef174aba9bd5 Parents: 07cc1a2 Author: Stefan Bodewig <bode...@apache.org> Authored: Fri Jan 5 06:52:55 2018 +0100 Committer: Stefan Bodewig <bode...@apache.org> Committed: Fri Jan 5 06:53:38 2018 +0100 ---------------------------------------------------------------------- .../archivers/zip/ZipArchiveInputStream.java | 11 ++++++++--- .../archivers/zip/ZipArchiveInputStreamTest.java | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-compress/blob/ccc3067f/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java index 54b69ae..5ea9c0a 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java @@ -34,6 +34,7 @@ import java.util.zip.ZipException; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveInputStream; import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream; +import org.apache.commons.compress.compressors.deflate64.Deflate64CompressorInputStream; import org.apache.commons.compress.utils.ArchiveUtils; import org.apache.commons.compress.utils.IOUtils; @@ -313,15 +314,18 @@ public class ZipArchiveInputStream extends ArchiveInputStream { current.entry.setStreamContiguous(true); if (current.entry.getCompressedSize() != ArchiveEntry.SIZE_UNKNOWN) { + InputStream bis = new BoundedInputStream(in, current.entry.getCompressedSize()); if (current.entry.getMethod() == ZipMethod.UNSHRINKING.getCode()) { - current.in = new UnshrinkingInputStream(new BoundedInputStream(in, current.entry.getCompressedSize())); + current.in = new UnshrinkingInputStream(bis); } else if (current.entry.getMethod() == ZipMethod.IMPLODING.getCode()) { current.in = new ExplodingInputStream( current.entry.getGeneralPurposeBit().getSlidingDictionarySize(), current.entry.getGeneralPurposeBit().getNumberOfShannonFanoTrees(), - new BoundedInputStream(in, current.entry.getCompressedSize())); + bis); } else if (current.entry.getMethod() == ZipMethod.BZIP2.getCode()) { - current.in = new BZip2CompressorInputStream(new BoundedInputStream(in, current.entry.getCompressedSize())); + current.in = new BZip2CompressorInputStream(bis); + } else if (current.entry.getMethod() == ZipMethod.ENHANCED_DEFLATED.getCode()) { + current.in = new Deflate64CompressorInputStream(bis); } } @@ -424,6 +428,7 @@ public class ZipArchiveInputStream extends ArchiveInputStream { read = readDeflated(buffer, offset, length); } else if (current.entry.getMethod() == ZipMethod.UNSHRINKING.getCode() || current.entry.getMethod() == ZipMethod.IMPLODING.getCode() + || current.entry.getMethod() == ZipMethod.ENHANCED_DEFLATED.getCode() || current.entry.getMethod() == ZipMethod.BZIP2.getCode()) { read = current.in.read(buffer, offset, length); } else { http://git-wip-us.apache.org/repos/asf/commons-compress/blob/ccc3067f/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java index a0a5c50..3bb62d5 100644 --- a/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java @@ -206,6 +206,22 @@ public class ZipArchiveInputStreamTest { } /** + * @see "https://issues.apache.org/jira/browse/COMPRESS-380" + */ + @Test + public void readDeflate64CompressedStream() throws Exception { + final File input = getFile("COMPRESS-380-input"); + final File archive = getFile("COMPRESS-380.zip"); + try (FileInputStream in = new FileInputStream(input); + ZipArchiveInputStream zin = new ZipArchiveInputStream(new FileInputStream(archive))) { + byte[] orig = IOUtils.toByteArray(in); + ZipArchiveEntry e = zin.getNextZipEntry(); + byte[] fromZip = IOUtils.toByteArray(zin); + assertArrayEquals(orig, fromZip); + } + } + + /** * Test case for * <a href="https://issues.apache.org/jira/browse/COMPRESS-364" * >COMPRESS-364</a>.