Zackriya-Solutions/meetily · error
Failed to start download: {}
Error message
Failed to start download: {} What it means
client.get(download_url).send() failed before any response arrived: DNS resolution failure, connection refused/timeout, or TLS handshake error while contacting the model host (typically HuggingFace). The URL comes from the model definition, so an unreachable URL also lands here.
Source
Thrown at frontend/src-tauri/src/summary/summary_engine/model_manager.rs:495
.connect_timeout(Duration::from_secs(30))
.build()
.map_err(|e| anyhow!("Failed to create HTTP client: {}", e))?;
// Build request with Range header if resuming
let mut request = client.get(&model_def.download_url);
if existing_size > 0 {
log::info!(
"Resuming download from byte {} ({:.1} MB)",
existing_size,
existing_size as f64 / (1024.0 * 1024.0)
);
request = request.header("Range", format!("bytes={}-", existing_size));
}
let response = request
.send()
.await
.map_err(|e| anyhow!("Failed to start download: {}", e))?;
// Check response status - 200 OK (full download) or 206 Partial Content (resume)
let (total_size, resuming) = if response.status() == reqwest::StatusCode::PARTIAL_CONTENT {
// Server supports resume - total size = existing + remaining
let remaining = response.content_length().unwrap_or(0);
log::info!("Server supports resume, {} MB remaining", remaining / (1024 * 1024));
(existing_size + remaining, true)
} else if response.status().is_success() {
// Server doesn't support resume or fresh download
if existing_size > 0 {
log::warn!("Server doesn't support resume, starting fresh download");
}
(response.content_length().unwrap_or(0), false)
} else {
let mut active = self.active_downloads.write().await;
active.remove(model_name);
return Err(anyhow!("Download failed with status: {}", response.status()));
};View on GitHub (pinned to 0281737d87)
Solutions
- Verify connectivity to the exact download_url from the same machine (curl -I)
- Fix DNS/proxy configuration or system CA store, then retry
- Retry once the network is restored — partial files resume automatically
- Distinguish from HTTP-status errors: if the host answers with 404/403 that is a different failure (download_url is stale)
Defensive patterns
Strategy: retry
Validate before calling
// Cheap reachability probe before the long download
let probe = reqwest::Client::new().head(&model_def.download_url).send().await;
match probe {
Ok(r) if r.status().is_success() || r.status().as_u16() == 206 => { /* proceed */ }
Ok(r) => return Err(anyhow!("host answered {} — URL may be stale", r.status())),
Err(e) => return Err(anyhow!("host unreachable: {}", e)),
} Try / catch
let mut attempt = 0;
loop {
match manager.download_model_detailed(name, cb).await {
Err(e) if e.to_string().starts_with("Failed to start download") && attempt < 3 => {
attempt += 1;
tokio::time::sleep(Duration::from_secs(2u64.pow(attempt))).await;
}
other => break other,
}
} Prevention
- Check connectivity before invoking large downloads; surface offline state in the UI
- Configure system proxy/CA correctly in enterprise environments
- Retry with backoff — partial files resume automatically
When it happens
Trigger: Machine offline; DNS cannot resolve huggingface.co; firewall blocking outbound HTTPS; the model's download_url changed or the host is down; proxy rejecting the CONNECT.
Common situations: App started in airplane mode; restrictive corporate network; HuggingFace outage; authenticated proxies in enterprise environments.
Related errors
- {}: {}
- Download failed with status: {}
- Download timeout - No data received for 30 seconds
- Failed to create HTTP client: {}
- Download failed with status: {}
AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16).
Data as JSON: /api/errors/c721f304a49eb1ac.
Report an issue: GitHub.