1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef URL_JS_URLHELPER_H
17 #define URL_JS_URLHELPER_H
18
19 #include <string>
20 #include <string_view>
21
22 namespace OHOS::Url {
23
24 constexpr size_t DECIMAL_RADIX = 10;
25 constexpr size_t INT_SHIFT_SIZE = 4;
26 constexpr size_t HEX_RADIX = 16;
27 constexpr size_t HEX_PAIR_LENGTH = 2;
28 constexpr size_t PERCENT_ENCODING_LENGTH = 3;
29 constexpr size_t SHIFT_SIZE = 4;
30 constexpr size_t CHARS_LENGTH = 4;
31 constexpr char HEX_CHAR_MAP[] = "0123456789ABCDEF";
32 typedef std::pair<std::string, std::string> KeyValue;
33
34 // hostname, host
35 constexpr uint16_t URL_ENCODED_PERCENT_SIGN_CHARS[16] = {
36 // 00 01 02 03 04 05 06 07
37 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
38 // 08 09 0A 0B 0C 0D 0E 0F
39 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
40 // 10 11 12 13 14 15 16 17
41 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
42 // 18 19 1A 1B 1C 1D 1E 1F
43 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
44 // 20 21 22 23 24 25 26 27
45 0x0001 | 0x0000 | 0x0004 | 0x0000 | 0x0000 | 0x0020 | 0x0000 | 0x0000 |
46 // 28 29 2A 2B 2C 2D 2E 2F
47 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
48 // 30 31 32 33 34 35 36 37
49 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
50 // 38 39 3A 3B 3C 3D 3E 3F
51 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
52 // 40 41 42 43 44 45 46 47
53 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
54 // 48 49 4A 4B 4C 4D 4E 4F
55 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
56 // 50 51 52 53 54 55 56 57
57 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
58 // 58 59 5A 5B 5C 5D 5E 5F
59 0x0000 | 0x0000 | 0x0000 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x0000,
60 // 60 61 62 63 64 65 66 67
61 0x0001 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
62 // 68 69 6A 6B 6C 6D 6E 6F
63 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
64 // 70 71 72 73 74 75 76 77
65 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
66 // 78 79 7A 7B 7C 7D 7E 7F
67 0x0000 | 0x0000 | 0x0000 | 0x0800 | 0x1000 | 0x2000 | 0x0000 | 0x8000,
68 // 80 81 82 83 84 85 86 87
69 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
70 // 88 89 8A 8B 8C 8D 8E 8F
71 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
72 // 90 91 92 93 94 95 96 97
73 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
74 // 98 99 9A 9B 9C 9D 9E 9F
75 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
76 // A0 A1 A2 A3 A4 A5 A6 A7
77 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
78 // A8 A9 AA AB AC AD AE AF
79 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
80 // B0 B1 B2 B3 B4 B5 B6 B7
81 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
82 // B8 B9 BA BB BC BD BE BF
83 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
84 // C0 C1 C2 C3 C4 C5 C6 C7
85 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
86 // C8 C9 CA CB CC CD CE CF
87 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
88 // D0 D1 D2 D3 D4 D5 D6 D7
89 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
90 // D8 D9 DA DB DC DD DE DF
91 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
92 // E0 E1 E2 E3 E4 E5 E6 E7
93 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
94 // E8 E9 EA EB EC ED EE EF
95 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
96 // F0 F1 F2 F3 F4 F5 F6 F7
97 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
98 // F8 F9 FA FB FC FD FE FF
99 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000
100 };
101
102 // username, password {'%25':'%'}
103 constexpr uint16_t USERINFO_PERCENT_SIGN_CHARS[16] = {
104 // 00 01 02 03 04 05 06 07
105 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
106 // 08 09 0A 0B 0C 0D 0E 0F
107 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
108 // 10 11 12 13 14 15 16 17
109 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
110 // 18 19 1A 1B 1C 1D 1E 1F
111 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
112 // 20 21 22 23 24 25 26 27
113 0x0001 | 0x0000 | 0x0004 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
114 // 28 29 2A 2B 2C 2D 2E 2F
115 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
116 // 30 31 32 33 34 35 36 37
117 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
118 // 38 39 3A 3B 3C 3D 3E 3F
119 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
120 // 40 41 42 43 44 45 46 47
121 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
122 // 48 49 4A 4B 4C 4D 4E 4F
123 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
124 // 50 51 52 53 54 55 56 57
125 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
126 // 58 59 5A 5B 5C 5D 5E 5F
127 0x0000 | 0x0000 | 0x0000 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x0000,
128 // 60 61 62 63 64 65 66 67
129 0x0001 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
130 // 68 69 6A 6B 6C 6D 6E 6F
131 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
132 // 70 71 72 73 74 75 76 77
133 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
134 // 78 79 7A 7B 7C 7D 7E 7F
135 0x0000 | 0x0000 | 0x0000 | 0x0800 | 0x1000 | 0x2000 | 0x0000 | 0x8000,
136 // 80 81 82 83 84 85 86 87
137 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
138 // 88 89 8A 8B 8C 8D 8E 8F
139 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
140 // 90 91 92 93 94 95 96 97
141 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
142 // 98 99 9A 9B 9C 9D 9E 9F
143 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
144 // A0 A1 A2 A3 A4 A5 A6 A7
145 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
146 // A8 A9 AA AB AC AD AE AF
147 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
148 // B0 B1 B2 B3 B4 B5 B6 B7
149 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
150 // B8 B9 BA BB BC BD BE BF
151 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
152 // C0 C1 C2 C3 C4 C5 C6 C7
153 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
154 // C8 C9 CA CB CC CD CE CF
155 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
156 // D0 D1 D2 D3 D4 D5 D6 D7
157 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
158 // D8 D9 DA DB DC DD DE DF
159 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
160 // E0 E1 E2 E3 E4 E5 E6 E7
161 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
162 // E8 E9 EA EB EC ED EE EF
163 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
164 // F0 F1 F2 F3 F4 F5 F6 F7
165 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
166 // F8 F9 FA FB FC FD FE FF
167 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000
168 };
169
170 // path {'%7C': '|', '%5B': '[', '%5D': ']', '%25': '%'} %5C '\\'
171 constexpr uint16_t PATH_PERCENT_SIGN_CHARS[16] = {
172 // 00 01 02 03 04 05 06 07
173 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
174 // 08 09 0A 0B 0C 0D 0E 0F
175 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
176 // 10 11 12 13 14 15 16 17
177 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
178 // 18 19 1A 1B 1C 1D 1E 1F
179 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
180 // 20 21 22 23 24 25 26 27
181 0x0001 | 0x0000 | 0x0004 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
182 // 28 29 2A 2B 2C 2D 2E 2F
183 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
184 // 30 31 32 33 34 35 36 37
185 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
186 // 38 39 3A 3B 3C 3D 3E 3F
187 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
188 // 40 41 42 43 44 45 46 47
189 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
190 // 48 49 4A 4B 4C 4D 4E 4F
191 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
192 // 50 51 52 53 54 55 56 57
193 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
194 // 58 59 5A 5B 5C 5D 5E 5F
195 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
196 // 60 61 62 63 64 65 66 67
197 0x0001 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
198 // 68 69 6A 6B 6C 6D 6E 6F
199 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
200 // 70 71 72 73 74 75 76 77
201 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
202 // 78 79 7A 7B 7C 7D 7E 7F
203 0x0000 | 0x0000 | 0x0000 | 0x0800 | 0x0000 | 0x2000 | 0x0000 | 0x8000,
204 // 80 81 82 83 84 85 86 87
205 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
206 // 88 89 8A 8B 8C 8D 8E 8F
207 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
208 // 90 91 92 93 94 95 96 97
209 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
210 // 98 99 9A 9B 9C 9D 9E 9F
211 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
212 // A0 A1 A2 A3 A4 A5 A6 A7
213 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
214 // A8 A9 AA AB AC AD AE AF
215 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
216 // B0 B1 B2 B3 B4 B5 B6 B7
217 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
218 // B8 B9 BA BB BC BD BE BF
219 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
220 // C0 C1 C2 C3 C4 C5 C6 C7
221 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
222 // C8 C9 CA CB CC CD CE CF
223 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
224 // D0 D1 D2 D3 D4 D5 D6 D7
225 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
226 // D8 D9 DA DB DC DD DE DF
227 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
228 // E0 E1 E2 E3 E4 E5 E6 E7
229 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
230 // E8 E9 EA EB EC ED EE EF
231 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
232 // F0 F1 F2 F3 F4 F5 F6 F7
233 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
234 // F8 F9 FA FB FC FD FE FF
235 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000
236 };
237
238 // hash, fragment {'%7C': '|', '%5B': '[', '%5D': ']', '%7B': '{', '%7D': '}', '%60': '`', '%25': '%'}
239 constexpr uint16_t FRAGMENT_PERCENT_SIGN_CHARS[16] = {
240 // 00 01 02 03 04 05 06 07
241 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
242 // 08 09 0A 0B 0C 0D 0E 0F
243 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
244 // 10 11 12 13 14 15 16 17
245 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
246 // 18 19 1A 1B 1C 1D 1E 1F
247 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
248 // 20 21 22 23 24 25 26 27
249 0x0001 | 0x0000 | 0x0004 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
250 // 28 29 2A 2B 2C 2D 2E 2F
251 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
252 // 30 31 32 33 34 35 36 37
253 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
254 // 38 39 3A 3B 3C 3D 3E 3F
255 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
256 // 40 41 42 43 44 45 46 47
257 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
258 // 48 49 4A 4B 4C 4D 4E 4F
259 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
260 // 50 51 52 53 54 55 56 57
261 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
262 // 58 59 5A 5B 5C 5D 5E 5F
263 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
264 // 60 61 62 63 64 65 66 67
265 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
266 // 68 69 6A 6B 6C 6D 6E 6F
267 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
268 // 70 71 72 73 74 75 76 77
269 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
270 // 78 79 7A 7B 7C 7D 7E 7F
271 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x8000,
272 // 80 81 82 83 84 85 86 87
273 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
274 // 88 89 8A 8B 8C 8D 8E 8F
275 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
276 // 90 91 92 93 94 95 96 97
277 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
278 // 98 99 9A 9B 9C 9D 9E 9F
279 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
280 // A0 A1 A2 A3 A4 A5 A6 A7
281 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
282 // A8 A9 AA AB AC AD AE AF
283 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
284 // B0 B1 B2 B3 B4 B5 B6 B7
285 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
286 // B8 B9 BA BB BC BD BE BF
287 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
288 // C0 C1 C2 C3 C4 C5 C6 C7
289 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
290 // C8 C9 CA CB CC CD CE CF
291 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
292 // D0 D1 D2 D3 D4 D5 D6 D7
293 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
294 // D8 D9 DA DB DC DD DE DF
295 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
296 // E0 E1 E2 E3 E4 E5 E6 E7
297 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
298 // E8 E9 EA EB EC ED EE EF
299 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
300 // F0 F1 F2 F3 F4 F5 F6 F7
301 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
302 // F8 F9 FA FB FC FD FE FF
303 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000
304 };
305
306 // query {'%7C': '|', '%5B': '[', '%5D': ']', '%7B': '{', '%7D': '}', '%60': '`', '%5E': '^', '%25': '%'}
307 constexpr uint16_t QUERY_PERCENT_SIGN_CHARS[16] = {
308 // 00 01 02 03 04 05 06 07
309 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
310 // 08 09 0A 0B 0C 0D 0E 0F
311 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
312 // 10 11 12 13 14 15 16 17
313 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
314 // 18 19 1A 1B 1C 1D 1E 1F
315 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
316 // 20 21 22 23 24 25 26 27
317 0x0001 | 0x0000 | 0x0004 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
318 // 28 29 2A 2B 2C 2D 2E 2F
319 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
320 // 30 31 32 33 34 35 36 37
321 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
322 // 38 39 3A 3B 3C 3D 3E 3F
323 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x4000 | 0x0000,
324 // 40 41 42 43 44 45 46 47
325 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
326 // 48 49 4A 4B 4C 4D 4E 4F
327 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
328 // 50 51 52 53 54 55 56 57
329 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
330 // 58 59 5A 5B 5C 5D 5E 5F
331 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x1000 | 0x0000 | 0x0000 | 0x0000,
332 // 60 61 62 63 64 65 66 67
333 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
334 // 68 69 6A 6B 6C 6D 6E 6F
335 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000,
336 // 70 71 72 73 74 75 76 77
337 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
338 // 78 79 7A 7B 7C 7D 7E 7F
339 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x0000 | 0x8000,
340 // 80 81 82 83 84 85 86 87
341 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
342 // 88 89 8A 8B 8C 8D 8E 8F
343 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
344 // 90 91 92 93 94 95 96 97
345 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
346 // 98 99 9A 9B 9C 9D 9E 9F
347 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
348 // A0 A1 A2 A3 A4 A5 A6 A7
349 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
350 // A8 A9 AA AB AC AD AE AF
351 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
352 // B0 B1 B2 B3 B4 B5 B6 B7
353 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
354 // B8 B9 BA BB BC BD BE BF
355 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
356 // C0 C1 C2 C3 C4 C5 C6 C7
357 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
358 // C8 C9 CA CB CC CD CE CF
359 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
360 // D0 D1 D2 D3 D4 D5 D6 D7
361 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
362 // D8 D9 DA DB DC DD DE DF
363 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
364 // E0 E1 E2 E3 E4 E5 E6 E7
365 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
366 // E8 E9 EA EB EC ED EE EF
367 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000,
368 // F0 F1 F2 F3 F4 F5 F6 F7
369 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
370 // F8 F9 FA FB FC FD FE FF
371 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000
372 };
373
NeedEncode(const uint16_t codeMap[],const uint8_t asciiChar)374 inline bool NeedEncode(const uint16_t codeMap[], const uint8_t asciiChar)
375 {
376 return (codeMap[asciiChar >> INT_SHIFT_SIZE] & (1 << (asciiChar & 0x0F))) != 0;
377 }
378
HexToDecimal(unsigned char hexChar)379 inline std::uint8_t HexToDecimal(unsigned char hexChar)
380 {
381 if (hexChar >= '0' && hexChar <= '9') {
382 return hexChar - '0';
383 } else if (hexChar >= 'A' && hexChar <= 'F') {
384 return hexChar - 'A' + DECIMAL_RADIX;
385 } else if (hexChar >= 'a' && hexChar <= 'f') {
386 return hexChar - 'a' + DECIMAL_RADIX;
387 } else {
388 return 0;
389 }
390 }
391
AppendChars(std::string & result,size_t & i,size_t length,unsigned char * chars)392 inline void AppendChars(std::string& result, size_t& i, size_t length, unsigned char* chars)
393 {
394 for (size_t j = length; j-- > 0;) {
395 result += chars[j];
396 i += (HEX_PAIR_LENGTH + 1);
397 }
398 }
PercentCharDecodable(const std::string_view inputString,size_t i,unsigned char & ch)399 inline bool PercentCharDecodable(const std::string_view inputString, size_t i, unsigned char& ch)
400 {
401 if (inputString[i] == '%' && i + HEX_PAIR_LENGTH < inputString.size() && std::isxdigit(inputString[i + 1]) &&
402 std::isxdigit(inputString[i + HEX_PAIR_LENGTH])) {
403 ch = HexToDecimal(inputString[i + 1]) * HEX_RADIX + HexToDecimal(inputString[i + HEX_PAIR_LENGTH]);
404 return true;
405 }
406 return false;
407 }
408
GetCharLength(unsigned char ch)409 inline size_t GetCharLength(unsigned char ch)
410 {
411 if ((ch & 0x80) == 0) { // 0x80 mean 0XXXXXXX
412 return 1; // 1 char length,0XXXXXXX
413 } else if (((ch >> 5) ^ 0x6) == 0) { // 5,0x6 mean begin with 110XXXXX
414 return 2; // 2 char length,110XXXXX 10XXXXXX
415 } else if (((ch >> 4) ^ 0xE) == 0) { // 4,0xE mean begin with 1110XXXX
416 return 3; // 3 char length,110XXXXX 10XXXXXX 10XXXXXX
417 } else if (((ch >> 3) ^ 0x1E) == 0) { // 3,0x1E mean begin with 11110XXX
418 return 4; // 4 char length,110XXXXX 10XXXXXX 10XXXXXX 10XXXXXX
419 }
420 return 0;
421 }
422
423 std::string EncodePercentEncoding(const std::string_view inputString, const uint16_t codeMap[]);
424 std::string DecodePercentEncoding(const std::string_view inputString);
425 void StringAnalyzing(std::string_view inputString, std::vector<KeyValue>& params);
426
427 } // namespace OHOS::Url
428 #endif // URL_JS_URLHELPER_H