reqx 0.1.35

Rust HTTP transport client for API SDK libraries with retry, timeout, idempotency, proxy, and pluggable TLS backends
Documentation
use std::time::Duration;

use http::header::{HeaderName, HeaderValue};
use reqx::advanced::{Interceptor, RequestContext};
use reqx::prelude::{Client, Error, RedirectPolicy, RetryPolicy};

struct TraceInterceptor;

impl Interceptor for TraceInterceptor {
    fn on_request(&self, _context: &RequestContext, headers: &mut http::HeaderMap) {
        headers.insert(
            HeaderName::from_static("x-sdk-trace"),
            HeaderValue::from_static("reqx-example"),
        );
    }

    fn on_response(
        &self,
        context: &RequestContext,
        status: http::StatusCode,
        _headers: &http::HeaderMap,
    ) {
        println!(
            "response: method={} uri={} status={} attempt={} redirects={}",
            context.method(),
            context.uri(),
            status,
            context.attempt(),
            context.redirect_count()
        );
    }

    fn on_error(&self, context: &RequestContext, error: &Error) {
        eprintln!(
            "error: method={} uri={} code={} err={error}",
            context.method(),
            context.uri(),
            error.code().as_str(),
        );
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::builder("https://postman-echo.com")
        .connect_timeout(Duration::from_secs(2))
        .request_timeout(Duration::from_secs(4))
        .total_timeout(Duration::from_secs(8))
        .redirect_policy(RedirectPolicy::limited(5))
        .retry_policy(RetryPolicy::standard())
        .interceptor(TraceInterceptor)
        .build()?;

    let response = client.get("/redirect-to?url=%2Fget").send().await?;
    println!("final status={}", response.status());
    Ok(())
}