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 2018/07/06 15:53:35 UTC
[tika] 01/02: improve htmlparser
This is an automated email from the ASF dual-hosted git repository.
tallison pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tika.git
commit 66417f619ba430f8c9e8ab0d903ebfecf936b071
Author: TALLISON <ta...@apache.org>
AuthorDate: Fri Jul 6 11:09:27 2018 -0400
improve htmlparser
---
.../java/org/apache/tika/io/TikaInputStream.java | 11 +++++++++-
.../org/apache/tika/parser/html/HtmlParser.java | 25 ++++++++++++++++++++++
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/tika-core/src/main/java/org/apache/tika/io/TikaInputStream.java b/tika-core/src/main/java/org/apache/tika/io/TikaInputStream.java
index 785acc7..96f922f 100644
--- a/tika-core/src/main/java/org/apache/tika/io/TikaInputStream.java
+++ b/tika-core/src/main/java/org/apache/tika/io/TikaInputStream.java
@@ -502,6 +502,8 @@ public class TikaInputStream extends TaggedInputStream {
*/
private Object openContainer;
+ private int consecutiveEOFs = 0;
+
/**
* Creates a TikaInputStream instance. This private constructor is used
* by the static factory methods based on the available information.
@@ -718,6 +720,7 @@ public class TikaInputStream extends TaggedInputStream {
super.reset();
position = mark;
mark = -1;
+ consecutiveEOFs = 0;
}
@Override
@@ -735,9 +738,15 @@ public class TikaInputStream extends TaggedInputStream {
}
@Override
- protected void afterRead(int n) {
+ protected void afterRead(int n) throws IOException {
if (n != -1) {
position += n;
+ } else {
+ consecutiveEOFs++;
+ if (consecutiveEOFs > 1000) {
+ throw new IOException("Read too many -1 (EOFs); there could be an infinite loop." +
+ "If you think your file is not corrupt, please open an issue on Tika's JIRA");
+ }
}
}
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/html/HtmlParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/html/HtmlParser.java
index a1ef0da..adf591a 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/html/HtmlParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/html/HtmlParser.java
@@ -29,6 +29,8 @@ import org.apache.tika.config.Field;
import org.apache.tika.detect.AutoDetectReader;
import org.apache.tika.detect.EncodingDetector;
import org.apache.tika.exception.TikaException;
+import org.apache.tika.io.TemporaryResources;
+import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AbstractEncodingDetectorParser;
@@ -40,6 +42,8 @@ import org.slf4j.LoggerFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
+import javax.swing.text.AbstractDocument;
+
/**
* HTML parser. Uses TagSoup to turn the input document to HTML SAX events,
* and post-processes the events to produce XHTML and metadata expected by
@@ -90,6 +94,27 @@ public class HtmlParser extends AbstractEncodingDetectorParser {
Metadata metadata, ParseContext context)
throws IOException, SAXException, TikaException {
+ TemporaryResources tmp = null;
+ try {
+ if (!TikaInputStream.isTikaInputStream(stream)) {
+ tmp = new TemporaryResources();
+ stream = TikaInputStream.get(stream, tmp);
+ }
+ //AutoDetectReader can throw exceptions during
+ //initialization. If we just created a
+ //TemporaryResources, we need to make sure to close it.
+ parseImpl(stream, handler, metadata, context);
+ } finally {
+ if (tmp != null) {
+ tmp.close();
+ }
+ }
+
+ }
+
+
+ private void parseImpl(InputStream stream, ContentHandler handler,
+ Metadata metadata, ParseContext context) throws IOException, SAXException, TikaException {
// Automatically detect the character encoding
try (AutoDetectReader reader = new AutoDetectReader(new CloseShieldInputStream(stream),
metadata, getEncodingDetector(context))) {