httpio 0.2.4

A transport-agnostic, async HTTP/1.1 client library for any runtime.
Documentation
const URL_COMPONENT_UNESCAPED: &str = r"-.!~*'()";
const URL_UNESCAPED: &str = r"-.!~*'();/?:@&=+$,#";

pub fn url_encode_component(str: &str) -> String {
    url_encode_internal(str, URL_COMPONENT_UNESCAPED)
}

pub fn url_encode(str: &str) -> String {
    url_encode_internal(str, URL_UNESCAPED)
}

fn url_encode_internal(str: &str, unescaped: &str) -> String {
    let mut result = String::new();
    for ch in str.chars() {
        if ch.is_ascii_alphanumeric() || unescaped.contains(ch) {
            result.push(ch)
        } else {
            let enc = ch.escape_unicode().to_string().to_ascii_uppercase();
            if enc.len() > 7 {
                result.push(ch);
            } else {
                result.push_str(&format!("%{:0>2}", &enc[3..enc.len() - 1]));
            }
        }
    }
    result
}