pentaho/pentaho-kettle · error · KettleXMLException
HTTPPOSTMeta.Exception.UnableToReadStepInfo
Error message
HTTPPOSTMeta.Exception.UnableToReadStepInfo
What it means
HTTPPOSTMeta.readData parses the step's XML node with XMLHandler; any Exception while reading the saved configuration (malformed XML structure, unexpected node types, class issues) is wrapped in a KettleXMLException with 'HTTPPOSTMeta.Exception.UnableToReadStepInfo'.
Solutions
- Open the .ktr in Spoon to see the detailed wrapped cause and offending step.
- Restore the transformation from version control/backup.
- Validate the XML well-formedness (xmllint) and repair the HTTPPOST step node.
- Recreate the HTTP POST step in a clean transformation and re-enter its settings.
- Align PDI versions — load with a version compatible with the file.
Example fix
// before (broken XML in .ktr) <result><name>response</name></fields> // after <result><name>response</name><code>response_code</code></result>
Defensive patterns
Strategy: try-catch
Validate before calling
Document doc = XMLHandler.loadXMLFile(new File("trans.ktr")); Try / catch
try {
meta.loadXML(stepNode, databases, metaStore);
} catch (KettleXMLException kxe) {
log.error("Read failed: " + kxe.getCause(), kxe);
// restore from backup or recreate the step
} Prevention
- Edit .ktr via Spoon, not by hand
- Keep transformations in version control
- Match PDI versions between authoring and runtime
When it happens
Trigger: loadXML -> readData processes a <step> node for an HTTPPOST step; an exception occurs reading tags (connection, url, fields, result nodes) at line 492, caught and rethrown as KettleXMLException.
Common situations: Hand-edited or truncated .ktr file; XML produced by a newer PDI version being loaded by an older one; corrupt file transfer; copy-paste of step XML with mismatched tags.
Understand the failure class
Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.
Related errors
- JsonInputMeta.Exception.ErrorLoadingXML
- SelectValuesMeta.Exception.UnableToReadStepInfoFromXML
- Unable to load step info from XML
- AddSequenceMeta.Exception.ErrorLoadingStepInfo
- AnalyticQueryMeta.Exception.UnableToLoadStepInfoFromXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/284040b41e5b4535.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/httppost/HTTPPOSTMeta.java:492
argumentHeader[i] = YES.equalsIgnoreCase( XMLHandler.getTagValue( anode, "header" ) );
}
int nrquery = XMLHandler.countNodes( lookup, "query" );
allocateQuery( nrquery );
for ( int i = 0; i < nrquery; i++ ) {
Node anode = XMLHandler.getSubNodeByNr( lookup, "query", i );
queryField[i] = XMLHandler.getTagValue( anode, "name" );
queryParameter[i] = XMLHandler.getTagValue( anode, "parameter" );
}
fieldName = XMLHandler.getTagValue( stepnode, "result", "name" ); // Optional, can be null
resultCodeFieldName = XMLHandler.getTagValue( stepnode, "result", "code" ); // Optional, can be null
responseTimeFieldName = XMLHandler.getTagValue( stepnode, "result", "response_time" ); // Optional, can be null
responseHeaderFieldName =
XMLHandler.getTagValue( stepnode, "result", "response_header" ); // Optional, can be null
} catch ( Exception e ) {
throw new KettleXMLException(
BaseMessages.getString( PKG, "HTTPPOSTMeta.Exception.UnableToReadStepInfo" ), e );
}
}
public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
try {
postafile = rep.getStepAttributeBoolean( id_step, "postafile" );
encoding = rep.getStepAttributeString( id_step, "encoding" );
url = rep.getStepAttributeString( id_step, "url" );
urlInField = rep.getStepAttributeBoolean( id_step, "urlInField" );
urlField = rep.getStepAttributeString( id_step, "urlField" );
requestEntity = rep.getStepAttributeString( id_step, "requestEntity" );
httpLogin = rep.getStepAttributeString( id_step, "httpLogin" );
httpPassword =
Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( id_step, "httpPassword" ) );
proxyHost = rep.getStepAttributeString( id_step, "proxyHost" );
proxyPort = rep.getStepAttributeString( id_step, "proxyPort" );
socketTimeout = rep.getStepAttributeString( id_step, "socketTimeout" );View on GitHub (pinned to f3058517a1)