3 releases

0.0.3 Aug 31, 2020
0.0.2 Aug 26, 2020
0.0.1 Aug 22, 2020

#356 in HTTP client

MIT license

70KB
1K SLoC

Curio - A Blazing Fast HTTP Client

Rust Discord codecov Crates.io (latest) Crates.io (recent) GitHub issues GitHub closed issues

About

What is Curio?

Curio is a small HTTP client built in the Rust Programming Language from Mozilla. It was started by myself as a way to learn the ins and outs of HTTP and its quirks, after all there is nothing more interesting to me than the standards that define the internet. Its primary goal above all else is performance, closely followed by ease of use. If you are proficient in Rust, and know how to help me improve the performance of Curio, please do not hesitate to open an issue tagged with the optimization tag. If you have a feature you think would be perfect for Curio and would be useful to more than just yourself, please open an issue with the feature tag.

Whilst Curio is ready to use, I am always looking to improve it. If you have any suggestions please open an issue

Why should I use Curio over other HTTP clients?

Curio is a fresh take on how to handle HTTP clients and aims to provide a cross-platform, cross-language library which can be used almost anywhere.

Does Curio support X?

Curio supports most of the most common HTTP methods:

  • GET
  • POST
  • DELETE

Curio also supports the following HTTP methods:

  • OPTIONS
  • HEAD

It also supports CORS request moderation. It performs a preflight request to the requested resource to ensure that the request can go ahead .

This library also supports automatic HTTPS upgrading.

In a future version, all of these features will be configurable, for example you could disable CORS blocking for that request, or you could force the client to use TCP instead of TLS.


Documentation

You can view the most up-to-date documentation here however as this is not promised to be in-sync with the docs on docs.rs you should probably use those if you are not importing from this repository

Examples:

Simple GET request:

A simple GET request to some-domain.tld/path/to/resource should look something like this:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let response = Request::get("https://some-domain.tld/path/to/resource")
        .send()?;

    println!("{:#?}", response);
    Ok(())
}

POST plaintext content:

A simple POST request that is posting plaintext content looks like this:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut post_body = "This is some example content to POST";

    // convert the string into a format accepted by the `set_body` method.
    let post_data = PostData::from_str(post_body);

    // below, set the destination of the post body using the `post` method,
    // set the body using the `set_body` method,
    // and send the request by using the `send` method
    let response = Request::post("https://some-domain.tld/documents")
        .set_body(&post_data)
        .send()?;

    println!("{:#?}", response);
    Ok(())
}

Milestones

Wed 26th Aug 2020 - First fully capable GET request handler: Commit 496ae5f

Sat 29th Aug 2020 - Curio 0.0.3 (preflight for 0.1.0) is completed, and preperations for release begin.

Benchmarks

Method Library Total Runs Average Time Highest Time Lowest Time Standard Deviation Total Time compared to Curio
GET Reqwest 10,000 7.475 ms 62.460 ms 6.221 ms 1.966 ms 12 minutes, 27 seconds 1019% slower
GET Hyper 10,000 1.108 ms 11.78 ms 0.800 ms 0.425 ms 1 minute, 50 seconds 66% slower
GET Curio 10,000 0.668 ms 9.772 ms 0.523 ms 0.147 ms 1 minute, 6 seconds N/A
POST Reqwest 10,000 1.348 ms 22.712 ms 1.064 ms 0.511 ms 2 minutes, 14 seconds 99% slower
POST Hyper 10,000 1.138 ms 10.660 ms 0.839 ms 0.369 ms 1 minute, 53 seconds 68% slower
POST Curio 10,000 0.676 ms 2.613 ms 0.534 ms 0.097 ms 1 minute, 7 seconds N/A
DELETE Reqwest 10,000 1.360 ms 21.140 ms 0.988 ms 0.492 ms 2 minutes, 16 seconds 123% slower
DELETE Hyper 10,000 1.382 ms 29.921 ms 0.842 ms 0.838 ms 2 minutes, 18 seconds 126% slower
DELETE Curio 10,000 0.611 ms 13.118 ms 0.455 ms 0.276 ms 1 minute, 1 second N/A

Dependencies

~10MB
~265K SLoC