qiniu_credential/
header_name.rs1use 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});