jetty.project
jetty.project copied to clipboard
XML parsing fails with jetty 10
old Jetty version used : 9.4.43.v20210629 New Jetty version : 10.0.12
I have Junit test written where below is returned as mock response and then parsed using org.eclipse.jetty.xml.XmlParser
org.apache.http.HttpEntity responseEntity = new org.apache.http.entity.StringEntity(
"\<VarrayCapacityDetail>\n" +
"\<Varray>\n" +
"\<VarrayId>\n" +
"urn:storageos:***:a19*******4f\n" +
"\</VarrayId>\n" +
"\<TotalCapacity>3</TotalCapacity>\n" +
"\<UsedCapacity>2</UsedCapacity>\n" +
"\</Varray>\n" +
"\</VarrayCapacityDetail>");
when(response.getEntity()).thenReturn(responseEntity);
InputStream stream = response.getEntity().getContent();
XmlParser.Node VArrayCapacitynode=null;
try {
VArrayCapacitynode = xmlParser.parse(stream);
} catch (SAXException e) {
e.printStackTrace();
_log.error("Error Occured in parsing the varray Capacity xml", e);
}
This works fine with jetty 9.4.43.v20210629 but fails with jetty 10.0.12 and gives below error
com.emc.storageos.data.ssmclientapp.util.DtQueryUtilTest > testGetVarray_success STANDARD_ERROR
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 24; cvc-elt.1.a: Cannot find the declaration of element 'VarrayCapacityDetail'.
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.error(ErrorHandlerWrapper.java:135)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:396)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284)
at java.xml/com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2132)
at java.xml/com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:829)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3063)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:836)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1216)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:324)
at org.eclipse.jetty.xml.XmlParser.parse(XmlParser.java:202)
at org.eclipse.jetty.xml.XmlParser.parse(XmlParser.java:251)
Your XML is badly formed as the TotalCapacity and UsedCapacity elements are not closed.
You also may need to turn off validation.
I fixed the XML and wrote the following, which works fine:
@Test
public void testIssue() throws Exception
{
XmlParser parser = new XmlParser();
parser.setValidating(false);
XmlParser.Node parsed = parser.parse(
new ByteArrayInputStream((
"<VarrayCapacityDetail>\n" +
"<Varray>\n" +
" <VarrayId>\n" +
" urn:storageos::a19****4f\n" +
" </VarrayId>\n" +
" <TotalCapacity>3</TotalCapacity>\n" +
" <UsedCapacity>2</UsedCapacity>\n" +
"</Varray>\n" +
"</VarrayCapacityDetail>").getBytes(StandardCharsets.ISO_8859_1)));
System.err.println(parsed);
}
This issue has been automatically marked as stale because it has been a full year without activity. It will be closed if no further activity occurs. Thank you for your contributions.
Closing, it works when you turn off validation.