reqres 1.0.0

A pure Rust async HTTP client library based on Tokio with HTTP/2, connection pooling, proxy, cookie, compression, benchmarks, and comprehensive tests
Documentation
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");

    // 示例 1: 从 URL 字符串创建代理
    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");

    // 示例 2: 使用 ProxyBuilder
    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");

    // 示例 3: 创建带有代理的客户端
    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");

    // 示例 4: 环境变量配置
    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");

    // 示例 5: 代理类型比较
    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(())
}