use hypertor::{Config, ProxyConfig, Result, Socks5Proxy};
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
println!("🧅 hypertor - SOCKS5 Proxy Example");
println!("===================================");
println!();
println!("Starting SOCKS5 proxy on 127.0.0.1:9050...");
println!();
println!("Usage examples:");
println!(" curl --socks5 127.0.0.1:9050 https://check.torproject.org/api/ip");
println!(
" curl --socks5-hostname 127.0.0.1:9050 http://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion"
);
println!();
println!("Python requests:");
println!(" import requests");
println!(
" proxies = {{'http': 'socks5h://127.0.0.1:9050', 'https': 'socks5h://127.0.0.1:9050'}}"
);
println!(" requests.get('https://check.torproject.org/api/ip', proxies=proxies)");
println!();
println!("Press Ctrl+C to stop the proxy.");
println!();
let proxy = Socks5Proxy::with_defaults();
proxy.run().await?;
println!("✅ Proxy stopped.");
Ok(())
}
#[allow(dead_code)]
async fn custom_proxy_example() -> Result<()> {
let bind_addr = SocketAddr::new(
IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)),
19050, );
let proxy_config = ProxyConfig::new(bind_addr)
.with_max_connections(100) .with_isolation(12345);
let tor_config = Config::default();
let proxy = Socks5Proxy::new(proxy_config, tor_config);
println!("Custom proxy on 127.0.0.1:19050");
proxy.run().await
}
#[allow(dead_code)]
async fn multi_identity_proxy() -> Result<()> {
let configs = vec![
(9050u16, 1u64, "identity-1"),
(9051u16, 2u64, "identity-2"),
(9052u16, 3u64, "identity-3"),
];
println!("Starting multiple isolated SOCKS5 proxies:");
let mut handles = vec![];
for (port, token, name) in configs {
let bind_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port);
let config = ProxyConfig::new(bind_addr).with_isolation(token);
let proxy = Socks5Proxy::new(config, Config::default());
println!(" {} on port {} (isolation token: {})", name, port, token);
handles.push(tokio::spawn(async move {
if let Err(e) = proxy.run().await {
eprintln!("Proxy error: {}", e);
}
}));
}
println!();
println!("Each proxy will route through different Tor circuits!");
println!("Use different ports to maintain separate identities.");
for handle in handles {
handle.await.ok();
}
Ok(())
}