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