use slinger_mitm::{InterceptorFactory, MitmConfig, MitmProxy};
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Slinger MITM Proxy with Upstream Proxy ===\n");
let upstream_proxy_url = Some("http://127.0.0.1:8080");
let proxy = match upstream_proxy_url {
Some(url) => {
let parsed = slinger::Proxy::parse(url)?;
println!("✓ Configured upstream proxy: {}", url);
Some(parsed)
}
None => {
println!("ℹ Running without upstream proxy");
None
}
};
let config = MitmConfig {
ca_storage_path: std::path::PathBuf::from(".slinger-mitm"),
max_connections: 1000,
connection_timeout: 30,
interceptor_timeout_secs: 60,
upstream_proxy: proxy,
};
let mitm_proxy = MitmProxy::new(config).await?;
let interceptor_handler = mitm_proxy.interceptor_handler();
let mut handler = interceptor_handler.write().await;
handler.add_interceptor(Arc::new(InterceptorFactory::logging()));
drop(handler);
println!("\nStarting MITM proxy on 127.0.0.1:8080");
println!("CA certificate: {}\n", mitm_proxy.ca_cert_path().display());
println!("Traffic flow:");
if let Some(proxy_url) = upstream_proxy_url {
println!(
" Browser → MITM Proxy (127.0.0.1:8080) → Upstream Proxy ({}) → Internet\n",
proxy_url
);
} else {
println!(" Browser → MITM Proxy (127.0.0.1:8080) → Internet\n");
}
println!("To use this proxy:");
println!("1. Configure your browser to use HTTP proxy: 127.0.0.1:8080");
println!("2. Install the CA certificate in your browser/system");
println!("3. Visit any HTTP/HTTPS website\n");
mitm_proxy.start("127.0.0.1:2008").await?;
Ok(())
}