blob: 7eb79340bad716fd863dfe4a247e29774dee030f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
use data_encoding::{Encoding, Specification};
use std::iter::Peekable;
use std::str::Chars;
pub(crate) fn base64() -> Result<Encoding, &'static str> {
let mut spec = Specification::new();
spec.check_trailing_bits = false;
spec.symbols
.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
spec.padding = None;
spec.ignore = "=".to_owned();
spec.encoding()
.map_err(|_err| "invalid base64 specification")
}
pub(crate) fn is_tchar(c: char) -> bool {
// See tchar values list in https://tools.ietf.org/html/rfc7230#section-3.2.6
let tchars = "!#$%&'*+-.^_`|~";
tchars.contains(c) || c.is_ascii_alphanumeric()
}
pub(crate) fn is_allowed_b64_content(c: char) -> bool {
c.is_ascii_alphanumeric() || c == '+' || c == '=' || c == '/'
}
pub(crate) fn consume_ows_chars(input_chars: &mut Peekable<Chars>) {
while let Some(c) = input_chars.peek() {
if c == &' ' || c == &'\t' {
input_chars.next();
} else {
break;
}
}
}
pub(crate) fn consume_sp_chars(input_chars: &mut Peekable<Chars>) {
while let Some(c) = input_chars.peek() {
if c == &' ' {
input_chars.next();
} else {
break;
}
}
}
|