From e61bc7b89737f050469598443e1567b1be2de5ab Mon Sep 17 00:00:00 2001
From: Philipp Balzarek
Date: Wed, 17 Apr 2019 10:43:17 +0200
Subject: [PATCH] Disable compression for known 0-byte files
---
Codec/Archive/Zip/Conduit/Types.hs | 2 +-
Codec/Archive/Zip/Conduit/Zip.hs | 4 +++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/Codec/Archive/Zip/Conduit/Types.hs b/Codec/Archive/Zip/Conduit/Types.hs
index 9f2b1c6..ff2ef44 100644
--- a/Codec/Archive/Zip/Conduit/Types.hs
+++ b/Codec/Archive/Zip/Conduit/Types.hs
@@ -32,7 +32,7 @@ data ZipInfo = ZipInfo
data ZipEntry = ZipEntry
{ zipEntryName :: Either T.Text ByteString -- ^File name (in posix format, no leading slashes), either UTF-8 encoded text or raw bytes (CP437), with a trailing slash for directories
, zipEntryTime :: LocalTime -- ^Modification time
- , zipEntrySize :: Maybe Word64 -- ^Size of file data (if known); checked on zipping and also used as hint to enable zip64
+ , zipEntrySize :: Maybe Word64 -- ^Size of file data (if known); checked on zipping and also used as hint to enable zip64. Disables compression for known 0-byte files.
, zipEntryExternalAttributes :: Maybe Word32 -- ^Host-dependent attributes, often MS-DOS directory attribute byte (only supported when zipping)
} deriving (Eq, Show)
diff --git a/Codec/Archive/Zip/Conduit/Zip.hs b/Codec/Archive/Zip/Conduit/Zip.hs
index bceea26..a802ac5 100644
--- a/Codec/Archive/Zip/Conduit/Zip.hs
+++ b/Codec/Archive/Zip/Conduit/Zip.hs
@@ -120,7 +120,9 @@ zipStream ZipOptions{..} = execStateC 0 $ do
entry (ZipEntry{..}, zipData -> dat) = do
let usiz = dataSize dat
sdat = left ((C..| sizeCRC) . C.toProducer) dat
- comp = zipOptCompressLevel /= 0 && all (0 /=) usiz
+ comp = zipOptCompressLevel /= 0
+ && all (0 /=) usiz
+ && all (0 /=) zipEntrySize
(cdat, csiz)
| comp =
( ((`C.fuseBoth` (outputSize $ CZ.compress zipOptCompressLevel deflateWindowBits))