use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine};
#[cfg(feature = "server")]
pub fn decode_url(encoded: &str) -> Option<String> {
if let Ok(bytes) = hex::decode(encoded) {
if let Ok(s) = String::from_utf8(bytes) {
return Some(s);
}
}
if let Ok(bytes) = URL_SAFE_NO_PAD.decode(encoded) {
if let Ok(s) = String::from_utf8(bytes) {
return Some(s);
}
}
urlencoding::decode(encoded).ok().map(|s| s.into_owned())
}
pub fn encode_url_hex(url: &str) -> String {
hex::encode(url.as_bytes())
}
pub fn encode_url_base64(url: &str) -> String {
URL_SAFE_NO_PAD.encode(url.as_bytes())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hex_encoding() {
let url = "https://example.com/image.png";
let encoded = encode_url_hex(url);
assert!(hex::decode(&encoded).is_ok());
}
#[test]
fn test_base64_encoding() {
let url = "https://example.com/image.png";
let encoded = encode_url_base64(url);
assert!(URL_SAFE_NO_PAD.decode(&encoded).is_ok());
}
#[cfg(feature = "server")]
#[test]
fn test_hex_roundtrip() {
let url = "https://example.com/image.png";
let encoded = encode_url_hex(url);
let decoded = decode_url(&encoded).unwrap();
assert_eq!(decoded, url);
}
#[cfg(feature = "server")]
#[test]
fn test_base64_roundtrip() {
let url = "https://example.com/image.png";
let encoded = encode_url_base64(url);
let decoded = decode_url(&encoded).unwrap();
assert_eq!(decoded, url);
}
}