• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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