• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2  * Copyright (c) 2022-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 #include "native_module_url.h"
17 #include "tools/log.h"
18 #include "url_helper.h"
19 
20 extern const char _binary_js_url_js_start[];
21 extern const char _binary_js_url_js_end[];
22 extern const char _binary_url_abc_start[];
23 extern const char _binary_url_abc_end[];
24 namespace OHOS::Url {
UrlStructor(napi_env & env,napi_callback_info & info,URL * & object)25     static void UrlStructor(napi_env &env, napi_callback_info &info, URL *&object)
26     {
27         napi_value thisVar = nullptr;
28         size_t argc = 2; // 2:The number of parameters is 2
29         napi_value argv[2] = { 0 }; // 2:The number of parameters is 2
30         void *data = nullptr;
31         napi_get_cb_info(env, info, &argc, nullptr, &thisVar, &data);
32         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
33         napi_valuetype valuetype1 = napi_null;
34         napi_valuetype valuetype2 = napi_null;
35         napi_typeof(env, argv[0], &valuetype1);
36         if (valuetype1 == napi_string) {
37             std::string temp = "";
38             std::string tempType = "";
39             size_t tempSize = 0;
40             size_t tempTypeSize = 0;
41             if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &tempSize) != napi_ok) {
42                 HILOG_ERROR("UrlStructor:: can not get argv[0] size");
43                 return;
44             }
45             temp.reserve(tempSize + 1);
46             temp.resize(tempSize);
47             if (napi_get_value_string_utf8(env, argv[0], temp.data(), tempSize + 1, &tempSize) != napi_ok) {
48                 HILOG_ERROR("UrlStructor:: can not get argv[0] value");
49                 return;
50             }
51             std::string input = temp;
52             napi_typeof(env, argv[1], &valuetype2);
53             if (valuetype2 == napi_string) {
54                 if (napi_get_value_string_utf8(env, argv[1], nullptr, 0, &tempTypeSize) != napi_ok) {
55                     HILOG_ERROR("UrlStructor:: can not get argv[1] size");
56                     return;
57                 }
58                 tempType.reserve(tempTypeSize + 1);
59                 tempType.resize(tempTypeSize);
60                 if (napi_get_value_string_utf8(env, argv[1], tempType.data(),
61                                                tempTypeSize + 1, &tempTypeSize) != napi_ok) {
62                     HILOG_ERROR("UrlStructor:: can not get argv[1] value");
63                     return;
64                 }
65                 std::string base = tempType;
66                 object = new (std::nothrow) URL(input, base);
67                 if (object == nullptr) {
68                     HILOG_ERROR("UrlStructor:: memory allocation failed, object is nullptr");
69                     return;
70                 }
71             } else if (valuetype2 == napi_object) {
72                 URL *tempUrl = nullptr;
73                 napi_unwrap(env, argv[1], reinterpret_cast<void**>(&tempUrl));
74                 if (tempUrl == nullptr) {
75                     HILOG_ERROR("UrlStructor:: tempUrl is nullptr");
76                     return;
77                 }
78                 object = new (std::nothrow) URL(input, *tempUrl);
79                 if (object == nullptr) {
80                     HILOG_ERROR("UrlStructor:: memory allocation failed, object is nullptr");
81                     return;
82                 }
83             } else {
84                 HILOG_INFO("UrlStructor:: secondParameter error");
85             }
86         } else {
87             HILOG_INFO("UrlStructor:: firstParameter error");
88         }
89         return;
90     }
91 
UrlConstructor(napi_env env,napi_callback_info info)92     static napi_value UrlConstructor(napi_env env, napi_callback_info info)
93     {
94         napi_value thisVar = nullptr;
95         void *data = nullptr;
96         size_t argc = 0;
97         napi_value argv[2] = { 0 }; // 2:The number of parameters is 2
98         URL *object = nullptr;
99         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, &data));
100         if (argc == 1) {
101             NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data));
102             napi_valuetype valuetype = napi_null;
103             NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
104             if (valuetype == napi_string) {
105                 std::string type = "";
106                 size_t typeSize = 0;
107                 if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeSize) != napi_ok) {
108                     HILOG_ERROR("UrlStructor:: can not get argv[0] size");
109                     return nullptr;
110                 }
111                 type.reserve(typeSize + 1);
112                 type.resize(typeSize);
113                 if (napi_get_value_string_utf8(env, argv[0], type.data(), typeSize + 1, &typeSize) != napi_ok) {
114                     HILOG_ERROR("UrlStructor:: can not get argv[0] value");
115                     return nullptr;
116                 }
117                 std::string input = type;
118                 object = new (std::nothrow) URL(input);
119                 if (object == nullptr) {
120                     HILOG_ERROR("UrlStructor:: memory allocation failed, object is nullptr");
121                     return nullptr;
122                 }
123             } else {
124                 HILOG_INFO("UrlStructor:: Parameter error");
125             }
126         } else if (argc == 2) { // 2:When the input parameter is set to 2
127             UrlStructor(env, info, object);
128         }
129         napi_status status = napi_wrap(env, thisVar, object,
130             [](napi_env environment, void *data, void *hint) {
131                 auto obj = reinterpret_cast<URL*>(data);
132                 if (obj != nullptr) {
133                     delete obj;
134                     obj = nullptr;
135                 }
136             }, nullptr, nullptr);
137         if (status != napi_ok && object != nullptr) {
138             delete object;
139             object = nullptr;
140         }
141         return thisVar;
142     }
143 
GetHostname(napi_env env,napi_callback_info info)144     static napi_value GetHostname(napi_env env, napi_callback_info info)
145     {
146         napi_value thisVar = nullptr;
147         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
148         URL *murl = nullptr;
149         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
150         napi_value retVal = murl->GetHostname(env);
151         return retVal;
152     }
153 
GetSearch(napi_env env,napi_callback_info info)154     static napi_value GetSearch(napi_env env, napi_callback_info info)
155     {
156         napi_value thisVar = nullptr;
157         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
158         URL *murl = nullptr;
159         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
160         napi_value retVal = murl->GetSearch(env);
161         return retVal;
162     }
163 
GetEncodeSearch(napi_env env,napi_callback_info info)164     static napi_value GetEncodeSearch(napi_env env, napi_callback_info info)
165     {
166         napi_value thisVar = nullptr;
167         if (napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr) != napi_ok) {
168             HILOG_ERROR("URL:: can not get thisVar");
169             return nullptr;
170         }
171         URL *murl = nullptr;
172         if (napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)) != napi_ok) {
173             HILOG_ERROR("URL:: can not get murl");
174             return nullptr;
175         }
176         napi_value retVal = murl->GetEncodeSearch(env);
177         return retVal;
178     }
179 
GetUsername(napi_env env,napi_callback_info info)180     static napi_value GetUsername(napi_env env, napi_callback_info info)
181     {
182         napi_value thisVar = nullptr;
183         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
184         URL *murl = nullptr;
185         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
186         napi_value retVal = murl->GetUsername(env);
187         return retVal;
188     }
189 
GetPassword(napi_env env,napi_callback_info info)190     static napi_value GetPassword(napi_env env, napi_callback_info info)
191     {
192         napi_value thisVar = nullptr;
193         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
194         URL *murl = nullptr;
195         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
196         napi_value retVal = murl->GetPassword(env);
197         return retVal;
198     }
199 
GetUrlFragment(napi_env env,napi_callback_info info)200     static napi_value GetUrlFragment(napi_env env, napi_callback_info info)
201     {
202         napi_value thisVar = nullptr;
203         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
204         URL *murl = nullptr;
205         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
206         napi_value retVal = murl->GetFragment(env);
207         return retVal;
208     }
209 
GetUrlScheme(napi_env env,napi_callback_info info)210     static napi_value GetUrlScheme(napi_env env, napi_callback_info info)
211     {
212         napi_value thisVar = nullptr;
213         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
214         URL *murl = nullptr;
215         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
216         napi_value retVal = murl->GetScheme(env);
217         return retVal;
218     }
219 
GetUrlPort(napi_env env,napi_callback_info info)220     static napi_value GetUrlPort(napi_env env, napi_callback_info info)
221     {
222         napi_value thisVar = nullptr;
223         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
224         URL *murl = nullptr;
225         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
226         napi_value retVal = murl->GetPort(env);
227         return retVal;
228     }
229 
GetUrlHost(napi_env env,napi_callback_info info)230     static napi_value GetUrlHost(napi_env env, napi_callback_info info)
231     {
232         napi_value thisVar = nullptr;
233         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
234         URL *murl = nullptr;
235         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
236         napi_value retVal = murl->GetHost(env);
237         return retVal;
238     }
239 
GetEncodeUrlHost(napi_env env,napi_callback_info info)240     static napi_value GetEncodeUrlHost(napi_env env, napi_callback_info info)
241     {
242         napi_value thisVar = nullptr;
243         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
244         URL *murl = nullptr;
245         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
246         napi_value retVal = murl->GetEncodeHost(env);
247         return retVal;
248     }
249 
GetUrlPath(napi_env env,napi_callback_info info)250     static napi_value GetUrlPath(napi_env env, napi_callback_info info)
251     {
252         napi_value thisVar = nullptr;
253         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
254         URL *murl = nullptr;
255         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
256         napi_value retVal = murl->GetPath(env);
257         return retVal;
258     }
259 
GetOnOrOff(napi_env env,napi_callback_info info)260     static napi_value GetOnOrOff(napi_env env, napi_callback_info info)
261     {
262         napi_value thisVar = nullptr;
263         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
264         URL *murl = nullptr;
265         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
266         napi_value retVal = murl->GetOnOrOff(env);
267         return retVal;
268     }
269 
GetIsIpv6(napi_env env,napi_callback_info info)270     static napi_value GetIsIpv6(napi_env env, napi_callback_info info)
271     {
272         napi_value thisVar = nullptr;
273         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
274         URL *murl = nullptr;
275         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
276         napi_value retVal = murl->GetIsIpv6(env);
277         return retVal;
278     }
279 
SetHref(napi_env env,napi_callback_info info)280     static napi_value SetHref(napi_env env, napi_callback_info info)
281     {
282         napi_value thisVar = nullptr;
283         napi_value argv[1] = {0};
284         size_t argc = 1;
285         std::string input = "";
286         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
287         size_t typelen = 0;
288         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
289             HILOG_ERROR("URL:: can not get argv[0] size");
290             return nullptr;
291         }
292         input.reserve(typelen + 1);
293         input.resize(typelen);
294         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
295             HILOG_ERROR("URL:: can not get argv[0] value");
296             return nullptr;
297         }
298         URL *murl = nullptr;
299         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
300         murl->SetHref(input);
301         napi_value result = nullptr;
302         NAPI_CALL(env, napi_get_undefined(env, &result));
303         return result;
304     }
305 
SetHostname(napi_env env,napi_callback_info info)306     static napi_value SetHostname(napi_env env, napi_callback_info info)
307     {
308         napi_value thisVar = nullptr;
309         napi_value argv[1] = {0};
310         size_t argc = 1;
311         std::string input = "";
312         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
313         size_t typelen = 0;
314         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
315             HILOG_ERROR("URL:: can not get argv[0] size");
316             return nullptr;
317         }
318         input.reserve(typelen + 1);
319         input.resize(typelen);
320         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
321             HILOG_ERROR("URL:: can not get argv[0] value");
322             return nullptr;
323         }
324         URL *murl = nullptr;
325         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
326         murl->SetHostname(input);
327         napi_value result = nullptr;
328         NAPI_CALL(env, napi_get_undefined(env, &result));
329         return result;
330     }
331 
SetUrlPort(napi_env env,napi_callback_info info)332     static napi_value SetUrlPort(napi_env env, napi_callback_info info)
333     {
334         napi_value thisVar = nullptr;
335         napi_value argv[1] = {0};
336         size_t argc = 1;
337         std::string input = "";
338         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
339         size_t typelen = 0;
340         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
341             HILOG_ERROR("URL:: can not get argv[0] size");
342             return nullptr;
343         }
344         input.reserve(typelen + 1);
345         input.resize(typelen);
346         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
347             HILOG_ERROR("URL:: can not get argv[0] value");
348             return nullptr;
349         }
350         URL *murl = nullptr;
351         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
352         murl->SetPort(input);
353         napi_value result = nullptr;
354         NAPI_CALL(env, napi_get_undefined(env, &result));
355         return result;
356     }
357 
SetUrlHost(napi_env env,napi_callback_info info)358     static napi_value SetUrlHost(napi_env env, napi_callback_info info)
359     {
360         napi_value thisVar = nullptr;
361         napi_value argv[1] = {0};
362         size_t argc = 1;
363         std::string input = "";
364         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
365         size_t typelen = 0;
366         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
367             HILOG_ERROR("URL:: can not get argv[0] size");
368             return nullptr;
369         }
370         input.reserve(typelen + 1);
371         input.resize(typelen);
372         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
373             HILOG_ERROR("URL:: can not get argv[0] value");
374             return nullptr;
375         }
376         URL *murl = nullptr;
377         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
378         murl->SetHost(input);
379         napi_value result = nullptr;
380         NAPI_CALL(env, napi_get_undefined(env, &result));
381         return result;
382     }
383 
SetSearch(napi_env env,napi_callback_info info)384     static napi_value SetSearch(napi_env env, napi_callback_info info)
385     {
386         napi_value thisVar = nullptr;
387         napi_value argv[1] = {0};
388         size_t argc = 1;
389         std::string input = "";
390         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
391         size_t typelen = 0;
392         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
393             HILOG_ERROR("URL:: can not get argv[0] size");
394             return nullptr;
395         }
396         input.reserve(typelen + 1);
397         input.resize(typelen);
398         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
399             HILOG_ERROR("URL:: can not get argv[0] value");
400             return nullptr;
401         }
402         URL *murl = nullptr;
403         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
404         murl->SetSearch(input);
405         napi_value result = nullptr;
406         NAPI_CALL(env, napi_get_undefined(env, &result));
407         return result;
408     }
409 
SetEncodeSearch(napi_env env,napi_callback_info info)410     static napi_value SetEncodeSearch(napi_env env, napi_callback_info info)
411     {
412         napi_value thisVar = nullptr;
413         napi_value argv[1] = {0};
414         size_t argc = 1;
415         std::string input = "";
416         if (napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr) != napi_ok) {
417             HILOG_ERROR("URL:: can not get thisVar");
418             return nullptr;
419         }
420         size_t typelen = 0;
421         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
422             HILOG_ERROR("URL:: can not get argv[0] size");
423             return nullptr;
424         }
425         input.reserve(typelen + 1);
426         input.resize(typelen);
427         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
428             HILOG_ERROR("URL:: can not get argv[0] value");
429             return nullptr;
430         }
431         URL *murl = nullptr;
432         if (napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)) != napi_ok) {
433             HILOG_ERROR("URL:: can not get url");
434             return nullptr;
435         }
436         murl->SetEncodeSearch(input);
437         napi_value result = nullptr;
438         if (napi_get_undefined(env, &result) != napi_ok) {
439             HILOG_ERROR("URL:: can not get result");
440             return nullptr;
441         }
442         return result;
443     }
444 
SetUrlScheme(napi_env env,napi_callback_info info)445     static napi_value SetUrlScheme(napi_env env, napi_callback_info info)
446     {
447         napi_value thisVar = nullptr;
448         napi_value argv[1] = {0};
449         size_t argc = 1;
450         std::string input = "";
451         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
452         size_t typelen = 0;
453         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
454             HILOG_ERROR("URL:: can not get argv[0] size");
455             return nullptr;
456         }
457         input.reserve(typelen + 1);
458         input.resize(typelen);
459         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
460             HILOG_ERROR("URL:: can not get argv[0] value");
461             return nullptr;
462         }
463         URL *murl = nullptr;
464         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
465         murl->SetScheme(input);
466         napi_value result = nullptr;
467         NAPI_CALL(env, napi_get_undefined(env, &result));
468         return result;
469     }
470 
SetUrlFragment(napi_env env,napi_callback_info info)471     static napi_value SetUrlFragment(napi_env env, napi_callback_info info)
472     {
473         napi_value thisVar = nullptr;
474         napi_value argv[1] = {0};
475         size_t argc = 1;
476         std::string input = "";
477         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
478         size_t typelen = 0;
479         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
480             HILOG_ERROR("URL:: can not get argv[0] size");
481             return nullptr;
482         }
483         input.reserve(typelen + 1);
484         input.resize(typelen);
485         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
486             HILOG_ERROR("URL:: can not get argv[0] value");
487             return nullptr;
488         }
489         URL *murl = nullptr;
490         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
491         murl->SetFragment(input);
492         napi_value result = nullptr;
493         NAPI_CALL(env, napi_get_undefined(env, &result));
494         return result;
495     }
496 
SetUsername(napi_env env,napi_callback_info info)497     static napi_value SetUsername(napi_env env, napi_callback_info info)
498     {
499         napi_value thisVar = nullptr;
500         napi_value argv[1] = {0};
501         size_t argc = 1;
502         std::string input = "";
503         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
504         size_t typelen = 0;
505         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
506             HILOG_ERROR("URL:: can not get argv[0] size");
507             return nullptr;
508         }
509         input.reserve(typelen + 1);
510         input.resize(typelen);
511         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
512             HILOG_ERROR("URL:: can not get argv[0] value");
513             return nullptr;
514         }
515         URL *murl = nullptr;
516         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
517         murl->SetUsername(input);
518         napi_value result = nullptr;
519         NAPI_CALL(env, napi_get_undefined(env, &result));
520         return result;
521     }
522 
SetUrlPath(napi_env env,napi_callback_info info)523     static napi_value SetUrlPath(napi_env env, napi_callback_info info)
524     {
525         napi_value thisVar = nullptr;
526         napi_value argv[1] = {0};
527         size_t argc = 1;
528         std::string input = "";
529         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
530         size_t typelen = 0;
531         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
532             HILOG_ERROR("URL:: can not get argv[0] size");
533             return nullptr;
534         }
535         input.reserve(typelen + 1);
536         input.resize(typelen);
537         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
538             HILOG_ERROR("URL:: can not get argv[0] value");
539             return nullptr;
540         }
541         URL *murl = nullptr;
542         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
543         murl->SetPath(input);
544         napi_value result = nullptr;
545         NAPI_CALL(env, napi_get_undefined(env, &result));
546         return result;
547     }
548 
SetPassword(napi_env env,napi_callback_info info)549     static napi_value SetPassword(napi_env env, napi_callback_info info)
550     {
551         napi_value thisVar = nullptr;
552         napi_value argv[1] = {0};
553         size_t argc = 1;
554         std::string input = "";
555         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
556         size_t typelen = 0;
557         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
558             HILOG_ERROR("URL:: can not get argv[0] size");
559             return nullptr;
560         }
561         input.reserve(typelen + 1);
562         input.resize(typelen);
563         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
564             HILOG_ERROR("URL:: can not get argv[0] value");
565             return nullptr;
566         }
567         URL *murl = nullptr;
568         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
569         murl->SetPassword(input);
570         napi_value result = nullptr;
571         NAPI_CALL(env, napi_get_undefined(env, &result));
572         return result;
573     }
574 
SeachParamsConstructor(napi_env env,napi_callback_info info)575     static napi_value SeachParamsConstructor(napi_env env, napi_callback_info info)
576     {
577         napi_value thisVar = nullptr;
578         void *data = nullptr;
579         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, &data));
580         auto object = new (std::nothrow) URLSearchParams();
581         if (object == nullptr) {
582             HILOG_ERROR("SeachParamsConstructor:: memory allocation failed, object is nullptr");
583             return nullptr;
584         }
585         napi_status status = napi_wrap(env, thisVar, object,
586             [](napi_env environment, void *data, void *hint) {
587                 auto obj = reinterpret_cast<URLSearchParams*>(data);
588                 if (obj != nullptr) {
589                     delete obj;
590                     obj = nullptr;
591                 }
592             }, nullptr, nullptr);
593         if (status != napi_ok && object != nullptr) {
594             HILOG_ERROR("SeachParamsConstructor:: napi_wrap failed");
595             delete object;
596             object = nullptr;
597         }
598         return thisVar;
599     }
600 
SetArray(napi_env env,napi_callback_info info)601     static napi_value SetArray(napi_env env, napi_callback_info info)
602     {
603         napi_value thisVar = nullptr;
604         napi_value argv[1] = {0};
605         size_t argc = 1;
606         uint32_t length = 0;
607         napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
608         napi_get_array_length(env, argv[0], &length);
609         std::vector<std::string> vec;
610         size_t arraySize = 0;
611         napi_value napiStr = nullptr;
612         for (size_t i = 0; i < length; i++) {
613             napi_get_element(env, argv[0], i, &napiStr);
614             if (napi_get_value_string_utf8(env, napiStr, nullptr, 0, &arraySize) != napi_ok) {
615                 HILOG_ERROR("URLSearchParams:: can not get napiStr size");
616                 return nullptr;
617             }
618             if (arraySize > 0) {
619                 std::string cstr = "";
620                 cstr.reserve(arraySize + 1);
621                 cstr.resize(arraySize);
622                 if (napi_get_value_string_utf8(env, napiStr, cstr.data(), arraySize + 1, &arraySize) != napi_ok) {
623                     HILOG_ERROR("URLSearchParams:: can not get name value");
624                     return nullptr;
625                 }
626                 vec.push_back(cstr);
627             } else {
628                 vec.push_back("");
629             }
630         }
631         URLSearchParams *murl = nullptr;
632         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
633         murl->SetArray(env, vec);
634         napi_value result = nullptr;
635         NAPI_CALL(env, napi_get_undefined(env, &result));
636         return result;
637     }
638 
GetArray(napi_env env,napi_callback_info info)639     static napi_value GetArray(napi_env env, napi_callback_info info)
640     {
641         napi_value thisVar = nullptr;
642         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
643         URLSearchParams *murl = nullptr;
644         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&murl)));
645         napi_value retVal = murl->GetArray(env);
646         return retVal;
647     }
648 
Get(napi_env env,napi_callback_info info)649     static napi_value Get(napi_env env, napi_callback_info info)
650     {
651         napi_value thisVar = nullptr;
652         size_t argc = 1;
653         napi_value args = nullptr;
654         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
655         if (argc != 1) {
656             HILOG_INFO("URLSearchParams:: One arg needs to be specified");
657             return nullptr;
658         }
659         URLSearchParams *object = nullptr;
660         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
661         if (object == nullptr) {
662             return nullptr;
663         }
664         napi_value result = object->Get(env, args);
665         return result;
666     }
667 
GetAll(napi_env env,napi_callback_info info)668     static napi_value GetAll(napi_env env, napi_callback_info info)
669     {
670         napi_value thisVar = nullptr;
671         size_t argc = 1;
672         napi_value args = nullptr;
673         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
674         if (argc != 1) {
675             HILOG_INFO("URLSearchParams:: One arg needs to be specified");
676             return nullptr;
677         }
678         URLSearchParams *object = nullptr;
679         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
680         if (object == nullptr) {
681             return nullptr;
682         }
683         napi_value result = object->GetAll(env, args);
684         return result;
685     }
686 
Append(napi_env env,napi_callback_info info)687     static napi_value Append(napi_env env, napi_callback_info info)
688     {
689         napi_value thisVar = nullptr;
690         size_t argc = 2; // 2:The number of parameters is 2
691         napi_value args[2] = { 0 }; // 2:The number of parameters is 2
692         void *data = nullptr;
693         napi_get_cb_info(env, info, &argc, args, &thisVar, &data);
694         if (argc != 2) { // 2:If the input parameter is not set to 2,
695             HILOG_INFO("URLSearchParams:: Two args needs to be specified");
696             return nullptr;
697         }
698         URLSearchParams *object = nullptr;
699         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
700         if (object == nullptr) {
701             return nullptr;
702         }
703         object->Append(env, args[0], args[1]);
704         return nullptr;
705     }
706 
Delete(napi_env env,napi_callback_info info)707     static napi_value Delete(napi_env env, napi_callback_info info)
708     {
709         napi_value thisVar = nullptr;
710         size_t argc = 1;
711         napi_value args = nullptr;
712         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
713         if (argc != 1) {
714             HILOG_INFO("URLSearchParams:: One arg needs to be specified");
715             return nullptr;
716         }
717         URLSearchParams *object = nullptr;
718         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
719         if (object == nullptr) {
720             return nullptr;
721         }
722         object->Delete(env, args);
723         return nullptr;
724     }
725 
Entries(napi_env env,napi_callback_info info)726     static napi_value Entries(napi_env env, napi_callback_info info)
727     {
728         napi_value thisVar = nullptr;
729         size_t argc = 0;
730         napi_value args = nullptr;
731         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
732         URLSearchParams *object = nullptr;
733         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
734         if (object == nullptr) {
735             return nullptr;
736         }
737         napi_value result = object->Entries(env);
738         return result;
739     }
740 
IsHas(napi_env env,napi_callback_info info)741     static napi_value IsHas(napi_env env, napi_callback_info info)
742     {
743         napi_value thisVar = nullptr;
744         size_t argc = 1;
745         napi_value args = nullptr;
746         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr));
747         URLSearchParams *object = nullptr;
748         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
749         napi_value result = object->IsHas(env, args);
750         return result;
751     }
752 
Set(napi_env env,napi_callback_info info)753     static napi_value Set(napi_env env, napi_callback_info info)
754     {
755         napi_value thisVar = nullptr;
756         size_t argc = 2; // 2:The number of parameters is 2
757         napi_value args[2] = { 0 }; // 2:The number of parameters is 2
758         napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
759         URLSearchParams *object = nullptr;
760         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
761         if (object == nullptr) {
762             return nullptr;
763         }
764         object->Set(env, args[0], args[1]);
765         return nullptr;
766     }
767 
Sort(napi_env env,napi_callback_info info)768     static napi_value Sort(napi_env env, napi_callback_info info)
769     {
770         napi_value thisVar = nullptr;
771         size_t argc = 0;
772         napi_value args = nullptr;
773         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
774         URLSearchParams *object = nullptr;
775         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
776         if (object == nullptr) {
777             return nullptr;
778         }
779         object->Sort();
780         return nullptr;
781     }
782 
IterByKeys(napi_env env,napi_callback_info info)783     static napi_value IterByKeys(napi_env env, napi_callback_info info)
784     {
785         napi_value thisVar = nullptr;
786         size_t argc = 0;
787         napi_value args = nullptr;
788         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
789         URLSearchParams *object = nullptr;
790         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
791         if (object == nullptr) {
792             return nullptr;
793         }
794         napi_value result = object->IterByKeys(env);
795         return result;
796     }
797 
IterByValues(napi_env env,napi_callback_info info)798     static napi_value IterByValues(napi_env env, napi_callback_info info)
799     {
800         napi_value thisVar = nullptr;
801         size_t argc = 0;
802         napi_value args = nullptr;
803         napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr);
804         URLSearchParams *object = nullptr;
805         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
806         if (object == nullptr) {
807             return nullptr;
808         }
809         napi_value result = object->IterByValues(env);
810         return result;
811     }
812 
StringParmas(napi_env env,napi_callback_info info)813     static napi_value StringParmas(napi_env env, napi_callback_info info)
814     {
815         napi_value thisVar = nullptr;
816         napi_value argv[1] = {0};
817         size_t argc = 1;
818         std::string input = "";
819         napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
820         size_t typelen = 0;
821         if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) {
822             HILOG_ERROR("URLSearchParams:: can not get argv[0] size");
823             return nullptr;
824         }
825         input.reserve(typelen + 1);
826         input.resize(typelen);
827         if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) {
828             HILOG_ERROR("URLSearchParams:: can not get argv[0] value");
829             return nullptr;
830         }
831         std::vector<KeyValue> params{};
832         StringAnalyzing(input, params);
833         napi_value arr = nullptr;
834         napi_create_array(env, &arr);
835         size_t j = 0;
836         for (size_t i = 0; i < params.size(); i++) {
837             napi_value result = nullptr;
838             napi_value result1 = nullptr;
839             napi_create_string_utf8(env, params[i].first.c_str(), params[i].first.size(), &result);
840             napi_set_element(env, arr, j, result);
841             napi_create_string_utf8(env, params[i].second.c_str(), params[i].second.size(), &result1);
842             napi_set_element(env, arr, j + 1, result1);
843             // 2 step, j, j + 1
844             j += 2;
845         }
846         return arr;
847     }
848 
FixUSVstring(napi_env env,napi_callback_info info)849     static napi_value FixUSVstring(napi_env env, napi_callback_info info)
850     {
851         napi_value thisVar = nullptr;
852         napi_value argv[1] = {0};
853         size_t argc = 1;
854         char16_t* inputStr = nullptr;
855         napi_value resultStr = nullptr;
856         size_t inputSize = 0;
857         napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
858         if (napi_get_value_string_utf16(env, argv[0], nullptr, 0, &inputSize) != napi_ok) {
859             HILOG_ERROR("url:: get args failed.");
860             return nullptr;
861         }
862         if (inputSize > 0) {
863             inputStr = new (std::nothrow) char16_t[inputSize + 1]();
864             if (inputStr == nullptr) {
865                 HILOG_ERROR("url:: memory allocation failed, inputStr is nullptr");
866                 return resultStr;
867             }
868             napi_get_value_string_utf16(env, argv[0], inputStr, inputSize + 1, &inputSize);
869         }
870         for (size_t i = 0; i < inputSize; i++) {
871             char16_t c = *(inputStr + i);
872             // 0xD800: minimum value of low proxy term. 0xF800: key bit mode for dividing high proxy and low proxy.
873             if (!((c & 0xF800) == 0xD800)) {
874                 continue;
875             } else if ((c & 0x400) != 0 || i == inputSize - 1) { // 0x400: Determine is component of low proxy.
876                 *(inputStr + i) = 0xFFFD; // 0xFFFD: Invalid character.
877             } else {
878                 char16_t d = *(inputStr + i + 1);
879                 // 0xDC00: minimum value of high proxy item. 0xFC00: Check if it meets the requirements of high proxy.
880                 if ((d & 0xFC00) == 0xDC00) {
881                     i++;
882                 } else {
883                     *(inputStr + i) = 0xFFFD; // 0xFFFD: Invalid character.
884                 }
885             }
886         }
887         napi_create_string_utf16(env, inputStr, inputSize, &resultStr);
888         if (inputStr != nullptr) {
889             delete[] inputStr;
890             inputStr = nullptr;
891         }
892         return resultStr;
893     }
894 
SeachParamsInit(napi_env env,napi_value exports)895     static napi_value SeachParamsInit(napi_env env, napi_value exports)
896     {
897         const char *seachParamsClassName = "URLSearchParams";
898         napi_value seachParamsInitClass = nullptr;
899         napi_property_descriptor UrlDesc[] = {
900             DECLARE_NAPI_FUNCTION("has", IsHas),
901             DECLARE_NAPI_FUNCTION("set", Set),
902             DECLARE_NAPI_FUNCTION("sort", Sort),
903             DECLARE_NAPI_FUNCTION("keys", IterByKeys),
904             DECLARE_NAPI_FUNCTION("values", IterByValues),
905             DECLARE_NAPI_FUNCTION("get", Get),
906             DECLARE_NAPI_FUNCTION("getAll", GetAll),
907             DECLARE_NAPI_FUNCTION("append", Append),
908             DECLARE_NAPI_FUNCTION("delete", Delete),
909             DECLARE_NAPI_FUNCTION("entries", Entries),
910             DECLARE_NAPI_GETTER_SETTER("array", GetArray, SetArray),
911         };
912         NAPI_CALL(env, napi_define_class(env, seachParamsClassName, strlen(seachParamsClassName),
913             SeachParamsConstructor, nullptr, sizeof(UrlDesc) / sizeof(UrlDesc[0]),
914             UrlDesc, &seachParamsInitClass));
915         napi_property_descriptor desc[] = {
916             DECLARE_NAPI_PROPERTY("URLSearchParams1", seachParamsInitClass)
917         };
918         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
919         return exports;
920     };
921 
ParamsInit(napi_env env,napi_value exports)922     static napi_value ParamsInit(napi_env env, napi_value exports)
923     {
924         const char *paramsClassName = "URLSearchParams";
925         napi_value ParamsInitClass = nullptr;
926         napi_property_descriptor UrlDesc[] = {
927             DECLARE_NAPI_FUNCTION("has", IsHas),
928             DECLARE_NAPI_FUNCTION("set", Set),
929             DECLARE_NAPI_FUNCTION("sort", Sort),
930             DECLARE_NAPI_FUNCTION("keys", IterByKeys),
931             DECLARE_NAPI_FUNCTION("values", IterByValues),
932             DECLARE_NAPI_FUNCTION("get", Get),
933             DECLARE_NAPI_FUNCTION("getAll", GetAll),
934             DECLARE_NAPI_FUNCTION("append", Append),
935             DECLARE_NAPI_FUNCTION("delete", Delete),
936             DECLARE_NAPI_FUNCTION("entries", Entries),
937             DECLARE_NAPI_GETTER_SETTER("array", GetArray, SetArray),
938         };
939         NAPI_CALL(env, napi_define_class(env, paramsClassName, strlen(paramsClassName),
940             SeachParamsConstructor, nullptr, sizeof(UrlDesc) / sizeof(UrlDesc[0]),
941             UrlDesc, &ParamsInitClass));
942         napi_property_descriptor desc[] = {
943             DECLARE_NAPI_PROPERTY("URLParams1", ParamsInitClass)
944         };
945         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
946         return exports;
947     };
948 
UrlInit(napi_env env,napi_value exports)949     static napi_value UrlInit(napi_env env, napi_value exports)
950     {
951         const char *urlClassName = "Url";
952         napi_value urlClass = nullptr;
953         napi_property_descriptor UrlDesc[] = {
954             DECLARE_NAPI_GETTER_SETTER("hostname", GetHostname, SetHostname),
955             DECLARE_NAPI_FUNCTION("href", SetHref),
956             DECLARE_NAPI_GETTER_SETTER("search", GetSearch, SetSearch),
957             DECLARE_NAPI_GETTER_SETTER("username", GetUsername, SetUsername),
958             DECLARE_NAPI_GETTER_SETTER("password", GetPassword, SetPassword),
959             DECLARE_NAPI_GETTER_SETTER("host", GetUrlHost, SetUrlHost),
960             DECLARE_NAPI_GETTER_SETTER("hash", GetUrlFragment, SetUrlFragment),
961             DECLARE_NAPI_GETTER_SETTER("protocol", GetUrlScheme, SetUrlScheme),
962             DECLARE_NAPI_GETTER_SETTER("pathname", GetUrlPath, SetUrlPath),
963             DECLARE_NAPI_GETTER_SETTER("port", GetUrlPort, SetUrlPort),
964             DECLARE_NAPI_GETTER("encodeHost", GetEncodeUrlHost),
965             DECLARE_NAPI_GETTER_SETTER("encodeSearch", GetEncodeSearch, SetEncodeSearch),
966             DECLARE_NAPI_GETTER("onOrOff", GetOnOrOff),
967             DECLARE_NAPI_GETTER("GetIsIpv6", GetIsIpv6),
968         };
969         NAPI_CALL(env, napi_define_class(env, urlClassName, strlen(urlClassName), UrlConstructor,
970                                          nullptr, sizeof(UrlDesc) / sizeof(UrlDesc[0]), UrlDesc, &urlClass));
971         napi_property_descriptor desc[] = {
972             DECLARE_NAPI_PROPERTY("Url", urlClass)
973         };
974         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
975         return exports;
976     }
977 
Init(napi_env env,napi_value exports)978     napi_value Init(napi_env env, napi_value exports)
979     {
980         napi_property_descriptor desc[] = {
981             DECLARE_NAPI_FUNCTION("stringParmas", StringParmas),
982             DECLARE_NAPI_FUNCTION("fixUSVstring", FixUSVstring),
983         };
984         NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
985         SeachParamsInit(env, exports);
986         ParamsInit(env, exports);
987         UrlInit(env, exports);
988         return exports;
989     }
990 
991     extern "C"
NAPI_url_GetJSCode(const char ** buf,int * bufLen)992     __attribute__((visibility("default"))) void NAPI_url_GetJSCode(const char **buf, int *bufLen)
993     {
994         if (buf != nullptr) {
995             *buf = _binary_js_url_js_start;
996         }
997         if (bufLen != nullptr) {
998             *bufLen = _binary_js_url_js_end - _binary_js_url_js_start;
999         }
1000     }
1001     extern "C"
NAPI_url_GetABCCode(const char ** buf,int * buflen)1002     __attribute__((visibility("default"))) void NAPI_url_GetABCCode(const char** buf, int* buflen)
1003     {
1004         if (buf != nullptr) {
1005             *buf = _binary_url_abc_start;
1006         }
1007         if (buflen != nullptr) {
1008             *buflen = _binary_url_abc_end - _binary_url_abc_start;
1009         }
1010     }
1011 
1012     static napi_module_with_js UrlModule = {
1013         .nm_version = 1,
1014         .nm_flags = 0,
1015         .nm_filename = nullptr,
1016         .nm_register_func = Init,
1017         .nm_modname = "url",
1018         .nm_priv = reinterpret_cast<void*>(0),
1019         .nm_get_abc_code = NAPI_url_GetABCCode,
1020         .nm_get_js_code = NAPI_url_GetJSCode,
1021     };
UrlRegisterModule()1022     extern "C" __attribute__((constructor)) void UrlRegisterModule()
1023     {
1024         napi_module_with_js_register(&UrlModule);
1025     }
1026 } // namespace
1027