#![doc = include_str!("../README.md")]
#![no_std]
#![forbid(unsafe_op_in_unsafe_fn)]
#![deny(
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::panic_in_result_fn,
clippy::indexing_slicing,
clippy::integer_division,
clippy::cast_lossless,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_precision_loss,
clippy::shadow_unrelated,
clippy::shadow_reuse,
clippy::shadow_same,
clippy::wildcard_imports,
dead_code
)]
#![warn(
missing_docs,
missing_debug_implementations,
clippy::pedantic,
clippy::nursery,
clippy::missing_errors_doc,
clippy::missing_panics_doc,
clippy::needless_pass_by_value,
clippy::new_without_default,
clippy::large_enum_variant,
clippy::result_large_err,
clippy::undocumented_unsafe_blocks
)]
#![allow(
clippy::inline_always,
clippy::similar_names,
clippy::too_many_lines,
clippy::too_many_arguments,
clippy::type_complexity,
clippy::ptr_as_ptr,
// Agent 1 privacy: private modules keep `pub(crate)` items for intent clarity.
clippy::redundant_pub_crate,
// Builder type is `#[must_use]`; free/method helpers also annotate.
clippy::double_must_use,
)]
extern crate alloc;
#[cfg(feature = "cookie-jar")]
pub mod cookie_jar;
pub use client::HttpClient;
pub use error::Error;
pub use dns::{DnsResolver, OsDnsResolver};
pub use error::{DecompressError, DnsError, IntoStringError, InvalidRequest, ParseError, SocketError};
pub use socket::{BlockingSocket, BlockingSocketFactory};
pub use socket::{OsBlockingSocket, SocketAddr};
pub use util::IpAddr;
pub use headers::{
Headers, IntoIter as HeaderIntoIter, Iter as HeaderIter, WellKnownHeader, well_known_header, well_known_header_bytes,
};
pub use method::{ExtensionMethod, Method, ParseMethodError};
pub use parser::Response;
pub use parser::uri::{Authority, Host, Uri};
pub use parser::version::Version;
pub use request_builder::ClientRequestBuilder;
pub type Agent = HttpClient<OsBlockingSocket, OsDnsResolver>;
pub type RequestBuilder = ClientRequestBuilder<OsBlockingSocket, OsDnsResolver>;
#[must_use]
pub fn agent() -> Agent {
HttpClient::new()
}
#[must_use]
pub fn get(url: impl AsRef<str>) -> RequestBuilder {
HttpClient::new().get(url)
}
#[must_use]
pub fn post(url: impl AsRef<str>) -> RequestBuilder {
HttpClient::new().post(url)
}
#[must_use]
pub fn put(url: impl AsRef<str>) -> RequestBuilder {
HttpClient::new().put(url)
}
#[must_use]
pub fn delete(url: impl AsRef<str>) -> RequestBuilder {
HttpClient::new().delete(url)
}
#[must_use]
pub fn head(url: impl AsRef<str>) -> RequestBuilder {
HttpClient::new().head(url)
}
#[must_use]
pub fn patch(url: impl AsRef<str>) -> RequestBuilder {
HttpClient::new().patch(url)
}
pub mod config;
pub mod request_builder;
mod client;
mod dns;
mod error;
#[cfg(feature = "gzip")]
pub mod gzip;
mod headers;
mod method;
pub(crate) mod parser;
pub(crate) mod socket;
pub(crate) mod sync;
mod transport;
pub(crate) mod util;
const _: fn() = || {
const fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<Agent>();
assert_send_sync::<HttpClient<OsBlockingSocket, OsDnsResolver>>();
assert_send_sync::<Error>();
assert_send_sync::<ParseError>();
assert_send_sync::<DecompressError>();
assert_send_sync::<DnsError>();
assert_send_sync::<SocketError>();
assert_send_sync::<InvalidRequest>();
assert_send_sync::<IntoStringError>();
assert_send_sync::<ParseMethodError>();
assert_send_sync::<ExtensionMethod>();
assert_send_sync::<Method>();
assert_send_sync::<config::Config>();
assert_send_sync::<config::ConfigBuilder>();
assert_send_sync::<Response>();
assert_send_sync::<RequestBuilder>();
assert_send_sync::<ClientRequestBuilder<OsBlockingSocket, OsDnsResolver>>();
assert_send_sync::<Headers>();
assert_send_sync::<Uri<'static>>();
assert_send_sync::<Version>();
};
#[cfg(feature = "cookie-jar")]
const _: fn() = || {
const fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<cookie_jar::CookieStore>();
assert_send_sync::<cookie_jar::CookieJar>();
assert_send_sync::<cookie_jar::StoredCookie>();
assert_send_sync::<cookie_jar::SameSite>();
};