diff options
Diffstat (limited to 'src/api/encoding.rs')
-rw-r--r-- | src/api/encoding.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/api/encoding.rs b/src/api/encoding.rs new file mode 100644 index 00000000..25999207 --- /dev/null +++ b/src/api/encoding.rs @@ -0,0 +1,33 @@ +pub fn xml_escape(s: &str) -> String { + s.replace("<", "<") + .replace(">", ">") + .replace("\"", """) +} + +pub fn uri_encode(string: &str, encode_slash: bool) -> String { + let mut result = String::with_capacity(string.len() * 2); + for c in string.chars() { + match c { + 'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '-' | '~' | '.' => result.push(c), + '/' if encode_slash => result.push_str("%2F"), + '/' if !encode_slash => result.push('/'), + _ => { + result.push_str( + &format!("{}", c) + .bytes() + .map(|b| format!("%{:02X}", b)) + .collect::<String>(), + ); + } + } + } + result +} + +pub fn xml_encode_key(k: &str, urlencode: bool) -> String { + if urlencode { + uri_encode(k, true) + } else { + xml_escape(k) + } +} |