Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
I/O HTTP

HTTP/1.X client library, written in Rust
This library is composed of 3 feature-gated layers:
- Low-level I/O-free coroutines: these
no_std-compatible state machines contain the whole HTTP/1.X logic and can be used anywhere - Mid-level light client: a standard, blocking HTTP client using a
Stream: Read + Write - High-level full client: light client + TCP connections and TLS negotiations handled for you
Table of contents
Features
- I/O-free coroutines:
no_stdstate machines; no sockets, no async runtime, nostdrequired, drive against any blocking, async, or fuzz harness. - Light standard, blocking client (requires
clientfeature) - Full standard, blocking client with TLS support:
- Rustls with ring crypto (requires
rustls-ringfeature) - Rustls with aws crypto (requires
rustls-awsfeature) - Native TLS (requires
native-tlsfeature)
- Rustls with ring crypto (requires
- HTTP versions: HTTP/1.0 (RFC 1945) and HTTP/1.1 (RFC 9112) with fixed-length, chunked, and read-to-EOF body strategies.
- Streaming: chunked decoder (
Http11ReadChunksStream) + W3C Server-Sent Events parser (SseFrameParser) + std-blocking driver (HttpClientStd::send_streaming). - Authentication helpers:
Authorization: Bearer <token>(RFC 6750) andAuthorization: Basic <base64(user:pass)>(RFC 7617). .well-knowndiscovery (RFC 8615) shipped as a dedicated coroutine.
[!TIP] I/O HTTP is written in Rust and uses cargo features to gate backend support. The default feature set is declared in Cargo.toml or on docs.rs.
RFC coverage
| Module | What it covers |
|---|---|
| 1945 | HTTP/1.0: request/response coroutine (Http10Send) |
| 6750 | OAuth 2.0 Bearer token: Authorization: Bearer <token> |
| 7617 | HTTP Basic authentication: Authorization: Basic <base64(user:pass)> |
| 8615 | .well-known URI discovery: WellKnown coroutine |
| 9110 | HTTP semantics: shared types HttpRequest, HttpResponse, StatusCode, HttpSendOutput, HttpSendYield |
| 9112 | HTTP/1.1: request/response (Http11Send), response-head (Http11ReadHeaders), chunked transfer (whole-body + streaming) |
sse |
W3C Server-Sent Events frame parser (HTML Living Standard) |
Usage
I/O-HTTP can be consumed three ways, depending on how much of the I/O stack you want to own. Each mode is gated by cargo features.
Whichever mode you pick, every coroutine implements the HttpCoroutine trait. Its resume(arg: Option<&[u8]>) method returns a HttpCoroutineState<Yield, Return> with two variants:
Yielded(Y): intermediate.Yis the per-coroutine yield type (e.g.HttpYield::WantsRead/HttpYield::WantsWrite(Vec<u8>)for most coroutines;HttpSendYield::WantsRedirect { … }forHttp*Send;SseFrameParserYield::Frame(SseFrame)for the SSE parser).Complete(R): terminal. By conventionR = Result<Output, Error>carrying the operation's final value.
Coroutine
No features required: works in #![no_std], no sockets, no async runtime. You own the loop and the bytes; the library only produces request bytes and consumes server responses.
Send an HTTP/1.1 request against an async Tokio + rustls stack (the same shape works under blocking, fuzzing, or in-memory replay):
use Arc;
use ;
use ClientConfig;
use ConfigVerifierExt;
use ;
use TlsConnector;
use Url;
async
Light client
Enable the client feature. HttpClientStd::new(stream) wraps any blocking Read + Write and exposes send / send_http10 / send_streaming. You still open the TCP socket and run TLS yourself, then hand over a ready-to-talk stream; the client takes it from there.
[]
= { = "0.1.0", = false, = ["client"] }
#
Full client
Enable one of the TLS feature flags: rustls-ring (default), rustls-aws, or native-tls. HttpClientStd::connect(url, tls) opens http:// (plain TCP) or https:// (implicit TLS) via pimalaya/stream, returning a ready-to-use client.
[]
= "0.1.0" # rustls-ring is enabled by default
#
Examples
See complete examples at ./examples.
Have also a look at real-world projects built on top of this library:
- io-jmap: Set of I/O-free Rust coroutines to manage JMAP sessions
- io-addressbook: Set of I/O-free coroutines to manage contacts
- io-oauth: Set of I/O-free Rust coroutines to manage OAuth flows
- io-starttls: I/O-free Rust coroutine to upgrade any plain stream to a secure one
- Cardamum: CLI to manage contacts
- Ortie: CLI to manage OAuth access tokens
AI disclosure
This project is developed with AI assistance. This section documents how, so users and downstream packagers can make informed decisions.
-
Tools: Claude Code (Anthropic), Opus 4.7, invoked locally with a persistent project-scoped memory and a small set of repo-specific rules.
-
Used for: Refactors, mechanical multi-file edits, boilerplate (feature gates, error enums, derive macros, trait impls), test scaffolding, doc polish, exploratory design conversations.
-
Not used for: Engineering, critical code, git manipulation (commit, merge, rebase…), real-world tests.
-
Verification: Every AI-assisted change is read, compiled, tested, and formatted before commit (
nix develop --command cargo check / cargo test / cargo fmt). Behavioural correctness is verified against the relevant RFC or upstream spec, not assumed from the model output. Tests are never adjusted to fit AI-generated code; the code is adjusted to fit correct behaviour. -
Limitations: AI models occasionally produce code that compiles and passes tests but is subtly wrong: off-by-one errors, missed edge cases, plausible but nonexistent APIs, stale RFC references. The verification workflow catches most of this; it does not catch all of it. Bug reports are welcome and taken seriously.
-
Last reviewed: 30/05/2026
License
This project is licensed under either of:
at your option.
Social
- Chat on Matrix
- News on Mastodon or RSS
- Mail at pimalaya.org@posteo.net
Sponsoring
Special thanks to the NLnet foundation and the European Commission that have been financially supporting the project for years:
- 2022 → 2023: NGI Assure
- 2023 → 2024: NGI Zero Entrust
- 2024 → 2026: NGI Zero Core
- 2027 in preparation…
If you appreciate the project, feel free to donate using one of the following providers:
