8 releases (4 breaking)

new 0.5.1 Apr 13, 2024
0.5.0 Mar 17, 2024
0.4.0 Sep 5, 2023
0.3.2 Sep 5, 2023
0.1.1 Jul 10, 2021

#1449 in Network programming

Download history 6/week @ 2023-12-22 2/week @ 2023-12-29 7/week @ 2024-01-05 15/week @ 2024-01-12 2/week @ 2024-01-19 8/week @ 2024-01-26 49/week @ 2024-02-02 4/week @ 2024-02-09 11/week @ 2024-02-16 28/week @ 2024-02-23 23/week @ 2024-03-01 38/week @ 2024-03-08 257/week @ 2024-03-15 32/week @ 2024-03-22 46/week @ 2024-03-29 30/week @ 2024-04-05

373 downloads per month
Used in 4 crates (via async-acme)

MIT license

92KB
2.5K SLoC

Project Status: Active – The project has reached a stable, usable state and is being actively developed. Crates.io Released API docs MIT licensed

A generic async HTTP request create.

It is meant to be a thin wrapper around various HTTP clients and handles TLS, serialization and parsing.

The main goal is to allow binaries (that pull in some libraries that make use of a HTTP client) to specify what implementation should be used.

And if there is a Proxy. If not specified auto detection is performed by looking at HTTP_PROXY.

Features

You need to specify via features what crates are used to do the actual work.

feature flag Meaning
use_hyper Use hyper for HTTP GitHub Workflow Status
use_async_h1 Use async_h1 for HTTP GitHub Workflow Status
rustls Add support for HTTPS via rustls
proxies Add support for Socks5 and HTTP proxy
hyper_native_tls Use hyper for HTTP and do HTTPS via native_tls GitHub Workflow Status
async_native_tls Use async_h1 for HTTP and do HTTPS via native_tls GitHub Workflow Status

Without anything specified you will end up with No HTTP backend was selected. If you use this crate for a library, please reexport the appropriate features.

Motivation

Rust offers different async runtimes that - on a high level - offer the same thing: asynchronous functions for files, sockets and so on.

So if you write a lib and need some basic stuff (like an http client) you sometimes have to make choices that are not what your crates users would have liked. For example: I wrote a webserver based on hyper and wanted to add ACME. A crate I found did what I needed but used async-h1 and async-std. While that worked, it did increase the binary size and crates I depend on by a good amount.

So I wrote this. You can specify which backend to use. In the Webserver case, using tokio which is already a dependency VS async-std did lead to 81 less crates and a 350kB smaller binary. Using (and async-acme):

[profile.release]
lto = "fat"
codegen-units = 1

Also for http clients: there should be a way to add a proxy for all libs that use it.

Plans

  1. Add Sessions - to make multiple requests more efficient
  2. Add a cookie jar for the sessions
  3. Allow a Body to be streamed from a server
  4. Allow a Body to be streamed to a server

Dependencies

~0.8–18MB
~228K SLoC