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
}