Thanks to visit codestin.com
Credit goes to lib.rs

3 releases

0.0.3 Oct 24, 2025
0.0.2 Aug 4, 2025
0.0.1 Jun 4, 2025

#1447 in Network programming

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

85 downloads per month
Used in 6 crates (3 directly)

MIT/Apache

39KB
583 lines

I/O HTTP Documentation Matrix

Set of I/O-free Rust coroutines to manage HTTP streams, based on io-stream.

This library allows you to manage HTTP streams using an I/O-agnostic approach, based on 3 concepts:

Coroutine

A coroutine is an I/O-free, resumable and composable state machine that emits I/O requests. A coroutine is considered terminated when it does not emit I/O requests anymore.

See available coroutines at ./src/coroutines.

Runtime

A runtime contains all the I/O logic, and is responsible for processing I/O requests emitted by coroutines.

See available runtimes at io-stream.

Loop

The loop is the glue between coroutines and runtimes. It makes the coroutine progress while allowing runtime to process I/O.

Examples

Send HTTPS request via rustls synchronously

use std::{net::TcpStream, sync::Arc};

use http::Request;
use io_http::v1_1::coroutines::send::{SendHttp, SendHttpResult};
use io_stream::runtimes::std::handle;
use rustls::{ClientConfig, ClientConnection, StreamOwned};
use rustls_platform_verifier::ConfigVerifierExt;

// build TLS stream

let domain = "github.com"
let config = ClientConfig::with_platform_verifier().unwrap();
let server_name = domain.to_string().try_into().unwrap();
let conn = ClientConnection::new(Arc::new(config), server_name).unwrap();
let tcp = TcpStream::connect((domain, 443)).unwrap();
let tls = StreamOwned::new(conn, tcp);

// send request send receive response

let request = Request::get("/").body(vec![]).unwrap();

let mut arg = None;
let mut send = SendHttp::new(request);

let response = loop {
    match send.resume(arg.take()) {
        SendHttpResult::Ok(result) => break result.response,
        SendHttpResult::Err(err) => panic!("{err}"),
        SendHttpResult::Io(io) => arg = Some(handle(&mut stream, io).unwrap()),
    }
};

See complete example at ./examples/send.rs.

More examples

Have a look at projects built on the top of this library:

  • 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

License

This project is licensed under either of:

at your option.

Sponsoring

nlnet

Special thanks to the NLnet foundation and the European Commission that helped the project to receive financial support from various programs:

If you appreciate the project, feel free to donate using one of the following providers:

GitHub Ko-fi Buy Me a Coffee Liberapay thanks.dev PayPal

Dependencies

~1–1.7MB
~31K SLoC