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
- Check the URL setting in the step dialog for typos, missing scheme, or illegal characters.
- Verify the variables used in the URL resolve to valid values at runtime (kettle.properties / environment).
- URL-encode dynamic path/query segments before inserting them into the URL string.
- 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
- Always include an explicit http:// or https:// scheme in the URL setting
- URL-encode variables used inside the URL
- Preview the transformation and log the fully substituted URL during development
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
- HTTP.Exception.CouldnotFindField
- Rest.Exception.ErrorFindingField
- Rest.Log.NoField
- AccessInput.Exception.CouldnotFindField
- AccessInput.Log.NoField
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)