ureq 0.11.4

Minimal HTTP request library


CratesIO Documentation

Minimal request library in rust.

ureq's future

I asked for feedback on ureq's future direction and came to the conclusion that there's enough interest in a simple blocking http client to keep it going. Another motivation is that I use it extensively for my own work, to talk to S3.

I'll keep maintaining ureq. I will try to keep dependencies somewhat fresh and try to address bad bugs. I will however not personally implement new features in ureq, but I do welcome PR with open arms.

The code base is extremely simple, one might even call naive. It's a good project to hack on as first learning experience in Rust. I will uphold some base line of code hygiene, but won't block a PR due to something being a bit inelegant.


// requires feature: `ureq = { version = "*", features = ["json"] }`
extern crate ureq;

fn main() {

    // sync post request of some json.
    let resp = ureq::post("https://myapi.acme.com/ingest")
        .set("X-My-Header", "Secret")
            "name": "martin",
            "rust": true

    // .ok() tells if response is 200-299.
    if resp.ok() {
        // ...


To enable a minimal dependency tree, some features are off by default. You can control them when including ureq as a dependency.

    ureq = { version = "*", features = ["json", "charset"] }
  • tls enables https. This is enabled by default.
  • json enables response.into_json() and request.send_json() serde json.
  • charset enables interpreting the charset part of Content-Type: text/plain; charset=iso-8859-1. Without this, the library defaults to rust's built in utf-8.


  • Minimal dependency tree
  • Obvious API
  • Convencience over correctness

This library tries to provide a convenient request library with a minimal dependency tree and an obvious API. It is inspired by libraries like superagent and fetch API.

This library does not try to enforce web standards correctness. It uses HTTP/1.1, but whether the request is perfect HTTP/1.1 compatible is up to the user of the library. For example:

    let resp = ureq::post("https://myapi.acme.com/blah")
        .set("Jättegött", "Vegankörv")

The header name and value would be encoded in utf-8 and sent, but that is actually not correct according to spec cause an HTTP header name should be ascii. The absolutely correct way would be to have .set(header, value) return a Result. This library opts for convenience over correctness, so the decision is left to the user.

Sync forever

This library uses blocking socket reads and writes. When it was created, there wasn't any async/await support in rust, and for my own purposes, blocking IO was fine. At this point, one good reason to keep this library going is that it is blocking (the other is that it relies on very little use of unsafe).


  • Forms with application/x-www-form-urlencoded
  • multipart/form-data
  • Expect 100-continue
  • Use rustls when ring with versioned asm symbols is released. (PR is not resolved, but most implementations have settled on 0.13)


Copyright (c) 2019 Martin Algesten

Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.