pentaho/pentaho-kettle · error · KettleException

HTTP.Log.UnableCreateUrl

HTTP.Log.UnableCreateUrl

Error message

HTTP.Log.UnableCreateUrl

What it means

The HTTP step could not construct the request URL. constructUrlBuilder builds a URIBuilder from the step's URL setting; any exception during parsing/normalization (e.g. malformed URL string) is wrapped as KettleException 'HTTP.Log.UnableCreateUrl'.

Solutions

  1. Check the URL setting in the step dialog for typos, missing scheme, or illegal characters.
  2. Verify the variables used in the URL resolve to valid values at runtime (kettle.properties / environment).
  3. URL-encode dynamic path/query segments before inserting them into the URL string.
  4. Validate with new URI(url) in a quick test to see the exact parse error.

Example fix

// before
String url = "myhost.example.com/api ${env}"; // no scheme, raw space
// after
String url = "https://myhost.example.com/api/" + URLEncoder.encode( environmentSubstitute( "${env}" ), "UTF-8" );
Defensive patterns

Strategy: validation

Validate before calling

// validate the URL parses before the step runs
try { new URI( url ).parseServerAuthority(); } catch ( URISyntaxException e ) { throw new IllegalArgumentException( "malformed URL: " + url ); }

Try / catch

try { uriBuilder = constructUrlBuilder( outputRowMeta, row ); } catch ( KettleException e ) { logError( "Cannot build URL from " + urlSetting, e ); putError( ... ); }

Prevention

When it happens

Trigger: constructUrlBuilder called by callHttpService throws while creating/parsing the URIBuilder from the (environment-substituted) URL string or while re-setting query parameters — e.g. new URIBuilder(url) receiving a syntactically invalid URI.

Common situations: URL variable not set or empty after substitution; URL missing scheme (http://); spaces, braces or other illegal characters left in the URL string; typo in the URL field configuration.

Understand the failure class

Background: "Invalid URL" errors: why new URL(), URI.parse, and reqwest::Url reject your string — missing scheme, whitespace, and bad path format — this error's family across 39 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/5f2984aa4109c24d. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/http/HTTP.java:270

      }

      if ( isDetailed() ) {
        logDetailed( BaseMessages.getString( PKG, "HTTP.Log.Connecting", baseUrl ) );
      }

      uriBuilder = new URIBuilder( baseUrl ); // the base URL with variable substitution

      for ( int i = 0; i < data.argnrs.length; i++ ) {
        String key = meta.getArgumentParameter()[ i ];
        String value = outputRowMeta.getString( row, data.argnrs[ i ] );
        uriBuilder.addParameter( key, value );
      }
      List<NameValuePair> queryParams = uriBuilder.getQueryParams();
      if ( !queryParams.isEmpty() ) {
        uriBuilder.setParameters( queryParams );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "HTTP.Log.UnableCreateUrl" ), e );
    }
    return uriBuilder;
  }

  protected int requestStatusCode( HttpResponse httpResponse ) {
    return httpResponse.getStatusLine().getStatusCode();
  }

  protected Header[] searchForHeaders( CloseableHttpResponse response ) {
    return response.getAllHeaders();
  }

  public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {
    meta = (HTTPMeta) smi;
    data = (HTTPData) sdi;

    Object[] r = getRow(); // Get row from input rowset & set row busy!
    if ( r == null ) { // no more input to be expected...

View on GitHub (pinned to f3058517a1)