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

  1. Update libcurl on the system (and rebuild but-installer so libcurl-sys links the new version).
  2. Check for HTTP_PROXY/HTTPS_PROXY interference and retry without the proxy.
  3. Retry the command — a one-off None can follow an interrupted transfer.
  4. 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

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


AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20). Data as JSON: /api/errors/3086de33e2a75cdd. Report an issue: GitHub.