gitbutlerapp/gitbutler · error
Effective URL is missing
Error message
Effective URL is missing
What it means
Thrown in release.rs after the libcurl transfer when easy.effective_url() returns Ok(None). libcurl always records the final URL after following redirects, so a None here means the curl handle state is abnormal (transfer not completed on this handle, an unusual libcurl build, or an interrupted transfer). It guards the redirect-validation step that checks the API was not redirected off app.gitbutler.com.
Source
Thrown at crates/but-installer/src/release.rs:71
bail!(
"Failed to fetch release information for version {version}. Version may not exist. HTTP {response_code}"
);
}
crate::config::VersionRequest::Nightly => {
bail!("Failed to fetch nightly release information. HTTP {response_code}");
}
crate::config::VersionRequest::Release => {
bail!("Failed to fetch release information from {url}. HTTP {response_code}");
}
}
}
// Validate the effective URL after following redirects
// This protects against malicious redirects to untrusted domains or insecure protocols
let effective_url = easy
.effective_url()
.context("Failed to get effective URL")?
.ok_or_else(|| anyhow!("Effective URL is missing"))?;
validate_api_url(effective_url).with_context(|| {
format!("Release API was redirected to an untrusted URL: {effective_url}")
})?;
let release: Release =
serde_json::from_slice(&response_data).context("Failed to parse release information")?;
// Verify we got the version we requested (skip check for nightly)
if let crate::config::VersionRequest::Specific(ref requested) = config.version_request
&& release.version != requested.as_str()
{
bail!(
"API returned version {} but requested version {}",
release.version,
requested
);
}View on GitHub (pinned to caf1f223d3)
Solutions
- Update libcurl on the system (and rebuild but-installer so libcurl-sys links the new version).
- Check for HTTP_PROXY/HTTPS_PROXY interference and retry without the proxy.
- Retry the command — a one-off None can follow an interrupted transfer.
- Report to GitButler with your libcurl version if it persists on a current curl.
Defensive patterns
Strategy: retry
Try / catch
match fetch_release(&config) {
Ok(r) if std::env::var("GB_SKIP_REDIRECT_CHECK").is_err() => Ok(r),
Ok(r) => Ok(r),
Err(e) if e.to_string().contains("Effective URL is missing") => {
// environment defect: verify libcurl version, then retry once
Err(e)
},
Err(e) => Err(e),
} Prevention
- Keep system libcurl current on hosts running the installer.
- Rule out proxies that interrupt transfers before blaming the API.
- Capture the libcurl version in bug reports for this error.
When it happens
Trigger: A libcurl/libcurl-sys version that does not populate CURLINFO_EFFECTIVE_URL after the performed request; the transfer being reset or the handle reused abnormally between perform and query; exotic TLS/proxy middleboxes breaking the transfer's completion state.
Common situations: Systems with unusual or outdated libcurl builds (some minimal distros, containers with old curl); almost never seen on standard setups — treat as an environment/toolchain defect rather than a GitButler-side problem.
Related errors
- No host in {} URL
- Too many arguments. Usage: but-installer [version|nightly] o
- unsupported OS or architecture: {os} {arch}
- JSON output is not supported for 'but update install'. The
- Failed to determine home directory
AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20).
Data as JSON: /api/errors/3086de33e2a75cdd.
Report an issue: GitHub.