windmill-labs/windmill · error

Error executing get request from authed http client to {url}

Error message

Error executing get request from authed http client to {url} with query {query:?}: {e:#?}

What it means

The authed internal HTTP client's `get` performs a GET with a Bearer token against a Windmill server URL; when reqwest fails (DNS, connect, timeout, TLS, 4xx/5xx are separate but send() itself fails on transport), it logs and rethrows this error including the URL, query, and debug-formatted cause. Called by get_resource_value_interpolated, dbt_warehouse_exists, and make_basic_get_request.

Source

Thrown at backend/windmill-common/src/client.rs:43

    pub async fn get(&self, url: &str, query: Vec<(&str, String)>) -> anyhow::Result<Response> {
        self.force_client
            .as_ref()
            .unwrap_or(&HTTP_CLIENT)
            .get(url)
            .query(&query)
            .header(
                reqwest::header::ACCEPT,
                reqwest::header::HeaderValue::from_static("application/json"),
            )
            .header(
                reqwest::header::AUTHORIZATION,
                reqwest::header::HeaderValue::from_str(&format!("Bearer {}", self.token))?,
            )
            .send()
            .await
            .map_err(|e| {
                tracing::error!("Error executing get request from authed http client to {url} with query {query:?}: {e:#?}");
                anyhow::anyhow!("Error executing get request from authed http client to {url} with query {query:?}: {e:#?}")
            })
    }

    /// Like [`AuthedClient::get`], but for a response whose size decides how
    /// long it takes. `HTTP_CLIENT`'s total timeout would cut off a large one
    /// partway through, so this uses the streaming client, which bounds only
    /// the connect.
    pub async fn get_streaming(
        &self,
        url: &str,
        query: Vec<(&str, String)>,
    ) -> anyhow::Result<Response> {
        self.force_client
            .as_ref()
            .unwrap_or(&HTTP_CLIENT_STREAMING)
            .get(url)
            .query(&query)
            .header(

View on GitHub (pinned to e474e8803c)

Solutions

  1. Read the debug cause (e#) in the log: distinguish DNS vs connect vs timeout vs TLS and fix accordingly.
  2. Verify the base URL/server the AuthedClient was constructed with is reachable: curl the same URL from the same host.
  3. Fix DNS/hostname (use the docker-compose service name, not localhost, inside containers).
  4. If timeouts, raise the client timeout or reduce the response size; if TLS, check certs/proxy.

Example fix

// before
let client = AuthedClient::new(HTTP_CLIENT.clone(), "http://localhost:8000", ...); // inside a container
// after
let client = AuthedClient::new(HTTP_CLIENT.clone(), "http://windmill_server:8000", ...);
Defensive patterns

Strategy: retry

Validate before calling

const url = new URL(baseUrl + path); // throws early on malformed URL
// optionally pre-check reachability
await fetch(url, { method: 'HEAD' }).catch(e => { throw new Error(`target unreachable before call: ${e.cause}`); });

Type guard

function isReachableUrl(u) { try { const p = new URL(u); return p.protocol === 'http:' || p.protocol === 'https:'; } catch { return false; } }

Try / catch

match client.get(&url, Some(&query)).await {
    Ok(resp) => resp,
    Err(e) if e.to_string().contains("Error executing get request") => {
        // inspect logged e# cause: DNS vs connect vs timeout; retry with backoff
        retry_with_backoff(3, || client.get(&url, Some(&query))).await
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Any caller of AuthedClient::get (backend/windmill-common/src/client.rs:43) when the target server is down/unreachable, DNS fails, the request times out, TLS handshake fails, or the base URL is malformed.

Common situations: Self-hosted instance with wrong base URL/port in env; container using localhost instead of the service hostname; network policy blocking egress; token/token-refresh side effects causing connection reset; resource interpolation pointing at a server that no longer exists.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/309fa4cd58f9dd18. Report an issue: GitHub.