use async_trait::async_trait;
use http::HeaderValue;
use slinger::{Request, Response};
use slinger_mitm::{MitmConfig, MitmProxy, RequestInterceptor, ResponseInterceptor, Result};
use std::sync::Arc;
struct CustomHeaderInterceptor;
#[async_trait]
impl RequestInterceptor for CustomHeaderInterceptor {
async fn intercept_request(&self, mut request: Request) -> Result<Option<Request>> {
println!("[CUSTOM] Intercepting request to: {}", request.uri());
request
.headers_mut()
.insert("X-Slinger-MITM", HeaderValue::from_static("true"));
if request.headers().contains_key("User-Agent") {
request.headers_mut().insert(
"User-Agent",
HeaderValue::from_static("Slinger-MITM-Proxy/1.0"),
);
}
Ok(Some(request))
}
}
struct ResponseModifierInterceptor;
#[async_trait]
impl ResponseInterceptor for ResponseModifierInterceptor {
async fn intercept_response(&self, mut response: Response) -> Result<Option<Response>> {
println!("[CUSTOM] Intercepting response: {}", response.status_code());
response.headers_mut().insert(
"X-Slinger-MITM-Response",
HeaderValue::from_static("modified"),
);
Ok(Some(response))
}
}
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Slinger MITM Proxy with Custom Interceptors ===\n");
let config = MitmConfig {
ca_storage_path: std::path::PathBuf::from(".slinger-mitm-custom"),
enable_https_interception: true,
max_connections: 1000,
connection_timeout: 30,
upstream_proxy: None,
};
let proxy = MitmProxy::new(config).await?;
let interceptor_handler = proxy.interceptor_handler();
let mut handler = interceptor_handler.write().await;
handler.add_request_interceptor(Arc::new(CustomHeaderInterceptor));
handler.add_response_interceptor(Arc::new(ResponseModifierInterceptor));
drop(handler);
println!("Starting MITM proxy on 127.0.0.1:8888");
println!("CA certificate: {}\n", proxy.ca_cert_path().display());
println!("This proxy will:");
println!(" - Add X-Slinger-MITM header to all requests");
println!(" - Modify User-Agent header");
println!(" - Add X-Slinger-MITM-Response header to all responses\n");
proxy.start("127.0.0.1:8888").await?;
Ok(())
}