use reqres::{Client, Proxy, ProxyBuilder, ProxyType};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== reqres v0.6.0 Proxy Demo ===\n");
println!("Note: This demo shows how to configure proxies.\n");
println!("Actual proxy connectivity depends on your network environment.\n");
println!("Test 1: Create proxy from URL\n");
let http_proxy = Proxy::from_url("http://proxy.example.com:8080")?;
println!(" ✓ HTTP proxy: {}", http_proxy.addr);
println!(" ✓ Type: {:?}", http_proxy.proxy_type);
println!(" ✓ Needs auth: {}", http_proxy.needs_auth());
let https_proxy = Proxy::from_url("https://secure-proxy.example.com:8443")?;
println!(" ✓ HTTPS proxy: {}", https_proxy.addr);
let socks5_proxy = Proxy::from_url("socks5://socks-proxy.example.com:1080")?;
println!(" ✓ SOCKS5 proxy: {}", socks5_proxy.addr);
let proxy_with_auth = Proxy::from_url("http://user:password@proxy.example.com:8080")?;
println!(" ✓ Proxy with auth: {}", proxy_with_auth.addr);
println!(" ✓ Username: {:?}", proxy_with_auth.username);
println!(" ✓ Password: ***");
println!("\n==================================================\n");
println!("Test 2: Use ProxyBuilder\n");
let proxy = ProxyBuilder::new("custom-proxy.example.com:3128", ProxyType::Http)
.credentials("myuser", "mypass")
.build();
println!(" ✓ Proxy address: {}", proxy.addr);
println!(" ✓ Proxy type: {:?}", proxy.proxy_type);
println!(" ✓ Has auth: {}", proxy.needs_auth());
if let Some(auth_header) = proxy.build_auth_header() {
println!(" ✓ Auth header (first 20 chars): {}...", &auth_header[..20]);
}
println!("\n==================================================\n");
println!("Test 3: Client with proxy configuration\n");
let fake_proxy = Proxy::new("127.0.0.1:8080".to_string(), ProxyType::Http);
let client = Client::builder()
.proxy(fake_proxy)
.build()?;
println!(" ✓ Client created with proxy configuration");
println!(" ℹ Note: Actual proxy routing not yet implemented (framework-level only)");
println!("\n ℹ Sending test request (direct connection, proxy not active)...");
match client.get("https://httpbin.org/ip").await {
Ok(response) => {
println!(" ✓ Status: {}", response.status);
println!(" ✓ Response: {}", response.text()?);
println!(" ℹ Request went directly (proxy routing not implemented)");
}
Err(e) => {
println!(" ✗ Error: {}", e);
}
}
println!("\n==================================================\n");
println!("Test 4: Proxy from environment variables\n");
println!(" ℹ Common env vars: HTTP_PROXY, HTTPS_PROXY, ALL_PROXY\n");
if let Ok(http_proxy) = std::env::var("HTTP_PROXY") {
println!(" ℹ HTTP_PROXY = {}", http_proxy);
if let Ok(proxy) = Proxy::from_url(&http_proxy) {
println!(" ✓ Parsed proxy: {}", proxy.addr);
}
} else {
println!(" ℹ HTTP_PROXY not set");
}
if let Ok(https_proxy) = std::env::var("HTTPS_PROXY") {
println!(" ℹ HTTPS_PROXY = {}", https_proxy);
if let Ok(proxy) = Proxy::from_url(&https_proxy) {
println!(" ✓ Parsed proxy: {}", proxy.addr);
}
} else {
println!(" ℹ HTTPS_PROXY not set");
}
println!("\n==================================================\n");
println!("Test 5: Proxy types comparison\n");
let http_proxy = Proxy::new("proxy.com:8080".to_string(), ProxyType::Http);
let https_proxy = Proxy::new("proxy.com:443".to_string(), ProxyType::Https);
let socks5_proxy = Proxy::new("proxy.com:1080".to_string(), ProxyType::Socks5);
println!(" HTTP proxy type: {:?}", http_proxy.proxy_type);
println!(" HTTPS proxy type: {:?}", https_proxy.proxy_type);
println!(" SOCKS5 proxy type: {:?}", socks5_proxy.proxy_type);
println!("\n HTTP vs HTTPS: {}", http_proxy.proxy_type == https_proxy.proxy_type);
println!(" HTTP vs SOCKS5: {}", http_proxy.proxy_type == socks5_proxy.proxy_type);
println!("\n=== Demo completed ===");
println!("\nUsage examples:");
println!(" Client::builder().proxy(proxy).build()");
println!(" Proxy::from_url(\"http://proxy.com:8080\")?");
println!(" ProxyBuilder::new(\"proxy.com:8080\", ProxyType::Http).credentials(\"u\", \"p\").build()");
Ok(())
}