CAMEL-22294: camel-zipfile - decompression of multi-member archive. Thanks to Jens Kordowski for the patch.
diff --git a/components/camel-zip-deflater/src/main/java/org/apache/camel/dataformat/deflater/GzipDeflaterDataFormat.java b/components/camel-zip-deflater/src/main/java/org/apache/camel/dataformat/deflater/GzipDeflaterDataFormat.java
index 4f2700d..462052f 100644
--- a/components/camel-zip-deflater/src/main/java/org/apache/camel/dataformat/deflater/GzipDeflaterDataFormat.java
+++ b/components/camel-zip-deflater/src/main/java/org/apache/camel/dataformat/deflater/GzipDeflaterDataFormat.java
@@ -59,7 +59,7 @@
OutputStreamBuilder osb = OutputStreamBuilder.withExchange(exchange);
try {
- unzipInput = new GzipCompressorInputStream(inputStream);
+ unzipInput = new GzipCompressorInputStream(inputStream, true);
IOHelper.copy(unzipInput, osb);
return osb.build();
} finally {
diff --git a/components/camel-zip-deflater/src/test/java/org/apache/camel/dataformat/deflater/GzipDataFormatTest.java b/components/camel-zip-deflater/src/test/java/org/apache/camel/dataformat/deflater/GzipDataFormatTest.java
index 09e5684..b9a211e 100644
--- a/components/camel-zip-deflater/src/test/java/org/apache/camel/dataformat/deflater/GzipDataFormatTest.java
+++ b/components/camel-zip-deflater/src/test/java/org/apache/camel/dataformat/deflater/GzipDataFormatTest.java
@@ -17,6 +17,7 @@
package org.apache.camel.dataformat.deflater;
import java.io.ByteArrayInputStream;
+import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
@@ -80,4 +81,34 @@
result.assertIsSatisfied();
}
+
+ /* gzip file with two members, one containing the first 4 bytes of the uncompressed document
+ * and one containing the final 6 bytes of the payload.
+ * According to the RFC (https://www.rfc-editor.org/rfc/rfc1952#section-2.2) this is allowed.
+ */
+ @Test
+ public void testUnmarshalConcatenatedCompressedFiles() throws Exception {
+ context.addRoutes(new RouteBuilder() {
+ public void configure() {
+ from("direct:start")
+ .unmarshal().gzipDeflater()
+ .to("mock:result");
+ }
+ });
+ context.start();
+
+ byte[] gzBytes;
+ try (InputStream gzInput = getClass().getClassLoader().getResourceAsStream("concatenatedZippedFiles.gz")) {
+ assert gzInput != null : "concatenatedZippedFiles.gz not found in classpath";
+ gzBytes = gzInput.readAllBytes();
+ }
+
+ MockEndpoint result = context.getEndpoint("mock:result", MockEndpoint.class);
+ result.expectedMessageCount(1);
+ result.expectedBodiesReceived("foo\nfoobar\n".getBytes(StandardCharsets.UTF_8));
+
+ template.sendBody("direct:start", gzBytes);
+
+ result.assertIsSatisfied();
+ }
}
diff --git a/components/camel-zip-deflater/src/test/resources/concatenatedZippedFiles.gz b/components/camel-zip-deflater/src/test/resources/concatenatedZippedFiles.gz
new file mode 100644
index 0000000..979b225
--- /dev/null
+++ b/components/camel-zip-deflater/src/test/resources/concatenatedZippedFiles.gz
Binary files differ