mayur mohan created CAMEL-24406:
-----------------------------------
Summary: camel-xml-jaxp: XmlConverter.toDOMDocument throws
SAXParseException for non-XML content (Content is not allowed in prolog)
Key: CAMEL-24406
URL: https://issues.apache.org/jira/browse/CAMEL-24406
Project: Camel
Issue Type: Improvement
Components: camel-core-xml
Reporter: mayur mohan
h2. Problem
When a ByteArrayInputStreamCache (or byte[]) carrying a non-XML response body
(empty body, JSON error page, plain-text HTTP response, BOM-only) is passed to
XmlConverter.toDOMDocument, the JDK XML parser throws:
{noformat}
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not
allowed in prolog.
{noformat}
Surfaced as:
{noformat}
Cannot read from xml stream. Reason: Error during type conversion from type:
org.apache.camel.converter.stream.ByteArrayInputStreamCache to the required
type: org.w3c.dom.Document ... due to org.xml.sax.SAXParseException: Content is
not allowed in prolog.
{noformat}
h2. Stack Trace
{noformat}
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not
allowed in prolog.
at
java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
at
java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
at
java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
at
java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:978)
at
java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:122)
at
org.apache.camel.converter.jaxp.XmlConverter.toDOMDocument(XmlConverter.java:661)
at
org.apache.camel.converter.jaxp.CamelXmlJaxpBulkConverterLoader.doConvertTo(CamelXmlJaxpBulkConverterLoader.java:317)
at
org.apache.camel.converter.jaxp.CamelXmlJaxpBulkConverterLoader.convertTo(CamelXmlJaxpBulkConverterLoader.java:51)
at
org.apache.camel.spi.BulkTypeConverters.convertTo(BulkTypeConverters.java:122)
at
org.apache.camel.component.cxf.converter.CxfPayloadConverter.convertTo(CxfPayloadConverter.java:165)
at
org.apache.camel.component.cxf.converter.CxfPayloadConverterLoader.lambda(CxfPayloadConverterLoader.java:68)
at
org.apache.camel.support.SimpleTypeConverter.convertTo(SimpleTypeConverter.java:101)
at
org.apache.camel.impl.converter.CoreTypeConverterRegistry.doConvertTo(CoreTypeConverterRegistry.java:516)
at
org.apache.camel.impl.converter.CoreTypeConverterRegistry.convertTo(CoreTypeConverterRegistry.java:203)
at
org.apache.camel.core.osgi.OsgiTypeConverter.convertTo(OsgiTypeConverter.java:138)
at org.apache.camel.support.MessageSupport.getBody(MessageSupport.java:96)
at
org.apache.camel.component.cxf.DefaultCxfBinding.getBodyFromCamel(DefaultCxfBinding.java:1019)
at
org.apache.camel.component.cxf.DefaultCxfBinding.populateCxfResponseFromExchange(DefaultCxfBinding.java:461)
at
org.apache.camel.component.cxf.CxfConsumer.CxfConsumerInvoker.setResponseBack(CxfConsumer.java:324)
at
org.apache.camel.component.cxf.CxfConsumer.CxfConsumerInvoker.syncInvoke(CxfConsumer.java:248)
{noformat}
h2. Root Cause
XmlConverter.toDOMDocument(byte[], Exchange) and toDOMDocument(StreamCache,
Exchange) pass the content directly to DocumentBuilder.parse() without first
checking whether it could plausibly be XML. Any content whose first
non-whitespace byte is not < causes an immediate SAXParseException deep inside
the JDK parser.
h2. Fix
Add a cheap static looksLikeXml(byte[]) helper that inspects only the first few
bytes (handles UTF-8 BOM, UTF-16 BE/LE BOM, leading whitespace). Guard the two
toDOMDocument overloads that take byte[] and StreamCache to return null when
content is definitely not XML. Use @Converter(allowNull = true) so the Camel
type-converter framework falls through gracefully.
h2. Files Changed
core/camel-xml-jaxp/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java
core/camel-xml-jaxp/src/test/java/org/apache/camel/converter/jaxp/XmlConverterPrologTest.java
(new, 13 tests)
h2. Test Results
{noformat}
Tests run: 13, Failures: 0, Errors: 0, Skipped: 0 [JDK 21 / Maven 3.9]
BUILD SUCCESS
{noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)