diff options
author | Martin Fischer <martin@push-f.com> | 2021-04-18 10:42:14 +0200 |
---|---|---|
committer | Martin Fischer <martin@push-f.com> | 2021-04-18 10:42:14 +0200 |
commit | e731a5f94e1062cb62c2f8e9e123aee528b322ac (patch) | |
tree | fb2f25370e170564a53c93d246c3ca556ed88a21 /src | |
parent | d6b193f4adc29421901d7a27e3fba33dd6b14978 (diff) |
add html_escape methodv0.4.1
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 34 |
1 files changed, 33 insertions, 1 deletions
@@ -3,6 +3,8 @@ #![cfg_attr(docsrs, feature(doc_cfg))] +use std::borrow::Cow; + pub use mime; pub use httpdate; @@ -20,4 +22,34 @@ pub mod hyper_body; #[cfg(not(feature="hyper_body"))] use http; #[cfg(feature="hyper_body")] -use hyper::http;
\ No newline at end of file +use hyper::http; + +/// HTML escapes the given string. +/// +/// The following characters are escaped: `<`, `>`, `&`, `"`, `'`. +/// To mitigate the risks of forgetting to HTML escape something, +/// it is recommended to additionally set a strict [Content Security +/// Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP). +pub fn html_escape<'a, S: Into<Cow<'a, str>>>(input: S) -> Cow<'a, str> { + let input = input.into(); + fn is_trouble(c: char) -> bool { + c == '<' || c == '>' || c == '&' || c == '"' || c == '\'' + } + + if input.contains(is_trouble) { + let mut output = String::with_capacity(input.len()); + for c in input.chars() { + match c { + '<' => output.push_str("<"), + '>' => output.push_str(">"), + '&' => output.push_str("&"), + '"' => output.push_str("""), + '\'' => output.push_str("'"), + _ => output.push(c), + } + } + Cow::Owned(output) + } else { + input + } +}
\ No newline at end of file |