use reqwest_drive::{CachePolicy, DriveCache, DriveThrottleBackoff, ThrottlePolicy};
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
use std::{sync::Arc, time::Duration};
use tempfile::TempDir;
use tokio::time::Instant;
#[tokio::main]
async fn main() {
let temp_dir = TempDir::new().unwrap();
let cache_path = temp_dir.path().join("cache.bin");
let cache_policy = CachePolicy {
default_ttl: Duration::from_secs(60), respect_headers: true, cache_status_override: None,
};
let throttle_policy = ThrottlePolicy {
base_delay_ms: 200, adaptive_jitter_ms: 50, max_concurrent: 1, max_retries: 2, };
let cache = Arc::new(DriveCache::new(&cache_path, cache_policy));
let throttle = Arc::new(DriveThrottleBackoff::new(throttle_policy, cache.clone()));
let client: ClientWithMiddleware = ClientBuilder::new(reqwest::Client::new())
.with_arc(cache.clone()) .with_arc(throttle.clone()) .build();
let url = "https://httpbin.org/get";
let start_time_1 = Instant::now();
tracing::info!("🌍 Sending first request to: {}", url);
let response_1 = match client.get(url).send().await {
Ok(resp) => resp,
Err(err) => {
tracing::error!("❌ First request failed after retries: {:?}", err);
return;
}
};
let elapsed_1 = start_time_1.elapsed();
tracing::info!("✅ First Request Status: {}", response_1.status());
tracing::info!(
"⏳ First Request Time (including throttling): {:?}",
elapsed_1
);
let start_time_2 = Instant::now();
tracing::info!("🌍 Sending second request to: {}", url);
let response_2 = match client.get(url).send().await {
Ok(resp) => resp,
Err(err) => {
tracing::error!("❌ Second request failed: {:?}", err);
return;
}
};
let elapsed_2 = start_time_2.elapsed();
tracing::info!("✅ Second Request Status: {}", response_2.status());
tracing::info!(
"⚡ Second Request Time (should be fast due to cache): {:?}",
elapsed_2
);
tracing::info!(
"\n📊 Comparison: First request took {:?}, second request took {:?} (expected near-instant)",
elapsed_1,
elapsed_2
);
assert!(
elapsed_2 < Duration::from_millis(50),
"⚠️ Cache did not work! Second request took too long: {:?}",
elapsed_2
);
}