OIE bug: POST /api/channels accepts a structurally-invalid channel; it deploys "healthy" but sends corrupt content
Component: REST API — ChannelServlet POST /api/channels
Version observed: Open Integration Engine 4.5.2 (openintegrationengine/engine:4.5.2-alpine)
Severity: data-integrity — a channel that reports deployed and healthy silently sends corrupt messages.
Scope: reproduces on a stock OIE with no extensions installed, using the built-in TCP Sender.
The issue
POST /api/channels accepts a channel whose XML is structurally incomplete/invalid — it neither
validates/rejects it nor normalizes it. The server then deploys it (channel and destination both STARTED,
no warnings), but the destination sends the message content as the literal string undefined on the
wire — a corrupt message — with no error anywhere.
Opening the same channel in the Administrator and saving it (which normalizes the config) fixes it. That
confirms the POSTed config was genuinely invalid and that the REST endpoint should have caught it — the
Administrator's create/save path validates/normalizes; the REST create path does neither.
What "invalid" means here
Compared with the Administrator-normalized version of the same channel, the accepted XML has:
| Field |
Accepted by REST |
Administrator-normalized |
transmissionModeProperties class |
com.mirth.connect.model.transmission.framemode.FrameModeProperties (base) |
com.mirth.connect.plugins.mllpmode.MLLPModeProperties (+ useMLLPv2/ackBytes/nackBytes/maxRetries) |
<pluginProperties/> on each connector |
absent |
present (empty) |
queueBufferSize |
0 |
1000 |
Correcting the transmission mode and queueBufferSize alone does not resolve the undefined output;
the Administrator's full normalization (which also adds <pluginProperties/>) does.
Reproduce
Stock OIE 4.5.2, no extensions, plus any MLLP listener at the destination's host:port:
POST /api/channels with the attached stock-channel-incomplete.xml (Channel Reader source →
built-in TCP Sender destination, template ${message.encodedData}). → HTTP 200 (accepted).
POST /api/channels/stock-hl7v2-test/_deploy. → 204, channel + destination STARTED, no warnings.
- Send any message — REST
POST /channels/{id}/messages?destinationMetaDataId=1 or the Administrator's
Send Message. → the listener receives the literal bytes undefined, not the message. Status SENT,
no error.
- Open the channel in the Administrator, make a trivial edit, save, redeploy. Repeat step 3 → the listener
now receives the correct message.
Observed here (stock OIE 4.5.2, no extensions): step 1 → HTTP 200; step 2 → 204, STARTED; step 3 →
listener received undefined.
Expected
POST /api/channels should reject a structurally-invalid channel with a clear error (or normalize it the
way the Administrator's save does) — not accept it, report it healthy, and silently emit corrupt content.
Attachment
stock-channel-incomplete.xml — the exact XML that was accepted.
stock-channel-incomplete.xml — the exact XML that was accepted
<channel version="4.5.2">
<id>stock-hl7v2-test</id>
<nextMetaDataId>1</nextMetaDataId>
<name>stock-hl7v2-test</name>
<revision>1</revision>
<sourceConnector version="4.5.2">
<metaDataId>0</metaDataId>
<name>sourceConnector</name>
<properties class="com.mirth.connect.connectors.vm.VmReceiverProperties" version="4.5.2">
<sourceConnectorProperties version="4.5.2">
<responseVariable>None</responseVariable>
<respondAfterProcessing>true</respondAfterProcessing>
<processBatch>false</processBatch>
<firstResponse>false</firstResponse>
<processingThreads>1</processingThreads>
<resourceIds class="linked-hash-map">
<entry>
<string>Default Resource</string>
<string>[Default Resource]</string>
</entry>
</resourceIds>
<queueBufferSize>0</queueBufferSize>
</sourceConnectorProperties>
</properties>
<transformer version="4.5.2">
<elements/>
<inboundDataType>HL7V2</inboundDataType>
<outboundDataType>HL7V2</outboundDataType>
<inboundProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeProperties" version="4.5.2">
<serializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2SerializationProperties" version="4.5.2">
<handleRepetitions>true</handleRepetitions>
<handleSubcomponents>true</handleSubcomponents>
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<stripNamespaces>false</stripNamespaces>
<segmentDelimiter>\r</segmentDelimiter>
<convertLineBreaks>true</convertLineBreaks>
</serializationProperties>
<deserializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DeserializationProperties" version="4.5.2">
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<segmentDelimiter>\r</segmentDelimiter>
</deserializationProperties>
<batchProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties" version="4.5.2">
<splitType>MSH_Segment</splitType>
<batchScript></batchScript>
</batchProperties>
<responseGenerationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseGenerationProperties" version="4.5.2">
<segmentDelimiter>\r</segmentDelimiter>
<successfulACKCode>AA</successfulACKCode>
<successfulACKMessage></successfulACKMessage>
<errorACKCode>AE</errorACKCode>
<errorACKMessage>An Error Occurred Processing Message.</errorACKMessage>
<rejectedACKCode>AR</rejectedACKCode>
<rejectedACKMessage>Message Rejected.</rejectedACKMessage>
<msh15ACKAccept>false</msh15ACKAccept>
<dateFormat>yyyyMMddHHmmss.SSS</dateFormat>
</responseGenerationProperties>
<responseValidationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseValidationProperties" version="4.5.2">
<successfulACKCode>AA,CA</successfulACKCode>
<errorACKCode>AE,CE</errorACKCode>
<rejectedACKCode>AR,CR</rejectedACKCode>
<validateMessageControlId>true</validateMessageControlId>
<originalMessageControlId>Destination_Encoded</originalMessageControlId>
<originalIdMapVariable></originalIdMapVariable>
</responseValidationProperties>
</inboundProperties>
<outboundProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeProperties" version="4.5.2">
<serializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2SerializationProperties" version="4.5.2">
<handleRepetitions>true</handleRepetitions>
<handleSubcomponents>true</handleSubcomponents>
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<stripNamespaces>false</stripNamespaces>
<segmentDelimiter>\r</segmentDelimiter>
<convertLineBreaks>true</convertLineBreaks>
</serializationProperties>
<deserializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DeserializationProperties" version="4.5.2">
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<segmentDelimiter>\r</segmentDelimiter>
</deserializationProperties>
<batchProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties" version="4.5.2">
<splitType>MSH_Segment</splitType>
<batchScript></batchScript>
</batchProperties>
<responseGenerationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseGenerationProperties" version="4.5.2">
<segmentDelimiter>\r</segmentDelimiter>
<successfulACKCode>AA</successfulACKCode>
<successfulACKMessage></successfulACKMessage>
<errorACKCode>AE</errorACKCode>
<errorACKMessage>An Error Occurred Processing Message.</errorACKMessage>
<rejectedACKCode>AR</rejectedACKCode>
<rejectedACKMessage>Message Rejected.</rejectedACKMessage>
<msh15ACKAccept>false</msh15ACKAccept>
<dateFormat>yyyyMMddHHmmss.SSS</dateFormat>
</responseGenerationProperties>
<responseValidationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseValidationProperties" version="4.5.2">
<successfulACKCode>AA,CA</successfulACKCode>
<errorACKCode>AE,CE</errorACKCode>
<rejectedACKCode>AR,CR</rejectedACKCode>
<validateMessageControlId>true</validateMessageControlId>
<originalMessageControlId>Destination_Encoded</originalMessageControlId>
<originalIdMapVariable></originalIdMapVariable>
</responseValidationProperties>
</outboundProperties>
</transformer>
<filter version="4.5.2">
<elements/>
</filter>
<transportName>Channel Reader</transportName>
<mode>SOURCE</mode>
<enabled>true</enabled>
<waitForPrevious>true</waitForPrevious>
</sourceConnector>
<destinationConnectors>
<connector version="4.5.2">
<metaDataId>1</metaDataId>
<name>Destination 1</name>
<properties class="com.mirth.connect.connectors.tcp.TcpDispatcherProperties" version="4.5.2">
<destinationConnectorProperties version="4.5.2">
<queueEnabled>true</queueEnabled>
<sendFirst>false</sendFirst>
<retryIntervalMillis>10000</retryIntervalMillis>
<regenerateTemplate>false</regenerateTemplate>
<retryCount>0</retryCount>
<rotate>false</rotate>
<includeFilterTransformer>false</includeFilterTransformer>
<threadCount>1</threadCount>
<threadAssignmentVariable></threadAssignmentVariable>
<validateResponse>true</validateResponse>
<resourceIds class="linked-hash-map">
<entry>
<string>Default Resource</string>
<string>[Default Resource]</string>
</entry>
</resourceIds>
<queueBufferSize>0</queueBufferSize>
<reattachAttachments>true</reattachAttachments>
</destinationConnectorProperties>
<transmissionModeProperties class="com.mirth.connect.model.transmission.framemode.FrameModeProperties">
<pluginPointName>MLLP</pluginPointName>
<startOfMessageBytes>0B</startOfMessageBytes>
<endOfMessageBytes>1C0D</endOfMessageBytes>
</transmissionModeProperties>
<serverMode>false</serverMode>
<remoteAddress>sink</remoteAddress>
<remotePort>6661</remotePort>
<overrideLocalBinding>false</overrideLocalBinding>
<localAddress>0.0.0.0</localAddress>
<localPort>0</localPort>
<sendTimeout>5000</sendTimeout>
<bufferSize>65536</bufferSize>
<maxConnections>10</maxConnections>
<keepConnectionOpen>false</keepConnectionOpen>
<checkRemoteHost>false</checkRemoteHost>
<responseTimeout>2000</responseTimeout>
<ignoreResponse>false</ignoreResponse>
<queueOnResponseTimeout>true</queueOnResponseTimeout>
<dataTypeBinary>false</dataTypeBinary>
<charsetEncoding>DEFAULT_ENCODING</charsetEncoding>
<template>${message.encodedData}</template>
</properties>
<transformer version="4.5.2">
<elements/>
<inboundDataType>HL7V2</inboundDataType>
<outboundDataType>HL7V2</outboundDataType>
<inboundProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeProperties" version="4.5.2">
<serializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2SerializationProperties" version="4.5.2">
<handleRepetitions>true</handleRepetitions>
<handleSubcomponents>true</handleSubcomponents>
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<stripNamespaces>false</stripNamespaces>
<segmentDelimiter>\r</segmentDelimiter>
<convertLineBreaks>true</convertLineBreaks>
</serializationProperties>
<deserializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DeserializationProperties" version="4.5.2">
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<segmentDelimiter>\r</segmentDelimiter>
</deserializationProperties>
<batchProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties" version="4.5.2">
<splitType>MSH_Segment</splitType>
<batchScript></batchScript>
</batchProperties>
<responseGenerationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseGenerationProperties" version="4.5.2">
<segmentDelimiter>\r</segmentDelimiter>
<successfulACKCode>AA</successfulACKCode>
<successfulACKMessage></successfulACKMessage>
<errorACKCode>AE</errorACKCode>
<errorACKMessage>An Error Occurred Processing Message.</errorACKMessage>
<rejectedACKCode>AR</rejectedACKCode>
<rejectedACKMessage>Message Rejected.</rejectedACKMessage>
<msh15ACKAccept>false</msh15ACKAccept>
<dateFormat>yyyyMMddHHmmss.SSS</dateFormat>
</responseGenerationProperties>
<responseValidationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseValidationProperties" version="4.5.2">
<successfulACKCode>AA,CA</successfulACKCode>
<errorACKCode>AE,CE</errorACKCode>
<rejectedACKCode>AR,CR</rejectedACKCode>
<validateMessageControlId>true</validateMessageControlId>
<originalMessageControlId>Destination_Encoded</originalMessageControlId>
<originalIdMapVariable></originalIdMapVariable>
</responseValidationProperties>
</inboundProperties>
<outboundProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeProperties" version="4.5.2">
<serializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2SerializationProperties" version="4.5.2">
<handleRepetitions>true</handleRepetitions>
<handleSubcomponents>true</handleSubcomponents>
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<stripNamespaces>false</stripNamespaces>
<segmentDelimiter>\r</segmentDelimiter>
<convertLineBreaks>true</convertLineBreaks>
</serializationProperties>
<deserializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DeserializationProperties" version="4.5.2">
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<segmentDelimiter>\r</segmentDelimiter>
</deserializationProperties>
<batchProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties" version="4.5.2">
<splitType>MSH_Segment</splitType>
<batchScript></batchScript>
</batchProperties>
<responseGenerationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseGenerationProperties" version="4.5.2">
<segmentDelimiter>\r</segmentDelimiter>
<successfulACKCode>AA</successfulACKCode>
<successfulACKMessage></successfulACKMessage>
<errorACKCode>AE</errorACKCode>
<errorACKMessage>An Error Occurred Processing Message.</errorACKMessage>
<rejectedACKCode>AR</rejectedACKCode>
<rejectedACKMessage>Message Rejected.</rejectedACKMessage>
<msh15ACKAccept>false</msh15ACKAccept>
<dateFormat>yyyyMMddHHmmss.SSS</dateFormat>
</responseGenerationProperties>
<responseValidationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseValidationProperties" version="4.5.2">
<successfulACKCode>AA,CA</successfulACKCode>
<errorACKCode>AE,CE</errorACKCode>
<rejectedACKCode>AR,CR</rejectedACKCode>
<validateMessageControlId>true</validateMessageControlId>
<originalMessageControlId>Destination_Encoded</originalMessageControlId>
<originalIdMapVariable></originalIdMapVariable>
</responseValidationProperties>
</outboundProperties>
</transformer>
<responseTransformer version="4.5.2">
<elements/>
<inboundDataType>HL7V2</inboundDataType>
<outboundDataType>HL7V2</outboundDataType>
<inboundProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeProperties" version="4.5.2">
<serializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2SerializationProperties" version="4.5.2">
<handleRepetitions>true</handleRepetitions>
<handleSubcomponents>true</handleSubcomponents>
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<stripNamespaces>false</stripNamespaces>
<segmentDelimiter>\r</segmentDelimiter>
<convertLineBreaks>true</convertLineBreaks>
</serializationProperties>
<deserializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DeserializationProperties" version="4.5.2">
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<segmentDelimiter>\r</segmentDelimiter>
</deserializationProperties>
<batchProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties" version="4.5.2">
<splitType>MSH_Segment</splitType>
<batchScript></batchScript>
</batchProperties>
<responseGenerationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseGenerationProperties" version="4.5.2">
<segmentDelimiter>\r</segmentDelimiter>
<successfulACKCode>AA</successfulACKCode>
<successfulACKMessage></successfulACKMessage>
<errorACKCode>AE</errorACKCode>
<errorACKMessage>An Error Occurred Processing Message.</errorACKMessage>
<rejectedACKCode>AR</rejectedACKCode>
<rejectedACKMessage>Message Rejected.</rejectedACKMessage>
<msh15ACKAccept>false</msh15ACKAccept>
<dateFormat>yyyyMMddHHmmss.SSS</dateFormat>
</responseGenerationProperties>
<responseValidationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseValidationProperties" version="4.5.2">
<successfulACKCode>AA,CA</successfulACKCode>
<errorACKCode>AE,CE</errorACKCode>
<rejectedACKCode>AR,CR</rejectedACKCode>
<validateMessageControlId>true</validateMessageControlId>
<originalMessageControlId>Destination_Encoded</originalMessageControlId>
<originalIdMapVariable></originalIdMapVariable>
</responseValidationProperties>
</inboundProperties>
<outboundProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeProperties" version="4.5.2">
<serializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2SerializationProperties" version="4.5.2">
<handleRepetitions>true</handleRepetitions>
<handleSubcomponents>true</handleSubcomponents>
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<stripNamespaces>false</stripNamespaces>
<segmentDelimiter>\r</segmentDelimiter>
<convertLineBreaks>true</convertLineBreaks>
</serializationProperties>
<deserializationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DeserializationProperties" version="4.5.2">
<useStrictParser>false</useStrictParser>
<useStrictValidation>false</useStrictValidation>
<segmentDelimiter>\r</segmentDelimiter>
</deserializationProperties>
<batchProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties" version="4.5.2">
<splitType>MSH_Segment</splitType>
<batchScript></batchScript>
</batchProperties>
<responseGenerationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseGenerationProperties" version="4.5.2">
<segmentDelimiter>\r</segmentDelimiter>
<successfulACKCode>AA</successfulACKCode>
<successfulACKMessage></successfulACKMessage>
<errorACKCode>AE</errorACKCode>
<errorACKMessage>An Error Occurred Processing Message.</errorACKMessage>
<rejectedACKCode>AR</rejectedACKCode>
<rejectedACKMessage>Message Rejected.</rejectedACKMessage>
<msh15ACKAccept>false</msh15ACKAccept>
<dateFormat>yyyyMMddHHmmss.SSS</dateFormat>
</responseGenerationProperties>
<responseValidationProperties class="com.mirth.connect.plugins.datatypes.hl7v2.HL7v2ResponseValidationProperties" version="4.5.2">
<successfulACKCode>AA,CA</successfulACKCode>
<errorACKCode>AE,CE</errorACKCode>
<rejectedACKCode>AR,CR</rejectedACKCode>
<validateMessageControlId>true</validateMessageControlId>
<originalMessageControlId>Destination_Encoded</originalMessageControlId>
<originalIdMapVariable></originalIdMapVariable>
</responseValidationProperties>
</outboundProperties>
</responseTransformer>
<filter version="4.5.2">
<elements/>
</filter>
<transportName>TCP Sender</transportName>
<mode>DESTINATION</mode>
<enabled>true</enabled>
<waitForPrevious>true</waitForPrevious>
</connector>
</destinationConnectors>
<properties version="4.5.2">
<clearGlobalChannelMap>true</clearGlobalChannelMap>
<messageStorageMode>DEVELOPMENT</messageStorageMode>
<encryptData>false</encryptData>
<encryptAttachments>false</encryptAttachments>
<encryptCustomMetaData>false</encryptCustomMetaData>
<removeContentOnCompletion>false</removeContentOnCompletion>
<removeOnlyFilteredOnCompletion>false</removeOnlyFilteredOnCompletion>
<removeAttachmentsOnCompletion>false</removeAttachmentsOnCompletion>
<initialState>STARTED</initialState>
<storeAttachments>true</storeAttachments>
<metaDataColumns/>
<attachmentProperties version="4.5.2">
<type>None</type>
<properties/>
</attachmentProperties>
<resourceIds class="linked-hash-map">
<entry>
<string>Default Resource</string>
<string>[Default Resource]</string>
</entry>
</resourceIds>
</properties>
</channel>
OIE bug:
POST /api/channelsaccepts a structurally-invalid channel; it deploys "healthy" but sends corrupt contentComponent: REST API —
ChannelServletPOST /api/channelsVersion observed: Open Integration Engine 4.5.2 (
openintegrationengine/engine:4.5.2-alpine)Severity: data-integrity — a channel that reports deployed and healthy silently sends corrupt messages.
Scope: reproduces on a stock OIE with no extensions installed, using the built-in TCP Sender.
The issue
POST /api/channelsaccepts a channel whose XML is structurally incomplete/invalid — it neithervalidates/rejects it nor normalizes it. The server then deploys it (channel and destination both
STARTED,no warnings), but the destination sends the message content as the literal string
undefinedon thewire — a corrupt message — with no error anywhere.
Opening the same channel in the Administrator and saving it (which normalizes the config) fixes it. That
confirms the POSTed config was genuinely invalid and that the REST endpoint should have caught it — the
Administrator's create/save path validates/normalizes; the REST create path does neither.
What "invalid" means here
Compared with the Administrator-normalized version of the same channel, the accepted XML has:
transmissionModeProperties classcom.mirth.connect.model.transmission.framemode.FrameModeProperties(base)com.mirth.connect.plugins.mllpmode.MLLPModeProperties(+useMLLPv2/ackBytes/nackBytes/maxRetries)<pluginProperties/>on each connectorqueueBufferSize01000Correcting the transmission mode and
queueBufferSizealone does not resolve theundefinedoutput;the Administrator's full normalization (which also adds
<pluginProperties/>) does.Reproduce
Stock OIE 4.5.2, no extensions, plus any MLLP listener at the destination's
host:port:POST /api/channelswith the attachedstock-channel-incomplete.xml(Channel Reader source →built-in TCP Sender destination, template
${message.encodedData}). → HTTP 200 (accepted).POST /api/channels/stock-hl7v2-test/_deploy. → 204, channel + destinationSTARTED, no warnings.POST /channels/{id}/messages?destinationMetaDataId=1or the Administrator'sSend Message. → the listener receives the literal bytes
undefined, not the message. StatusSENT,no error.
now receives the correct message.
Observed here (stock OIE 4.5.2, no extensions): step 1 →
HTTP 200; step 2 →204,STARTED; step 3 →listener received
undefined.Expected
POST /api/channelsshould reject a structurally-invalid channel with a clear error (or normalize it theway the Administrator's save does) — not accept it, report it healthy, and silently emit corrupt content.
Attachment
stock-channel-incomplete.xml— the exact XML that was accepted.stock-channel-incomplete.xml— the exact XML that was accepted