2023-12-18 16:32:00 +00:00
<!DOCTYPE html> < html lang = "en" > < head > < meta charset = "utf-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < meta name = "generator" content = "rustdoc" > < meta name = "description" content = "Source of the Rust file `actix-web-httpauth/src/utils.rs`." > < title > utils.rs - source< / title > < link rel = "preload" as = "font" type = "font/woff2" crossorigin href = "../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2" > < link rel = "preload" as = "font" type = "font/woff2" crossorigin href = "../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2" > < link rel = "preload" as = "font" type = "font/woff2" crossorigin href = "../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2" > < link rel = "preload" as = "font" type = "font/woff2" crossorigin href = "../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2" > < link rel = "preload" as = "font" type = "font/woff2" crossorigin href = "../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2" > < link rel = "stylesheet" href = "../../static.files/normalize-76eba96aa4d2e634.css" > < link rel = "stylesheet" href = "../../static.files/rustdoc-804b98a1284a310a.css" > < meta name = "rustdoc-vars" data-root-path = "../../" data-static-root-path = "../../static.files/" data-current-crate = "actix_web_httpauth" data-themes = "" data-resource-suffix = "" data-rustdoc-version = "1.76.0-nightly (6a6287132 2023-12-17)" data-channel = "nightly" data-search-js = "search-2b6ce74ff89ae146.js" data-settings-js = "settings-4313503d2e1961c2.js" > < script src = "../../static.files/storage-f2adc0d6ca4d09fb.js" > < / script > < script defer src = "../../static.files/src-script-39ed315d46fb705f.js" > < / script > < script defer src = "../../src-files.js" > < / script > < script defer src = "../../static.files/main-305769736d49e732.js" > < / script > < noscript > < link rel = "stylesheet" href = "../../static.files/noscript-feafe1bb7466e4bd.css" > < / noscript > < link rel = "icon" href = "https://actix.rs/favicon.ico" > < / head > < body class = "rustdoc src" > <!-- [if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif] --> < nav class = "sidebar" > < / nav > < div class = "sidebar-resizer" > < / div >
< main > < nav class = "sub" > < a class = "sub-logo-container" href = "../../actix_web_httpauth/index.html" > < img src = "https://actix.rs/img/logo.png" alt = "actix_web_httpauth" > < / a > < form class = "search-form" > < span > < / span > < input class = "search-input" name = "search" aria-label = "Run search in the documentation" autocomplete = "off" spellcheck = "false" placeholder = "Click or press ‘ S’ to search, ‘ ?’ for more options…" type = "search" > < div id = "help-button" tabindex = "-1" > < a href = "../../help.html" title = "help" > ?< / a > < / div > < div id = "settings-menu" tabindex = "-1" > < a href = "../../settings.html" title = "settings" > < img width = "22" height = "22" alt = "Change settings" src = "../../static.files/wheel-7b819b6101059cd0.svg" > < / a > < / div > < / form > < / nav > < section id = "main-content" class = "content" > < div class = "example-wrap" > < div data-nosnippet > < pre class = "src-line-numbers" > < a href = "#1" id = "1" > 1< / a >
2022-12-01 10:49:14 +00:00
< a href = "#2" id = "2" > 2< / a >
< a href = "#3" id = "3" > 3< / a >
< a href = "#4" id = "4" > 4< / a >
< a href = "#5" id = "5" > 5< / a >
< a href = "#6" id = "6" > 6< / a >
< a href = "#7" id = "7" > 7< / a >
< a href = "#8" id = "8" > 8< / a >
< a href = "#9" id = "9" > 9< / a >
< a href = "#10" id = "10" > 10< / a >
< a href = "#11" id = "11" > 11< / a >
< a href = "#12" id = "12" > 12< / a >
< a href = "#13" id = "13" > 13< / a >
< a href = "#14" id = "14" > 14< / a >
< a href = "#15" id = "15" > 15< / a >
< a href = "#16" id = "16" > 16< / a >
< a href = "#17" id = "17" > 17< / a >
< a href = "#18" id = "18" > 18< / a >
< a href = "#19" id = "19" > 19< / a >
< a href = "#20" id = "20" > 20< / a >
< a href = "#21" id = "21" > 21< / a >
< a href = "#22" id = "22" > 22< / a >
< a href = "#23" id = "23" > 23< / a >
< a href = "#24" id = "24" > 24< / a >
< a href = "#25" id = "25" > 25< / a >
< a href = "#26" id = "26" > 26< / a >
< a href = "#27" id = "27" > 27< / a >
< a href = "#28" id = "28" > 28< / a >
< a href = "#29" id = "29" > 29< / a >
< a href = "#30" id = "30" > 30< / a >
< a href = "#31" id = "31" > 31< / a >
< a href = "#32" id = "32" > 32< / a >
< a href = "#33" id = "33" > 33< / a >
< a href = "#34" id = "34" > 34< / a >
< a href = "#35" id = "35" > 35< / a >
< a href = "#36" id = "36" > 36< / a >
< a href = "#37" id = "37" > 37< / a >
< a href = "#38" id = "38" > 38< / a >
< a href = "#39" id = "39" > 39< / a >
< a href = "#40" id = "40" > 40< / a >
< a href = "#41" id = "41" > 41< / a >
< a href = "#42" id = "42" > 42< / a >
< a href = "#43" id = "43" > 43< / a >
< a href = "#44" id = "44" > 44< / a >
< a href = "#45" id = "45" > 45< / a >
< a href = "#46" id = "46" > 46< / a >
< a href = "#47" id = "47" > 47< / a >
< a href = "#48" id = "48" > 48< / a >
< a href = "#49" id = "49" > 49< / a >
< a href = "#50" id = "50" > 50< / a >
< a href = "#51" id = "51" > 51< / a >
< a href = "#52" id = "52" > 52< / a >
< a href = "#53" id = "53" > 53< / a >
< a href = "#54" id = "54" > 54< / a >
< a href = "#55" id = "55" > 55< / a >
< a href = "#56" id = "56" > 56< / a >
< a href = "#57" id = "57" > 57< / a >
< a href = "#58" id = "58" > 58< / a >
< a href = "#59" id = "59" > 59< / a >
< a href = "#60" id = "60" > 60< / a >
< a href = "#61" id = "61" > 61< / a >
< a href = "#62" id = "62" > 62< / a >
< a href = "#63" id = "63" > 63< / a >
< a href = "#64" id = "64" > 64< / a >
< a href = "#65" id = "65" > 65< / a >
< a href = "#66" id = "66" > 66< / a >
< a href = "#67" id = "67" > 67< / a >
< a href = "#68" id = "68" > 68< / a >
< a href = "#69" id = "69" > 69< / a >
< a href = "#70" id = "70" > 70< / a >
< a href = "#71" id = "71" > 71< / a >
< a href = "#72" id = "72" > 72< / a >
< a href = "#73" id = "73" > 73< / a >
< a href = "#74" id = "74" > 74< / a >
< a href = "#75" id = "75" > 75< / a >
< a href = "#76" id = "76" > 76< / a >
< a href = "#77" id = "77" > 77< / a >
< a href = "#78" id = "78" > 78< / a >
< a href = "#79" id = "79" > 79< / a >
< a href = "#80" id = "80" > 80< / a >
< a href = "#81" id = "81" > 81< / a >
< a href = "#82" id = "82" > 82< / a >
< a href = "#83" id = "83" > 83< / a >
< a href = "#84" id = "84" > 84< / a >
< a href = "#85" id = "85" > 85< / a >
< a href = "#86" id = "86" > 86< / a >
< a href = "#87" id = "87" > 87< / a >
< a href = "#88" id = "88" > 88< / a >
< a href = "#89" id = "89" > 89< / a >
< a href = "#90" id = "90" > 90< / a >
< a href = "#91" id = "91" > 91< / a >
< a href = "#92" id = "92" > 92< / a >
< a href = "#93" id = "93" > 93< / a >
< a href = "#94" id = "94" > 94< / a >
< a href = "#95" id = "95" > 95< / a >
< a href = "#96" id = "96" > 96< / a >
< a href = "#97" id = "97" > 97< / a >
< a href = "#98" id = "98" > 98< / a >
< a href = "#99" id = "99" > 99< / a >
< a href = "#100" id = "100" > 100< / a >
< a href = "#101" id = "101" > 101< / a >
< a href = "#102" id = "102" > 102< / a >
< a href = "#103" id = "103" > 103< / a >
< a href = "#104" id = "104" > 104< / a >
< a href = "#105" id = "105" > 105< / a >
< a href = "#106" id = "106" > 106< / a >
< a href = "#107" id = "107" > 107< / a >
< a href = "#108" id = "108" > 108< / a >
< a href = "#109" id = "109" > 109< / a >
< a href = "#110" id = "110" > 110< / a >
< a href = "#111" id = "111" > 111< / a >
< a href = "#112" id = "112" > 112< / a >
2023-04-09 18:43:48 +00:00
< / pre > < / div > < pre class = "rust" > < code > < span class = "kw" > use < / span > std::str;
2021-03-22 11:49:07 +00:00
2022-08-24 17:10:06 +00:00
< span class = "kw" > use < / span > actix_web::web::BytesMut;
2021-03-22 11:49:07 +00:00
2022-08-24 17:10:06 +00:00
< span class = "kw" > enum < / span > State {
YieldStr,
YieldQuote,
2021-03-22 11:49:07 +00:00
}
2023-12-06 14:01:24 +00:00
< span class = "kw" > struct < / span > Quoted< < span class = "lifetime" > 'a< / span > > {
inner: ::std::iter::Peekable< str::Split< < span class = "lifetime" > 'a< / span > , char> > ,
2022-08-24 17:10:06 +00:00
state: State,
2021-03-22 11:49:07 +00:00
}
2023-12-06 14:01:24 +00:00
< span class = "kw" > impl< / span > < < span class = "lifetime" > 'a< / span > > Quoted< < span class = "lifetime" > 'a< / span > > {
< span class = "kw" > pub fn < / span > new(s: < span class = "kw-2" > & < / span > < span class = "lifetime" > 'a < / span > str) -> Quoted< < span class = "lifetime" > '_< / span > > {
2022-08-24 17:10:06 +00:00
Quoted {
2023-12-06 14:01:24 +00:00
inner: s.split(< span class = "string" > '"'< / span > ).peekable(),
2022-08-24 17:10:06 +00:00
state: State::YieldStr,
2021-03-22 11:49:07 +00:00
}
}
}
2023-12-06 14:01:24 +00:00
< span class = "kw" > impl< / span > < < span class = "lifetime" > 'a< / span > > Iterator < span class = "kw" > for < / span > Quoted< < span class = "lifetime" > 'a< / span > > {
< span class = "kw" > type < / span > Item = < span class = "kw-2" > & < / span > < span class = "lifetime" > 'a < / span > str;
2021-03-22 11:49:07 +00:00
2022-08-24 17:10:06 +00:00
< span class = "kw" > fn < / span > next(< span class = "kw-2" > & mut < / span > < span class = "self" > self< / span > ) -> < span class = "prelude-ty" > Option< / span > < < span class = "self" > Self< / span > ::Item> {
< span class = "kw" > match < / span > < span class = "self" > self< / span > .state {
State::YieldStr => < span class = "kw" > match < / span > < span class = "self" > self< / span > .inner.next() {
< span class = "prelude-val" > Some< / span > (val) => {
< span class = "self" > self< / span > .state = State::YieldQuote;
< span class = "prelude-val" > Some< / span > (val)
2021-03-22 11:49:07 +00:00
}
2022-08-24 17:10:06 +00:00
< span class = "prelude-val" > None < / span > => < span class = "prelude-val" > None< / span > ,
2021-03-22 11:49:07 +00:00
},
2022-07-21 01:52:33 +00:00
2022-08-24 17:10:06 +00:00
State::YieldQuote => < span class = "kw" > match < / span > < span class = "self" > self< / span > .inner.peek() {
2021-10-11 01:57:28 +00:00
< span class = "prelude-val" > Some< / span > (< span class = "kw" > _< / span > ) => {
2022-08-24 17:10:06 +00:00
< span class = "self" > self< / span > .state = State::YieldStr;
2023-12-06 14:01:24 +00:00
< span class = "prelude-val" > Some< / span > (< span class = "string" > "\\\""< / span > )
2021-03-22 11:49:07 +00:00
}
2022-08-24 17:10:06 +00:00
< span class = "prelude-val" > None < / span > => < span class = "prelude-val" > None< / span > ,
2021-03-22 11:49:07 +00:00
},
}
}
}
2022-08-24 17:10:06 +00:00
< span class = "doccomment" > /// Escapes the quotes in `val`.
< / span > < span class = "kw" > pub fn < / span > put_quoted(buf: < span class = "kw-2" > & mut < / span > BytesMut, val: < span class = "kw-2" > & < / span > str) {
< span class = "kw" > for < / span > part < span class = "kw" > in < / span > Quoted::new(val) {
buf.extend_from_slice(part.as_bytes());
2021-03-22 11:49:07 +00:00
}
}
2022-11-08 09:33:31 +00:00
< span class = "attr" > #[cfg(test)]
2022-08-24 17:10:06 +00:00
< / span > < span class = "kw" > mod < / span > tests {
< span class = "kw" > use < / span > std::str;
2021-03-22 11:49:07 +00:00
2022-08-24 17:10:06 +00:00
< span class = "kw" > use < / span > actix_web::web::BytesMut;
2021-03-22 11:49:07 +00:00
2022-08-24 17:10:06 +00:00
< span class = "kw" > use < / span > < span class = "kw" > super< / span > ::put_quoted;
2021-03-22 11:49:07 +00:00
2022-11-08 09:33:31 +00:00
< span class = "attr" > #[test]
2022-08-24 17:10:06 +00:00
< / span > < span class = "kw" > fn < / span > test_quote_str() {
2023-12-06 14:01:24 +00:00
< span class = "kw" > let < / span > input = < span class = "string" > "a \"quoted\" string"< / span > ;
2022-08-24 17:10:06 +00:00
< span class = "kw" > let < / span > < span class = "kw-2" > mut < / span > output = BytesMut::new();
put_quoted(< span class = "kw-2" > & mut < / span > output, input);
< span class = "kw" > let < / span > result = str::from_utf8(< span class = "kw-2" > & < / span > output).unwrap();
2021-03-22 11:49:07 +00:00
2023-12-06 14:01:24 +00:00
< span class = "macro" > assert_eq!< / span > (result, < span class = "string" > "a \\\"quoted\\\" string"< / span > );
2021-03-22 11:49:07 +00:00
}
2022-11-08 09:33:31 +00:00
< span class = "attr" > #[test]
2022-08-24 17:10:06 +00:00
< / span > < span class = "kw" > fn < / span > test_without_quotes() {
2023-12-06 14:01:24 +00:00
< span class = "kw" > let < / span > input = < span class = "string" > "non-quoted string"< / span > ;
2022-08-24 17:10:06 +00:00
< span class = "kw" > let < / span > < span class = "kw-2" > mut < / span > output = BytesMut::new();
put_quoted(< span class = "kw-2" > & mut < / span > output, input);
< span class = "kw" > let < / span > result = str::from_utf8(< span class = "kw-2" > & < / span > output).unwrap();
2021-03-22 11:49:07 +00:00
2023-12-06 14:01:24 +00:00
< span class = "macro" > assert_eq!< / span > (result, < span class = "string" > "non-quoted string"< / span > );
2021-03-22 11:49:07 +00:00
}
2022-11-08 09:33:31 +00:00
< span class = "attr" > #[test]
2022-08-24 17:10:06 +00:00
< / span > < span class = "kw" > fn < / span > test_starts_with_quote() {
2023-12-06 14:01:24 +00:00
< span class = "kw" > let < / span > input = < span class = "string" > "\"first-quoted string"< / span > ;
2022-08-24 17:10:06 +00:00
< span class = "kw" > let < / span > < span class = "kw-2" > mut < / span > output = BytesMut::new();
put_quoted(< span class = "kw-2" > & mut < / span > output, input);
< span class = "kw" > let < / span > result = str::from_utf8(< span class = "kw-2" > & < / span > output).unwrap();
2021-03-22 11:49:07 +00:00
2023-12-06 14:01:24 +00:00
< span class = "macro" > assert_eq!< / span > (result, < span class = "string" > "\\\"first-quoted string"< / span > );
2021-03-22 11:49:07 +00:00
}
2022-11-08 09:33:31 +00:00
< span class = "attr" > #[test]
2022-08-24 17:10:06 +00:00
< / span > < span class = "kw" > fn < / span > test_ends_with_quote() {
2023-12-06 14:01:24 +00:00
< span class = "kw" > let < / span > input = < span class = "string" > "last-quoted string\""< / span > ;
2022-08-24 17:10:06 +00:00
< span class = "kw" > let < / span > < span class = "kw-2" > mut < / span > output = BytesMut::new();
put_quoted(< span class = "kw-2" > & mut < / span > output, input);
< span class = "kw" > let < / span > result = str::from_utf8(< span class = "kw-2" > & < / span > output).unwrap();
2021-03-22 11:49:07 +00:00
2023-12-06 14:01:24 +00:00
< span class = "macro" > assert_eq!< / span > (result, < span class = "string" > "last-quoted string\\\""< / span > );
2021-03-22 11:49:07 +00:00
}
2022-11-08 09:33:31 +00:00
< span class = "attr" > #[test]
2022-08-24 17:10:06 +00:00
< / span > < span class = "kw" > fn < / span > test_double_quote() {
2023-12-06 14:01:24 +00:00
< span class = "kw" > let < / span > input = < span class = "string" > "quote\"\"string"< / span > ;
2022-08-24 17:10:06 +00:00
< span class = "kw" > let < / span > < span class = "kw-2" > mut < / span > output = BytesMut::new();
put_quoted(< span class = "kw-2" > & mut < / span > output, input);
< span class = "kw" > let < / span > result = str::from_utf8(< span class = "kw-2" > & < / span > output).unwrap();
2021-03-22 11:49:07 +00:00
2023-12-06 14:01:24 +00:00
< span class = "macro" > assert_eq!< / span > (result, < span class = "string" > "quote\\\"\\\"string"< / span > );
2021-03-22 11:49:07 +00:00
}
}
2023-03-23 10:55:38 +00:00
< / code > < / pre > < / div > < / section > < / main > < / body > < / html >