Skip to content

Commit 2606878

Browse files
Merge pull request #337 from brianquinlan/re_encode_bug
Fix a bug when zip encoding an already encoded file
2 parents 4a21eae + 100e363 commit 2606878

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

lib/src/zip_encoder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ class ZipEncoder {
194194
crc32 = getFileCrc32(file);
195195
}
196196
} else if (file.isCompressed &&
197-
file.compressionType == ArchiveFile.DEFLATE) {
197+
file.compressionType == ArchiveFile.DEFLATE &&
198+
file.rawContent != null) {
198199
// If the file is already compressed, no sense in uncompressing it and
199200
// compressing it again, just pass along the already compressed data.
200201
compressedData = file.rawContent;

test/tests/zip_test.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,27 @@ void main() {
498498
}
499499
});
500500

501+
test('encode already compressed file', () {
502+
final testArchive = Archive();
503+
testArchive.addFile(ArchiveFile('test', 3, [1, 2, 3])..compress = true);
504+
final testArchiveBytes =
505+
ZipEncoder().encode(testArchive, level: Deflate.BEST_COMPRESSION)!;
506+
507+
final decodedTestArchive = ZipDecoder().decodeBytes(testArchiveBytes);
508+
509+
// Verify that the archive file is already compressed and will be
510+
// compressed when re-encoded.
511+
expect(decodedTestArchive.files.single.isCompressed, true);
512+
expect(decodedTestArchive.files.single.compressionType, 8);
513+
expect(decodedTestArchive.files.single.compress, true);
514+
515+
final decodedTestArchiveBytes = ZipEncoder()
516+
.encode(decodedTestArchive, level: Deflate.BEST_COMPRESSION)!;
517+
518+
final verifyArchive = ZipDecoder().decodeBytes(decodedTestArchiveBytes);
519+
expect(verifyArchive.single.content, [1, 2, 3]);
520+
});
521+
501522
test('decode many files (100k)', () {
502523
final fp = InputFileStream(
503524
p.join(testDirPath, 'res/test_100k_files.zip'),

0 commit comments

Comments
 (0)