You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2021/03/16 19:26:38 UTC

[tika] branch main updated: TIKA-3316 -- fix for slightly different behavior of RereadableInputStream

This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new ba9bcb2  TIKA-3316 -- fix for slightly different behavior of RereadableInputStream
ba9bcb2 is described below

commit ba9bcb2559a0aed0351a0ea338de3f6f60542bfe
Author: tallison <ta...@apache.org>
AuthorDate: Tue Mar 16 15:26:20 2021 -0400

    TIKA-3316 -- fix for slightly different behavior of RereadableInputStream
---
 .../microsoft/ooxml/OOXMLExtractorFactory.java     |  3 +-
 .../parser/microsoft/ooxml/xps/XPSParserTest.java  |  7 ++--
 .../org/apache/tika/zip/utils/ZipSalvager.java     | 42 +++++++++++++---------
 3 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
index baadeaa..cc81c99 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.util.Locale;
 
 import org.apache.commons.compress.archivers.zip.UnsupportedZipFeatureException;
+import org.apache.commons.io.input.CloseShieldInputStream;
 import org.apache.poi.ooxml.POIXMLDocument;
 import org.apache.poi.ooxml.extractor.ExtractorFactory;
 import org.apache.poi.ooxml.extractor.POIXMLTextExtractor;
@@ -107,7 +108,7 @@ public class OOXMLExtractorFactory {
                 try (RereadableInputStream rereadableInputStream =
                         new RereadableInputStream(stream, MAX_BUFFER_LENGTH, false)) {
                     try {
-                        pkg = OPCPackage.open(rereadableInputStream);
+                        pkg = OPCPackage.open(new CloseShieldInputStream(rereadableInputStream));
                     } catch (EOFException e) {
                         rereadableInputStream.rewind();
                         tmpRepairedCopy = File.createTempFile("tika-ooxml-repair-", "");
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java
index 9c3ae65..d154a05 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java
@@ -19,7 +19,6 @@ package org.apache.tika.parser.microsoft.ooxml.xps;
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
-import org.apache.tika.sax.AbstractRecursiveParserWrapperHandler;
 import org.junit.Test;
 
 import java.io.ByteArrayInputStream;
@@ -102,7 +101,8 @@ public class XPSParserTest extends TikaTest {
     @Test
     public void testXPSWithDataDescriptor() throws Exception {
         Path path = Paths.get(
-                XPSParserTest.class.getResource("/test-documents/testXPSWithDataDescriptor.xps").toURI());
+                XPSParserTest.class.getResource(
+                        "/test-documents/testXPSWithDataDescriptor.xps").toURI());
         //test both path and stream based
         List<Metadata> metadataList = getRecursiveMetadata(path, true);
         assertEquals(2, metadataList.size());
@@ -123,7 +123,8 @@ public class XPSParserTest extends TikaTest {
     @Test
     public void testOpenXPSWithDataDescriptor() throws Exception {
         Path path = Paths.get(
-                XPSParserTest.class.getResource("/test-documents/testXPSWithDataDescriptor2.xps").toURI());
+                XPSParserTest.class.getResource(
+                        "/test-documents/testXPSWithDataDescriptor2.xps").toURI());
         List<Metadata> metadataList = getRecursiveMetadata(path, true);
         assertEquals(2, metadataList.size());
         assertContains("How was I supposed to know",
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java
index f39ef91..92f51c6 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java
@@ -28,10 +28,12 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
 import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.commons.io.IOUtils;
-import org.apache.tika.utils.RereadableInputStream;
+import org.apache.commons.io.input.CloseShieldInputStream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.tika.utils.RereadableInputStream;
+
 public class ZipSalvager {
 
     private static final Logger LOG = LoggerFactory.getLogger(ZipSalvager.class);
@@ -42,25 +44,29 @@ public class ZipSalvager {
      * may be truncated, but the result should be a valid zip file.
      * <p>
      * This does nothing fancy to fix the underlying broken zip.
+     * <p>
+     * This will close the inputstream
      *
      * @param brokenZip
      * @param salvagedZip
      */
-    public static void salvageCopy(InputStream brokenZip, File salvagedZip, boolean allowStoredEntries) throws IOException {
-        if (!(brokenZip instanceof RereadableInputStream)) {
-            brokenZip = new RereadableInputStream(brokenZip, 50000,
-                    true);
-        }
+    public static void salvageCopy(InputStream brokenZip, File salvagedZip,
+                                   boolean allowStoredEntries) throws IOException {
+
         try {
+            if (!(brokenZip instanceof RereadableInputStream)) {
+                brokenZip = new RereadableInputStream(brokenZip, 50000, true);
+            }
+
             try (ZipArchiveOutputStream outputStream = new ZipArchiveOutputStream(salvagedZip);
-                 ZipArchiveInputStream zipArchiveInputStream = new ZipArchiveInputStream(brokenZip,
+                 ZipArchiveInputStream zipArchiveInputStream = new ZipArchiveInputStream(
+                         new CloseShieldInputStream(brokenZip),
                          "UTF8", false, allowStoredEntries)) {
                 ZipArchiveEntry zae = zipArchiveInputStream.getNextZipEntry();
                 try {
                     processZAE(zae, zipArchiveInputStream, outputStream);
                 } catch (UnsupportedZipFeatureException uzfe) {
-                    if (uzfe.getFeature() ==
-                            UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR) {
+                    if (uzfe.getFeature() == UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR) {
                         //percolate up to allow for retry
                         throw uzfe;
                     }
@@ -71,17 +77,19 @@ public class ZipSalvager {
                 outputStream.flush();
                 outputStream.finish();
             } catch (UnsupportedZipFeatureException e) {
-                //percolate up to allow for retry
-                throw e;
+                //now retry
+                if (allowStoredEntries == false && e.getFeature() ==
+                        UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR) {
+                    ((RereadableInputStream) brokenZip).rewind();
+                    salvageCopy(brokenZip, salvagedZip, true);
+                } else {
+                    throw e;
+                }
             } catch (IOException e) {
                 LOG.warn("problem fixing zip", e);
             }
-        } catch (UnsupportedZipFeatureException e) {
-            //now retry
-            if (allowStoredEntries == false) {
-                ((RereadableInputStream) brokenZip).rewind();
-                salvageCopy(brokenZip, salvagedZip, true);
-            }
+        } finally {
+            brokenZip.close();
         }
     }