aboutsummaryrefslogtreecommitdiff
path: root/src/api/encoding.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/encoding.rs')
-rw-r--r--src/api/encoding.rs33
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("<", "&lt;")
+ .replace(">", "&gt;")
+ .replace("\"", "&quot;")
+}
+
+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)
+ }
+}