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

tballison 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 119448b204 TIKA-5029: Asx texinfo parsing (#3591)
119448b204 is described below

commit 119448b2046764b7cb17f29147e08ec841c9dc5c
Author: Tim Allison <[email protected]>
AuthorDate: Mon Nov 9 17:12:36 2026 -0500

    TIKA-5029: Asx texinfo parsing (#3591)
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
 CHANGES.txt                                        |  4 ++++
 docs/modules/ROOT/partials/supported-formats.adoc  |  1 +
 .../org/apache/tika/mime/tika-mimetypes.xml        |  1 +
 .../apache/tika/parser/AutoDetectParserTest.java   | 28 ++++++++++++++++++++++
 .../org/apache/tika/parser/html/JSoupParser.java   |  4 +++-
 5 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index b8dab5dccd..3718dad971 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -104,6 +104,10 @@ Release 4.3.0 - ???
 
   EXTRACTION AND FORMATS
 
+   * ASX playlists (application/x-ms-asx) are parsed by JSoupParser; XMLParser 
failed on
+     many real ones (mixed-case or unclosed tags, raw '&', non-UTF-8 without a 
declaration).
+     Texinfo files are parsed as text; they produced no content (TIKA-5029).
+     
    * ISO-2022-JP is decoded as x-windows-50221, so NEC/IBM extension 
characters (circled
      numbers, Roman numerals) no longer become U+FFFD. ISO-8859-1, ISO-8859-9, 
TIS-620 and
      ISO-8859-11 decode as windows-1252, windows-1254 and windows-874, as 
browsers do, when a
diff --git a/docs/modules/ROOT/partials/supported-formats.adoc 
b/docs/modules/ROOT/partials/supported-formats.adoc
index 0f017d6b7c..6d7071db7c 100644
--- a/docs/modules/ROOT/partials/supported-formats.adoc
+++ b/docs/modules/ROOT/partials/supported-formats.adoc
@@ -98,6 +98,7 @@
 ** `application/vnd.mozilla.xul+xml`
 ** `application/vnd.wap.xhtml+xml`
 ** `application/x-asp`
+** `application/x-ms-asx`
 ** `application/xhtml+xml`
 ** `text/html`
 * `org.apache.tika.parser.http.` 
link:{tika-javadoc-url}/org/apache/tika/parser/http/HttpParser.html[HttpParser]
diff --git 
a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml 
b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
index d3079faabe..f2f793daab 100644
--- a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
+++ b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
@@ -6378,6 +6378,7 @@
     </magic>
     <glob pattern="*.texinfo"/>
     <glob pattern="*.texi"/>
+    <sub-class-of type="text/plain"/>
   </mime-type>
   <mime-type type="application/x-tex-virtual-font">
     <_comment>TeX Virtual Font format</_comment>
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
index 4e96457028..eac7aad0a3 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
@@ -401,6 +401,34 @@ public class AutoDetectParserTest extends TikaTest {
                 Arrays.asList(m.getValues(TikaCoreProperties.TIKA_PARSED_BY)));
     }
 
+    @Test
+    public void testMalformedAsx() throws Exception {
+        // shapes from Common Crawl: no declaration, windows-1252, raw '&', 
unclosed REF, mixed case
+        String asx = "<ASX version=\"3.0\">\n<TITLE>Café radio</TITLE>\n"
+                + "<AUTHOR>TBS RADIO & COMMUNICATIONS,Inc.</AUTHOR>\n<Entry>\n"
+                + "<REF 
HREF=\"mms://example.com/news/clip.wmv\">\n</ENTRY>\n</asx>\n";
+        Metadata m = new Metadata();
+        XMLResult r = getXML(TikaInputStream.get(asx.getBytes("windows-1252")),
+                AUTO_DETECT_PARSER, m);
+        assertEquals("application/x-ms-asx", m.get(HttpHeaders.CONTENT_TYPE));
+        assertContains("Café radio", r.xml);
+        assertContains("TBS RADIO &amp; COMMUNICATIONS", r.xml);
+        assertContains(JSoupParser.class.getName(),
+                Arrays.asList(m.getValues(TikaCoreProperties.TIKA_PARSED_BY)));
+    }
+
+    @Test
+    public void testTexinfoIsText() throws Exception {
+        String texi = "\\input texinfo\n@setfilename diff.info\n"
+                + "@settitle Comparing and Merging Files\n@bye\n";
+        Metadata m = new Metadata();
+        m.set(TikaCoreProperties.RESOURCE_NAME_KEY, "diff.texi");
+        String text = getText(TikaInputStream.get(texi.getBytes(UTF_8)), 
AUTO_DETECT_PARSER, m);
+        
assertTrue(m.get(HttpHeaders.CONTENT_TYPE).startsWith("application/x-texinfo"),
+                m.get(HttpHeaders.CONTENT_TYPE));
+        assertContains("Comparing and Merging Files", text);
+    }
+
     @Test
     public void testZeroByteFileException() throws Exception {
         String[] exts = new String[]{"xls", "doc", "pdf", "rtf"};
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
index 4a1c783cfe..5e5da5456b 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
@@ -89,9 +89,11 @@ public class JSoupParser extends 
AbstractEncodingDetectorParser {
     private static final MediaType X_ASP = MediaType.application("x-asp");
     // XUL leans on entities from chrome:// DTDs, which strict XML parsing 
rejects
     private static final MediaType XUL = 
MediaType.application("vnd.mozilla.xul+xml");
+    // ASX playlists are rarely well-formed: mixed-case tags, unclosed REFs, 
raw '&', no declaration
+    private static final MediaType ASX = MediaType.application("x-ms-asx");
 
     private static final Set<MediaType> SUPPORTED_TYPES = 
Collections.unmodifiableSet(
-            new HashSet<MediaType>(Arrays.asList(MediaType.text("html"), 
XHTML, WAP_XHTML, X_ASP, XUL)));
+            new HashSet<MediaType>(Arrays.asList(MediaType.text("html"), 
XHTML, WAP_XHTML, X_ASP, XUL, ASX)));
 
     private static final TagSet SELF_CLOSEABLE_TAGS = TagSet.Html();
 

Reply via email to