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;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("=== reqres v0.4.0 HTTP/2 Client Demo ===\n");

    // 默认客户端会启用 HTTP/2
    let client = Client::new()?;

    // 测试 HTTP/2 请求
    println!("Sending HTTP/2 GET request to httpbin.org (supports HTTP/2)...");
    match client.get("https://httpbin.org/get").await {
        Ok(response) => {
            println!("✓ HTTP/2 request successful!");
            println!("  Status: {} {}", response.status(), response.status_text);
            println!("  Version: {}", response.version);

            // 检查是否使用了 HTTP/2
            if response.version == "HTTP/2.0" {
                println!("  ✓ Using HTTP/2 protocol!");
            } else {
                println!("  ⚠ Using HTTP/1.1 (server might not support HTTP/2)");
            }

            println!("\n  Response headers:");
            for (key, value) in &response.headers {
                println!("    {}: {}", key, value);
            }

            // 显示响应体预览
            if let Ok(text) = response.text() {
                let preview = if text.len() > 500 {
                    &text[..500]
                } else {
                    &text
                };
                println!("\n  Body preview:\n{}", preview);
            }
        }
        Err(e) => {
            eprintln!("✗ HTTP/2 request failed: {}", e);
        }
    }

    println!("\n{}\n", &"=".repeat(50));

    // 测试 HTTP/2 POST 请求
    println!("Sending HTTP/2 POST request...");
    let json_data = serde_json::json!({
        "test": "HTTP/2",
        "version": "0.3.0",
        "features": ["Multiplexing", "Header Compression", "Server Push"]
    });

    let request = reqres::Request::post("https://httpbin.org/post")
        .json(&json_data)?
        .build()?;

    match client.request(request).await {
        Ok(response) => {
            println!("✓ HTTP/2 POST request successful!");
            println!("  Status: {} {}", response.status(), response.status_text);
            println!("  Version: {}", response.version);

            if response.version == "HTTP/2.0" {
                println!("  ✓ Using HTTP/2 protocol!");
            }

            if let Ok(text) = response.text() {
                let preview = if text.len() > 500 {
                    &text[..500]
                } else {
                    &text
                };
                println!("\n  Body preview:\n{}", preview);
            }
        }
        Err(e) => {
            eprintln!("✗ HTTP/2 POST request failed: {}", e);
        }
    }

    println!("\n{}\n", &"=".repeat(50));

    // 测试禁用 HTTP/2
    println!("Testing HTTP/1.1 only (HTTP/2 disabled)...");
    let client_h1_only = Client::builder()
        .http1_only()
        .build()?;

    match client_h1_only.get("https://httpbin.org/get").await {
        Ok(response) => {
            println!("✓ HTTP/1.1 only request successful!");
            println!("  Status: {} {}", response.status(), response.status_text);
            println!("  Version: {}", response.version);
            println!("  ✓ Forcefully using HTTP/1.1");
        }
        Err(e) => {
            eprintln!("✗ HTTP/1.1 only request failed: {}", e);
        }
    }

    println!("\n=== Demo completed ===");
    Ok(())
}