qiniu_credential/
header_name.rs

1use once_cell::sync::Lazy;
2use std::{borrow::Cow, collections::HashSet};
3
4pub(super) fn make_header_name(header_name: Cow<str>) -> Cow<str> {
5    let mut need_not_clone = header_name
6        .chars()
7        .any(|header_char| !HEADER_NAME_TOKEN.contains(&header_char));
8    if need_not_clone {
9        let mut upper = true;
10        need_not_clone = header_name.chars().all(|header_char| {
11            if (upper && header_char.is_lowercase()) || (!upper && header_char.is_uppercase()) {
12                false
13            } else {
14                upper = header_char == '-';
15                true
16            }
17        })
18    };
19    if need_not_clone {
20        return header_name;
21    }
22
23    let mut upper = true;
24    let mut new_header_name = String::with_capacity(header_name.len());
25    for header_char in header_name.chars() {
26        if upper && header_char.is_lowercase() {
27            new_header_name.push(header_char.to_ascii_uppercase());
28        } else if !upper && header_char.is_uppercase() {
29            new_header_name.push(header_char.to_ascii_lowercase());
30        } else {
31            new_header_name.push(header_char);
32        }
33        upper = header_char == '-';
34    }
35    new_header_name.into()
36}
37
38static HEADER_NAME_TOKEN: Lazy<HashSet<char>> = Lazy::new(|| {
39    let mut set = HashSet::with_capacity(127);
40    set.insert('!');
41    set.insert('#');
42    set.insert('$');
43    set.insert('%');
44    set.insert('&');
45    set.insert('\'');
46    set.insert('*');
47    set.insert('+');
48    set.insert('-');
49    set.insert('.');
50    set.insert('0');
51    set.insert('1');
52    set.insert('2');
53    set.insert('3');
54    set.insert('4');
55    set.insert('5');
56    set.insert('6');
57    set.insert('7');
58    set.insert('8');
59    set.insert('9');
60    set.insert('A');
61    set.insert('B');
62    set.insert('C');
63    set.insert('D');
64    set.insert('E');
65    set.insert('F');
66    set.insert('G');
67    set.insert('H');
68    set.insert('I');
69    set.insert('J');
70    set.insert('K');
71    set.insert('L');
72    set.insert('M');
73    set.insert('N');
74    set.insert('O');
75    set.insert('P');
76    set.insert('Q');
77    set.insert('R');
78    set.insert('S');
79    set.insert('T');
80    set.insert('U');
81    set.insert('W');
82    set.insert('V');
83    set.insert('X');
84    set.insert('Y');
85    set.insert('Z');
86    set.insert('^');
87    set.insert('_');
88    set.insert('`');
89    set.insert('a');
90    set.insert('b');
91    set.insert('c');
92    set.insert('d');
93    set.insert('e');
94    set.insert('f');
95    set.insert('g');
96    set.insert('h');
97    set.insert('i');
98    set.insert('j');
99    set.insert('k');
100    set.insert('l');
101    set.insert('m');
102    set.insert('n');
103    set.insert('o');
104    set.insert('p');
105    set.insert('q');
106    set.insert('r');
107    set.insert('s');
108    set.insert('t');
109    set.insert('u');
110    set.insert('v');
111    set.insert('w');
112    set.insert('x');
113    set.insert('y');
114    set.insert('z');
115    set.insert('|');
116    set.insert('~');
117    set
118});