Skip to main content

toolkit_http/
lib.rs

1#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
2#![warn(warnings)]
3
4//! HTTP client infrastructure for `ToolKit`
5//!
6//! This crate provides a hyper-based HTTP client with:
7//! - Automatic TLS via rustls; transport security is configurable via
8//!   [`TransportSecurity`] — defaults to
9//!   `TlsOnly` (HTTPS-only) under `--features fips`, `AllowInsecureHttp` otherwise
10//! - Connection pooling
11//! - Configurable timeouts
12//! - Automatic retries with exponential backoff
13//! - User-Agent header injection
14//! - Concurrency limiting
15//! - **Transparent response decompression** (gzip, brotli, deflate)
16//! - Optional OpenTelemetry tracing (feature-gated)
17//!
18//! # Transparent Decompression
19//!
20//! The client automatically:
21//! - Sends `Accept-Encoding: gzip, br, deflate` header on all requests
22//! - Decompresses response bodies based on `Content-Encoding` header
23//! - Applies body size limits to **decompressed** bytes (protecting against zip bombs)
24//!
25//! No configuration is required; decompression is always enabled.
26//!
27//! # Example
28//!
29//! ```ignore
30//! use toolkit_http::{HttpClient, HttpClientBuilder};
31//! use std::time::Duration;
32//!
33//! let client = HttpClient::builder()
34//!     .timeout(Duration::from_secs(10))
35//!     .user_agent("my-app/1.0")
36//!     .build()?;
37//!
38//! // reqwest-like API: response has body-reading methods
39//! // Compressed responses are automatically decompressed
40//! let data: MyData = client
41//!     .get("https://example.com/api")
42//!     .send()
43//!     .await?
44//!     .json()
45//!     .await?;
46//! ```
47
48mod builder;
49mod client;
50mod config;
51mod error;
52mod layers;
53pub mod otel;
54mod request;
55mod response;
56pub mod security;
57mod tls;
58
59pub use builder::HttpClientBuilder;
60pub use client::HttpClient;
61pub use config::{
62    DEFAULT_USER_AGENT, ExponentialBackoff, HttpClientConfig, IDEMPOTENCY_KEY_HEADER,
63    RateLimitConfig, RedirectConfig, RetryConfig, RetryTrigger, TlsRootConfig, TransportSecurity,
64    is_idempotent_method,
65};
66pub use error::{HttpError, InvalidUriKind};
67#[cfg(feature = "otel")]
68pub use layers::{ClassifyFn, MetricsLayer, MetricsService, default_classify};
69pub use layers::{
70    OtelLayer, OtelService, RETRY_ATTEMPT_HEADER, RetryLayer, RetryService, SecureRedirectPolicy,
71    UserAgentLayer, UserAgentService,
72};
73pub use request::{RequestBuilder, RequestType};
74pub use response::{HttpResponse, LimitedBody, ResponseBody};
75pub use security::{attach_bearer_http, attach_internal_token_http};
76pub use tls::TlsConfigError;