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