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

  1. Open the .ktr in Spoon to see the detailed wrapped cause and offending step.
  2. Restore the transformation from version control/backup.
  3. Validate the XML well-formedness (xmllint) and repair the HTTPPOST step node.
  4. Recreate the HTTP POST step in a clean transformation and re-enter its settings.
  5. 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

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


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)