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

  1. Open the .ktr file and inspect the <step> XML for the HTTP step; fix malformed/missing tags (especially <result> section).
  2. Recreate the step in Spoon and re-save the transformation.
  3. Check Pentaho version compatibility of the transformation file.
  4. 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

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


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)