Skip to main content

rinova_proxy_sdk/
utils.rs

1pub fn pad_base64(s: &str) -> String {
2    let rem = s.len() % 4;
3    if rem == 0 {
4        s.to_string()
5    } else {
6        format!("{}{}", s, "=".repeat(4 - rem))
7    }
8}
9
10pub fn safe_decode_uri(s: Option<&str>) -> String {
11    match s {
12        None | Some("") => String::new(),
13        Some(raw) => urlencoding::decode(raw)
14            .map(|decoded| decoded.into_owned())
15            .unwrap_or_else(|_| raw.to_string()),
16    }
17}
18
19pub fn decode_base64_utf8(s: &str) -> Result<String, base64::DecodeError> {
20    use base64::Engine;
21    let bytes = base64::engine::general_purpose::STANDARD.decode(pad_base64(s))?;
22    Ok(String::from_utf8_lossy(&bytes).into_owned())
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn pad_base64_adds_padding() {
31        assert_eq!(pad_base64("YWJj"), "YWJj");
32        assert_eq!(pad_base64("YWJjZA"), "YWJjZA==");
33    }
34
35    #[test]
36    fn safe_decode_uri_handles_percent() {
37        assert_eq!(safe_decode_uri(Some("%E7%BE%8E%E5%9B%BD")), "美国");
38        assert_eq!(safe_decode_uri(None), "");
39    }
40}