windmill-labs/windmill · error

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

Error message

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

What it means

Same as [918] but for `get_streaming`, which uses the streaming HTTP client (no total timeout) for large responses such as repository archives. It fires when `send()` fails at transport level — connection refused/reset, DNS, TLS, or an immediate stream error. Called by fetch_repo_archive.

Source

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

    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(
                reqwest::header::AUTHORIZATION,
                reqwest::header::HeaderValue::from_str(&format!("Bearer {}", self.token))?,
            )
            .send()
            .await
            .map_err(|e| {
                tracing::error!("Error streaming get request from authed http client to {url} with query {query:?}: {e:#?}");
                anyhow::anyhow!("Error streaming get request from authed http client to {url} with query {query:?}: {e:#?}")
            })
    }

    pub async fn get_id_token(&self, audience: &str) -> anyhow::Result<String> {
        let url = format!(
            "{}/api/w/{}/oidc/token/{}",
            self.base_internal_url, self.workspace, audience
        );
        let response = self
            .force_client
            .as_ref()
            .unwrap_or(&HTTP_CLIENT)
            .post(&url)
            .header(
                reqwest::header::AUTHORIZATION,
                reqwest::header::HeaderValue::from_str(&format!("Bearer {}", self.token))?,
            )
            .send()

View on GitHub (pinned to e474e8803c)

Solutions

  1. Check the logged `e#` cause for the concrete transport failure (connect vs reset vs TLS).
  2. Verify the repository/archive base URL and credentials, then curl the endpoint manually.
  3. Retry with backoff — long streams are prone to transient resets.
  4. If a proxy terminates long connections, raise its idle/streaming limits or bypass it for this host.
Defensive patterns

Strategy: retry

Validate before calling

const url = new URL(baseUrl + archivePath);
if (!(url.protocol === 'https:' || url.protocol === 'http:')) throw new Error('bad archive URL');

Try / catch

match client.get_streaming(&url, Some(&query)).await {
    Ok(resp) => resp,
    Err(e) if e.to_string().contains("Error streaming get request") => {
        // transient stream failures are common on large archives; retry with backoff
        retry_with_backoff(3, || client.get_streaming(&url, Some(&query))).await
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: fetch_repo_archive (or any get_streaming call) when the target server is unreachable, the connection drops while starting the stream, or the URL is wrong — backend/windmill-common/src/client.rs:69.

Common situations: Downloading large repo archives through a proxy that kills long-lived connections; git/DBT repository host misconfigured or offline; transient network partitions; TLS interception on large transfers.

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/d37e5570a5941120. Report an issue: GitHub.