use std::error::Error;
use std::time::Duration;
pub fn format_reqwest_error(e: reqwest::Error, context: &str) -> String {
let mut parts: Vec<String> = Vec::new();
if e.is_timeout() {
parts.push(format!("{}: request timed out", context));
} else if e.is_connect() {
parts.push(format!("{}: connection failed", context));
} else {
parts.push(format!("{}: request failed", context));
}
parts.push(format!(" reqwest: {}", e));
let mut source = e.source();
let mut depth = 0;
while let Some(src) = source {
depth += 1;
parts.push(format!(" cause {}: {}", depth, src));
source = src.source();
}
parts.join("\n")
}
pub fn build_http_client(timeout_ms: u64) -> Result<reqwest::Client, String> {
let mut builder = reqwest::Client::builder().timeout(Duration::from_millis(timeout_ms));
let native_certs = rustls_native_certs::load_native_certs();
for cert in native_certs.certs {
if let Ok(c) = reqwest::tls::Certificate::from_der(cert.as_ref()) {
builder = builder.add_root_certificate(c);
}
}
builder
.build()
.map_err(|e| format!("Failed to build HTTP client: {}", e))
}