pentaho/pentaho-kettle · error · KettleXMLException
HTTPMeta.Exception.UnableToReadStepInfo
HTTPMeta.Exception.UnableToReadStepInfo
Error message
HTTPMeta.Exception.UnableToReadStepInfo
What it means
HTTPMeta.loadXML fails to deserialize the step's configuration from the transformation XML. Any exception while reading tags via XMLHandler (in readData) is wrapped in a KettleXMLException 'HTTPMeta.Exception.UnableToReadStepInfo'.
Solutions
- Open the .ktr file and inspect the <step> XML for the HTTP step; fix malformed/missing tags (especially <result> section).
- Recreate the step in Spoon and re-save the transformation.
- Check Pentaho version compatibility of the transformation file.
- Validate the XML is well-formed (xmllint) before opening.
Example fix
// before <result><name/> <!-- code and response_time tags missing/corrupted --> // after <result> <name>result</name> <code>resultCode</code> <response_time>responseTime</response_time> <response_header>responseHeader</response_header> </result>
Defensive patterns
Strategy: try-catch
Validate before calling
// validate the .ktr XML is well-formed and contains the expected step tags before loading Document doc = XMLHandler.loadXMLFile( ktrFile ); if ( XMLHandler.getTagValue( doc, "transformation" ) == null ) throw new IllegalArgumentException( "not a transformation file" );
Try / catch
try { transMeta.loadXML( file, ... ); } catch ( KettleXMLException e ) {
logError( "Cannot read HTTP step info: " + e.getMessage(), e );
// fall back to recreating the step or loading a backup .ktr
} Prevention
- Never hand-edit .ktr XML without validating afterwards (xmllint)
- Keep transformation files under version control so a good copy is always available
- Match Pentaho versions when importing transformations from other environments
When it happens
Trigger: loadXML -> readData throws while calling XMLHandler.getTagValue on the <result>/<url>/<header> sections of the step node — corrupted or unexpected XML structure, wrong node passed, or malformed repository export file.
Common situations: Hand-edited or truncated .ktr file; transformation produced by a newer Pentaho version with schema changes; copy-pasted XML step node missing expected child tags.
Related errors
- ColumnExistsMeta.Exception.UnableToReadStepInfo
- CreditCardValidatorMeta.Exception.UnableToReadStepInfo
- CubeOutputMeta.Exception.UnableToLoadStepInfo
- DelayMeta.Exception.UnableToReadStepInfo
- DynamicSQLRowMeta.Exception.UnableToLoadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ffea550ab9086948.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/http/HTTPMeta.java:438
for ( int i = 0; i < nrargs; i++ ) {
Node anode = XMLHandler.getSubNodeByNr( lookup, "arg", i );
argumentField[i] = XMLHandler.getTagValue( anode, "name" );
argumentParameter[i] = XMLHandler.getTagValue( anode, "parameter" );
}
for ( int i = 0; i < nrheaders; i++ ) {
Node anode = XMLHandler.getSubNodeByNr( lookup, "header", i );
headerField[i] = XMLHandler.getTagValue( anode, "name" );
headerParameter[i] = XMLHandler.getTagValue( anode, "parameter" );
}
fieldName = XMLHandler.getTagValue( stepnode, "result", "name" );
resultCodeFieldName = XMLHandler.getTagValue( stepnode, "result", "code" );
responseTimeFieldName = XMLHandler.getTagValue( stepnode, "result", "response_time" );
responseHeaderFieldName = XMLHandler.getTagValue( stepnode, "result", "response_header" );
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "HTTPMeta.Exception.UnableToReadStepInfo" ), e );
}
}
public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
try {
url = rep.getStepAttributeString( id_step, "url" );
urlInField = rep.getStepAttributeBoolean( id_step, "urlInField" );
urlField = rep.getStepAttributeString( id_step, "urlField" );
encoding = rep.getStepAttributeString( id_step, "encoding" );
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" );
connectionTimeout = rep.getStepAttributeString( id_step, "connectionTimeout" );
closeIdleConnectionsTime = rep.getStepAttributeString( id_step, "closeIdleConnectionsTime" );
View on GitHub (pinned to f3058517a1)