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::{HeaderMap, Method};

use crate::policy::{RedirectPolicy, StatusPolicy};
use crate::retry::RetryPolicy;
use crate::util::append_query_pairs;

#[derive(Default)]
pub(crate) struct RequestExecutionOverrides {
    pub(crate) request_timeout: Option<Duration>,
    pub(crate) total_timeout: Option<Duration>,
    pub(crate) max_response_body_bytes: Option<usize>,
    pub(crate) retry_policy: Option<RetryPolicy>,
    pub(crate) redirect_policy: Option<RedirectPolicy>,
    pub(crate) status_policy: Option<StatusPolicy>,
    pub(crate) auto_accept_encoding: Option<bool>,
}

impl RequestExecutionOverrides {
    fn with_forced_status_policy(mut self, forced_status_policy: Option<StatusPolicy>) -> Self {
        self.status_policy = forced_status_policy.or(self.status_policy);
        self
    }
}

pub(crate) struct PreparedRequest<'a, ClientRef, Body, ExecutionOptions> {
    pub(crate) client: &'a ClientRef,
    pub(crate) method: Method,
    pub(crate) path: String,
    pub(crate) headers: HeaderMap,
    pub(crate) body: Option<Body>,
    pub(crate) execution_options: ExecutionOptions,
}

pub(crate) struct RequestPreparation<'a, ClientRef, Body> {
    pub(crate) client: &'a ClientRef,
    pub(crate) method: Method,
    pub(crate) path: String,
    pub(crate) query_pairs: Vec<(String, String)>,
    pub(crate) headers: HeaderMap,
    pub(crate) body: Option<Body>,
    pub(crate) execution_overrides: RequestExecutionOverrides,
}

impl<'a, ClientRef, Body> RequestPreparation<'a, ClientRef, Body> {
    pub(crate) fn prepare<ExecutionOptions, F>(
        self,
        forced_status_policy: Option<StatusPolicy>,
        build_execution_options: F,
    ) -> PreparedRequest<'a, ClientRef, Body, ExecutionOptions>
    where
        F: FnOnce(RequestExecutionOverrides) -> ExecutionOptions,
    {
        PreparedRequest {
            client: self.client,
            method: self.method,
            path: append_query_pairs(&self.path, &self.query_pairs),
            headers: self.headers,
            body: self.body,
            execution_options: build_execution_options(
                self.execution_overrides
                    .with_forced_status_policy(forced_status_policy),
            ),
        }
    }
}