rinova_proxy_sdk/
utils.rs1pub 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}