14d6c458bSopenharmony_ci/* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_ci#include "js_url.h" 174d6c458bSopenharmony_ci#include <regex> 184d6c458bSopenharmony_ci#include <sstream> 194d6c458bSopenharmony_ci#include "securec.h" 204d6c458bSopenharmony_ci#include "unicode/stringpiece.h" 214d6c458bSopenharmony_ci#include "unicode/unistr.h" 224d6c458bSopenharmony_ci#include "tools/log.h" 234d6c458bSopenharmony_cinamespace OHOS::Url { 244d6c458bSopenharmony_ci std::map<std::string, int> g_head = { 254d6c458bSopenharmony_ci {"ftp:", 21}, {"file:", -1}, {"gopher:", 70}, {"http:", 80}, 264d6c458bSopenharmony_ci {"https:", 443}, {"ws:", 80}, {"wss:", 443} 274d6c458bSopenharmony_ci }; 284d6c458bSopenharmony_ci 294d6c458bSopenharmony_ci std::vector<std::string> g_doubleSegment = { 304d6c458bSopenharmony_ci "..", ".%2e", ".%2E", "%2e.", "%2E.", 314d6c458bSopenharmony_ci "%2e%2e", "%2E%2E", "%2e%2E", "%2E%2e" 324d6c458bSopenharmony_ci }; 334d6c458bSopenharmony_ci 344d6c458bSopenharmony_ci std::vector<std::string> g_singlesegment = { ".", "%2e", "%2E" }; 354d6c458bSopenharmony_ci std::vector<std::string> g_specialSymbols = { 364d6c458bSopenharmony_ci "@", "%40", "#", "%23", "=", "%3D", ":", "%3A", 374d6c458bSopenharmony_ci "/", "%2F", ";", "%3B", "?", "%3F" 384d6c458bSopenharmony_ci }; 394d6c458bSopenharmony_ci std::vector<char> g_specialcharacter = { 404d6c458bSopenharmony_ci '\0', '\t', '\n', '\r', ' ', '#', '%', '/', ':', '?', 414d6c458bSopenharmony_ci '@', '[', '\\', ']' 424d6c458bSopenharmony_ci }; 434d6c458bSopenharmony_ci 444d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::MAX_BIT_SIZE)> g_specialCharForBit; 454d6c458bSopenharmony_ci 464d6c458bSopenharmony_ci void PreliminaryWork() 474d6c458bSopenharmony_ci { 484d6c458bSopenharmony_ci std::vector<char> g_specialSymbolsTmp = {'#', '%', '/', ':', '?', '@', '[', '\\', ']', '<', '>', '^', '|'}; 494d6c458bSopenharmony_ci size_t invalidCharLength = static_cast<size_t>(BitsetStatusFlag::BIT_ASCII_32); 504d6c458bSopenharmony_ci for (size_t i = 0; i <= invalidCharLength; ++i) { 514d6c458bSopenharmony_ci g_specialCharForBit.set(i); 524d6c458bSopenharmony_ci } 534d6c458bSopenharmony_ci size_t len = g_specialSymbolsTmp.size(); 544d6c458bSopenharmony_ci for (size_t i = 0; i < len; ++i) { 554d6c458bSopenharmony_ci g_specialCharForBit.set(g_specialSymbolsTmp[i]); 564d6c458bSopenharmony_ci } 574d6c458bSopenharmony_ci g_specialCharForBit.set(static_cast<size_t>(BitsetStatusFlag::BIT_ASCII_127)); 584d6c458bSopenharmony_ci } 594d6c458bSopenharmony_ci 604d6c458bSopenharmony_ci bool CheckCharacter(std::string data, std::bitset<static_cast<size_t>(BitsetStatusFlag::MAX_BIT_SIZE)> rule) 614d6c458bSopenharmony_ci { 624d6c458bSopenharmony_ci size_t dataLen = data.size(); 634d6c458bSopenharmony_ci for (size_t i = 0; i < dataLen; ++i) { 644d6c458bSopenharmony_ci if (static_cast<int>(data[i]) >= 0 && 654d6c458bSopenharmony_ci static_cast<int>(data[i]) < static_cast<int>(BitsetStatusFlag::MAX_BIT_SIZE)) { 664d6c458bSopenharmony_ci bool IsIllegal = rule.test(data[i]); 674d6c458bSopenharmony_ci if (IsIllegal) { 684d6c458bSopenharmony_ci return false; 694d6c458bSopenharmony_ci } 704d6c458bSopenharmony_ci } 714d6c458bSopenharmony_ci } 724d6c458bSopenharmony_ci return true; 734d6c458bSopenharmony_ci } 744d6c458bSopenharmony_ci 754d6c458bSopenharmony_ci void ReplaceSpecialSymbols(std::string& input, std::string& oldstr, std::string& newstr) 764d6c458bSopenharmony_ci { 774d6c458bSopenharmony_ci size_t oldlen = oldstr.size(); 784d6c458bSopenharmony_ci while (true) { 794d6c458bSopenharmony_ci size_t pos = 0; 804d6c458bSopenharmony_ci if ((pos = input.find(oldstr)) != std::string::npos) { 814d6c458bSopenharmony_ci input.replace(pos, oldlen, newstr); 824d6c458bSopenharmony_ci continue; 834d6c458bSopenharmony_ci } 844d6c458bSopenharmony_ci break; 854d6c458bSopenharmony_ci } 864d6c458bSopenharmony_ci } 874d6c458bSopenharmony_ci 884d6c458bSopenharmony_ci template<typename T> 894d6c458bSopenharmony_ci bool IsASCIITabOrNewline(const T ch) 904d6c458bSopenharmony_ci { 914d6c458bSopenharmony_ci return (ch == '\t' || ch == '\n' || ch == '\r'); 924d6c458bSopenharmony_ci } 934d6c458bSopenharmony_ci 944d6c458bSopenharmony_ci bool IsHexDigit(const char& ch) 954d6c458bSopenharmony_ci { 964d6c458bSopenharmony_ci if (isdigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) { 974d6c458bSopenharmony_ci return true; 984d6c458bSopenharmony_ci } 994d6c458bSopenharmony_ci return false; 1004d6c458bSopenharmony_ci } 1014d6c458bSopenharmony_ci 1024d6c458bSopenharmony_ci std::string DecodeSpecialChars(std::string input) 1034d6c458bSopenharmony_ci { 1044d6c458bSopenharmony_ci std::string temp = input; 1054d6c458bSopenharmony_ci size_t len = temp.size(); 1064d6c458bSopenharmony_ci if (input.empty()) { 1074d6c458bSopenharmony_ci return temp; 1084d6c458bSopenharmony_ci } 1094d6c458bSopenharmony_ci size_t pos = temp.find("%"); 1104d6c458bSopenharmony_ci while (pos != std::string::npos && pos < len - 2) { // 2:end subscript backspace 1114d6c458bSopenharmony_ci if (IsHexDigit(temp[pos + 1]) && IsHexDigit(temp[pos + 2])) { // 2:Determine the second character after % 1124d6c458bSopenharmony_ci std::string subStr = temp.substr(pos + 1, 2); // 2:Truncate the last two digits of the % 1134d6c458bSopenharmony_ci int octNum = 0; 1144d6c458bSopenharmony_ci if (sscanf_s(subStr.c_str(), "%x", &octNum) == -1) { 1154d6c458bSopenharmony_ci HILOG_ERROR("sscanf_s is falie"); 1164d6c458bSopenharmony_ci return temp; 1174d6c458bSopenharmony_ci } 1184d6c458bSopenharmony_ci std::string convertedChar(1, static_cast<char>(octNum)); 1194d6c458bSopenharmony_ci temp.replace(pos, 3, convertedChar); // 3:Replace the percent character with the corresponding char 1204d6c458bSopenharmony_ci len = len - 2; // 2:After the replacement, the length of the string is reduced by two 1214d6c458bSopenharmony_ci } 1224d6c458bSopenharmony_ci pos = temp.find("%", pos + 1); 1234d6c458bSopenharmony_ci } 1244d6c458bSopenharmony_ci return temp; 1254d6c458bSopenharmony_ci } 1264d6c458bSopenharmony_ci 1274d6c458bSopenharmony_ci void DeleteC0OrSpace(std::string& str) 1284d6c458bSopenharmony_ci { 1294d6c458bSopenharmony_ci if (str.empty()) { 1304d6c458bSopenharmony_ci return; 1314d6c458bSopenharmony_ci } 1324d6c458bSopenharmony_ci size_t i = 0; 1334d6c458bSopenharmony_ci size_t strlen = str.size(); 1344d6c458bSopenharmony_ci while (i < strlen) { 1354d6c458bSopenharmony_ci if (str[i] >= '\0' && str[i] <= ' ') { 1364d6c458bSopenharmony_ci i++; 1374d6c458bSopenharmony_ci continue; 1384d6c458bSopenharmony_ci } 1394d6c458bSopenharmony_ci break; 1404d6c458bSopenharmony_ci } 1414d6c458bSopenharmony_ci str = str.substr(i); 1424d6c458bSopenharmony_ci strlen = str.size(); 1434d6c458bSopenharmony_ci if (strlen == 0) { 1444d6c458bSopenharmony_ci return; 1454d6c458bSopenharmony_ci } 1464d6c458bSopenharmony_ci for (i = strlen - 1; i != 0; i--) { 1474d6c458bSopenharmony_ci if (str[i] >= '\0' && str[i] <= ' ') { 1484d6c458bSopenharmony_ci str.pop_back(); 1494d6c458bSopenharmony_ci continue; 1504d6c458bSopenharmony_ci } 1514d6c458bSopenharmony_ci break; 1524d6c458bSopenharmony_ci } 1534d6c458bSopenharmony_ci } 1544d6c458bSopenharmony_ci 1554d6c458bSopenharmony_ci void DeleteTabOrNewline(std::string& str1) 1564d6c458bSopenharmony_ci { 1574d6c458bSopenharmony_ci for (auto item = str1.begin(); item != str1.end();) { 1584d6c458bSopenharmony_ci if (IsASCIITabOrNewline(*item)) { 1594d6c458bSopenharmony_ci item = str1.erase(item); 1604d6c458bSopenharmony_ci } else { 1614d6c458bSopenharmony_ci ++item; 1624d6c458bSopenharmony_ci } 1634d6c458bSopenharmony_ci } 1644d6c458bSopenharmony_ci } 1654d6c458bSopenharmony_ci 1664d6c458bSopenharmony_ci bool IsSpecial(std::string scheme) 1674d6c458bSopenharmony_ci { 1684d6c458bSopenharmony_ci auto temp = g_head.count(scheme); 1694d6c458bSopenharmony_ci if (temp > 0) { 1704d6c458bSopenharmony_ci return true; 1714d6c458bSopenharmony_ci } 1724d6c458bSopenharmony_ci return false; 1734d6c458bSopenharmony_ci } 1744d6c458bSopenharmony_ci 1754d6c458bSopenharmony_ci bool AnalysisScheme(std::string& input, std::string& scheme, 1764d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 1774d6c458bSopenharmony_ci { 1784d6c458bSopenharmony_ci if (!isalpha(input[0])) { 1794d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 1804d6c458bSopenharmony_ci return false; 1814d6c458bSopenharmony_ci } else { 1824d6c458bSopenharmony_ci size_t strlen = input.size(); 1834d6c458bSopenharmony_ci for (size_t i = 0; i < strlen - 1; ++i) { 1844d6c458bSopenharmony_ci if ((isalnum(input[i]) || input[i] == '+' || input[i] == '-' || input[i] == '.') && 1854d6c458bSopenharmony_ci isupper(input[i])) { 1864d6c458bSopenharmony_ci input[i] = static_cast<size_t>(tolower(input[i])); 1874d6c458bSopenharmony_ci } 1884d6c458bSopenharmony_ci if (!isalnum(input[i]) && input[i] != '+' && input[i] != '-' && input[i] != '.') { 1894d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 1904d6c458bSopenharmony_ci // 0:Bit 0 Set to true,The URL analysis failed 1914d6c458bSopenharmony_ci return false; 1924d6c458bSopenharmony_ci } 1934d6c458bSopenharmony_ci } 1944d6c458bSopenharmony_ci scheme = input; 1954d6c458bSopenharmony_ci if (IsSpecial(scheme)) { 1964d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT1)); 1974d6c458bSopenharmony_ci } 1984d6c458bSopenharmony_ci return true; 1994d6c458bSopenharmony_ci } 2004d6c458bSopenharmony_ci } 2014d6c458bSopenharmony_ci 2024d6c458bSopenharmony_ci void AnalysisFragment(const std::string& input, std::string& fragment, 2034d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 2044d6c458bSopenharmony_ci { 2054d6c458bSopenharmony_ci fragment = input; 2064d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT8)); 2074d6c458bSopenharmony_ci } 2084d6c458bSopenharmony_ci 2094d6c458bSopenharmony_ci void AnalysisQuery(const std::string& input, std::string& query, 2104d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 2114d6c458bSopenharmony_ci { 2124d6c458bSopenharmony_ci query = input; 2134d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT7)); 2144d6c458bSopenharmony_ci } 2154d6c458bSopenharmony_ci void AnalysisUsernameAndPasswd(std::string& input, std::string& username, std::string& password, 2164d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 2174d6c458bSopenharmony_ci { 2184d6c458bSopenharmony_ci int pos = static_cast<int>(input.size()) - 1; 2194d6c458bSopenharmony_ci for (; pos >= 0; pos--) { 2204d6c458bSopenharmony_ci if (input[pos] == '@') { 2214d6c458bSopenharmony_ci break; 2224d6c458bSopenharmony_ci } 2234d6c458bSopenharmony_ci } 2244d6c458bSopenharmony_ci std::string userAndPasswd = input.substr(0, pos); 2254d6c458bSopenharmony_ci input = input.substr(pos + 1); 2264d6c458bSopenharmony_ci if (userAndPasswd.empty()) { 2274d6c458bSopenharmony_ci return; 2284d6c458bSopenharmony_ci } 2294d6c458bSopenharmony_ci if (userAndPasswd.find('@') != std::string::npos) { 2304d6c458bSopenharmony_ci while (true) { 2314d6c458bSopenharmony_ci size_t posTmp = 0; 2324d6c458bSopenharmony_ci if ((posTmp = userAndPasswd.find('@')) != std::string::npos) { 2334d6c458bSopenharmony_ci userAndPasswd = userAndPasswd.replace(posTmp, 1, "%40"); 2344d6c458bSopenharmony_ci } else { 2354d6c458bSopenharmony_ci break; 2364d6c458bSopenharmony_ci } 2374d6c458bSopenharmony_ci } 2384d6c458bSopenharmony_ci } 2394d6c458bSopenharmony_ci if (userAndPasswd.find(':') != std::string::npos) { 2404d6c458bSopenharmony_ci size_t position = userAndPasswd.find(':'); 2414d6c458bSopenharmony_ci std::string user = userAndPasswd.substr(0, position); 2424d6c458bSopenharmony_ci std::string keyWord = userAndPasswd.substr(position + 1); 2434d6c458bSopenharmony_ci if (!user.empty()) { 2444d6c458bSopenharmony_ci username = user; 2454d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT2)); 2464d6c458bSopenharmony_ci } 2474d6c458bSopenharmony_ci if (!keyWord.empty()) { 2484d6c458bSopenharmony_ci password = keyWord; 2494d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT3)); 2504d6c458bSopenharmony_ci } 2514d6c458bSopenharmony_ci } else { 2524d6c458bSopenharmony_ci username = userAndPasswd; 2534d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT2)); 2544d6c458bSopenharmony_ci } 2554d6c458bSopenharmony_ci } 2564d6c458bSopenharmony_ci 2574d6c458bSopenharmony_ci void AnalysisPath(std::string& input, std::vector<std::string>& path, 2584d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, bool isSpecial) 2594d6c458bSopenharmony_ci { 2604d6c458bSopenharmony_ci std::vector<std::string> temp; 2614d6c458bSopenharmony_ci size_t pos = 0; 2624d6c458bSopenharmony_ci while (((pos = input.find('/')) != std::string::npos) || 2634d6c458bSopenharmony_ci ((pos = input.find('\\')) != std::string::npos && isSpecial)) { 2644d6c458bSopenharmony_ci temp.push_back(input.substr(0, pos)); 2654d6c458bSopenharmony_ci input = input.substr(pos + 1); 2664d6c458bSopenharmony_ci } 2674d6c458bSopenharmony_ci temp.push_back(input); 2684d6c458bSopenharmony_ci size_t length = temp.size(); 2694d6c458bSopenharmony_ci for (size_t it = 0; it < length; ++it) { 2704d6c458bSopenharmony_ci auto result = find(g_doubleSegment.begin(), g_doubleSegment.end(), temp[it]); 2714d6c458bSopenharmony_ci if (result != g_doubleSegment.end()) { 2724d6c458bSopenharmony_ci if (path.empty() && it == length - 1) { 2734d6c458bSopenharmony_ci path.emplace_back(""); 2744d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 2754d6c458bSopenharmony_ci } 2764d6c458bSopenharmony_ci if (path.empty()) { 2774d6c458bSopenharmony_ci continue; 2784d6c458bSopenharmony_ci } 2794d6c458bSopenharmony_ci path.pop_back(); 2804d6c458bSopenharmony_ci if (it == length - 1) { 2814d6c458bSopenharmony_ci path.emplace_back(""); 2824d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 2834d6c458bSopenharmony_ci } 2844d6c458bSopenharmony_ci continue; 2854d6c458bSopenharmony_ci } 2864d6c458bSopenharmony_ci result = find(g_singlesegment.begin(), g_singlesegment.end(), temp[it]); 2874d6c458bSopenharmony_ci if (result != g_singlesegment.end() && it == length - 1) { 2884d6c458bSopenharmony_ci path.emplace_back(""); 2894d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 2904d6c458bSopenharmony_ci continue; 2914d6c458bSopenharmony_ci } 2924d6c458bSopenharmony_ci if (result == g_singlesegment.end()) { 2934d6c458bSopenharmony_ci path.push_back(temp[it]); 2944d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 2954d6c458bSopenharmony_ci } 2964d6c458bSopenharmony_ci } 2974d6c458bSopenharmony_ci } 2984d6c458bSopenharmony_ci 2994d6c458bSopenharmony_ci void AnalysisPort(std::string input, UrlData& urlinfo, 3004d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 3014d6c458bSopenharmony_ci { 3024d6c458bSopenharmony_ci if (input.size() == 0) { 3034d6c458bSopenharmony_ci return; 3044d6c458bSopenharmony_ci } 3054d6c458bSopenharmony_ci for (auto i : input) { 3064d6c458bSopenharmony_ci if (!isdigit(i)) { 3074d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 3084d6c458bSopenharmony_ci return; 3094d6c458bSopenharmony_ci } 3104d6c458bSopenharmony_ci } 3114d6c458bSopenharmony_ci if (input.size() >= 6) { //6:Maximum port number size 3124d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 3134d6c458bSopenharmony_ci return; 3144d6c458bSopenharmony_ci } 3154d6c458bSopenharmony_ci int it = stoi(input); 3164d6c458bSopenharmony_ci const int maxPort = 65535; // 65535:Maximum port number 3174d6c458bSopenharmony_ci if (it > maxPort) { 3184d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 3194d6c458bSopenharmony_ci return; 3204d6c458bSopenharmony_ci } 3214d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT5)); 3224d6c458bSopenharmony_ci for (auto i : g_head) { 3234d6c458bSopenharmony_ci if (i.first == urlinfo.scheme && i.second == it) { 3244d6c458bSopenharmony_ci urlinfo.port = -1; 3254d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT5), 0); 3264d6c458bSopenharmony_ci return; 3274d6c458bSopenharmony_ci } 3284d6c458bSopenharmony_ci } 3294d6c458bSopenharmony_ci urlinfo.port = it; 3304d6c458bSopenharmony_ci } 3314d6c458bSopenharmony_ci 3324d6c458bSopenharmony_ci void AnalysisOpaqueHost(std::string input, std::string& host, 3334d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 3344d6c458bSopenharmony_ci { 3354d6c458bSopenharmony_ci size_t strlen = input.size(); 3364d6c458bSopenharmony_ci for (size_t i = 0; i < strlen; ++i) { 3374d6c458bSopenharmony_ci char ch = input[i]; 3384d6c458bSopenharmony_ci auto result = find(g_specialcharacter.begin(), g_specialcharacter.end(), ch); 3394d6c458bSopenharmony_ci if (ch != '%' && (result != g_specialcharacter.end())) { 3404d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 3414d6c458bSopenharmony_ci return; 3424d6c458bSopenharmony_ci } 3434d6c458bSopenharmony_ci } 3444d6c458bSopenharmony_ci host = input; 3454d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 3464d6c458bSopenharmony_ci } 3474d6c458bSopenharmony_ci 3484d6c458bSopenharmony_ci std::string DealIpv4(std::string str) 3494d6c458bSopenharmony_ci { 3504d6c458bSopenharmony_ci std::vector<std::string> temp; 3514d6c458bSopenharmony_ci size_t pos = str.rfind(":"); 3524d6c458bSopenharmony_ci size_t index = pos; 3534d6c458bSopenharmony_ci size_t left = pos + 1; 3544d6c458bSopenharmony_ci char hexVal[3] = { 0 }; 3554d6c458bSopenharmony_ci std::string val = ""; 3564d6c458bSopenharmony_ci while ((pos = str.find(".", left)) != std::string::npos) { 3574d6c458bSopenharmony_ci val = str.substr(left, pos - left); 3584d6c458bSopenharmony_ci if (sprintf_s(hexVal, sizeof(hexVal), "%02x", stoi(val)) == -1) { 3594d6c458bSopenharmony_ci HILOG_ERROR("sprintf_s is falie"); 3604d6c458bSopenharmony_ci return val; 3614d6c458bSopenharmony_ci } 3624d6c458bSopenharmony_ci 3634d6c458bSopenharmony_ci temp.push_back(hexVal); 3644d6c458bSopenharmony_ci left = pos + 1; 3654d6c458bSopenharmony_ci } 3664d6c458bSopenharmony_ci val = str.substr(left); 3674d6c458bSopenharmony_ci if (sprintf_s(hexVal, sizeof(hexVal), "%02x", stoi(val)) == -1) { 3684d6c458bSopenharmony_ci HILOG_ERROR("sprintf_s is falie"); 3694d6c458bSopenharmony_ci return val; 3704d6c458bSopenharmony_ci } 3714d6c458bSopenharmony_ci temp.push_back(hexVal); 3724d6c458bSopenharmony_ci std::string res = str.substr(0, index); 3734d6c458bSopenharmony_ci res = res + ":" + temp[0] + temp[1] + ":" + temp[2] + temp[3]; // 2:subscript 3:subscript 3744d6c458bSopenharmony_ci return res; 3754d6c458bSopenharmony_ci } 3764d6c458bSopenharmony_ci 3774d6c458bSopenharmony_ci void FormatIpv6(std::string& str) 3784d6c458bSopenharmony_ci { 3794d6c458bSopenharmony_ci size_t pos = str.find("::"); 3804d6c458bSopenharmony_ci size_t index = pos; 3814d6c458bSopenharmony_ci if (pos != std::string::npos) { 3824d6c458bSopenharmony_ci size_t left = 0; 3834d6c458bSopenharmony_ci int count = 0; 3844d6c458bSopenharmony_ci while ((pos = str.find(":", left)) != std::string::npos) { 3854d6c458bSopenharmony_ci count++; 3864d6c458bSopenharmony_ci left = pos + 1; 3874d6c458bSopenharmony_ci } 3884d6c458bSopenharmony_ci int size = 7 - (count - 2); // 7:point number 2:Continuous colon number 3894d6c458bSopenharmony_ci std::string temp = ""; 3904d6c458bSopenharmony_ci for (int i = 0; i < size - 1; ++i) { 3914d6c458bSopenharmony_ci temp += ":0"; 3924d6c458bSopenharmony_ci } 3934d6c458bSopenharmony_ci temp += ":"; 3944d6c458bSopenharmony_ci str.replace(index, 2, temp); // 2:jump"::" 3954d6c458bSopenharmony_ci if (index == 0) { 3964d6c458bSopenharmony_ci str = "0" + str; 3974d6c458bSopenharmony_ci } 3984d6c458bSopenharmony_ci } 3994d6c458bSopenharmony_ci } 4004d6c458bSopenharmony_ci 4014d6c458bSopenharmony_ci void RemoveLeadingZeros(std::vector<std::string> &ipv6) 4024d6c458bSopenharmony_ci { 4034d6c458bSopenharmony_ci size_t len = ipv6.size(); 4044d6c458bSopenharmony_ci for (size_t i = 0; i < len; ++i) { 4054d6c458bSopenharmony_ci size_t strLen = ipv6[i].size(); 4064d6c458bSopenharmony_ci size_t count = 0; 4074d6c458bSopenharmony_ci size_t j = 0; 4084d6c458bSopenharmony_ci for (j = 0; j < strLen; ++j) { 4094d6c458bSopenharmony_ci if (ipv6[i][j] != '0') { 4104d6c458bSopenharmony_ci break; 4114d6c458bSopenharmony_ci } 4124d6c458bSopenharmony_ci count++; 4134d6c458bSopenharmony_ci } 4144d6c458bSopenharmony_ci if (count == strLen) { 4154d6c458bSopenharmony_ci ipv6[i] = "0"; 4164d6c458bSopenharmony_ci } else if (count != 0) { 4174d6c458bSopenharmony_ci ipv6[i] = ipv6[i].substr(j); 4184d6c458bSopenharmony_ci } 4194d6c458bSopenharmony_ci } 4204d6c458bSopenharmony_ci } 4214d6c458bSopenharmony_ci 4224d6c458bSopenharmony_ci std::string ZeroCompression(std::vector<std::string> &ipv6) 4234d6c458bSopenharmony_ci { 4244d6c458bSopenharmony_ci size_t maxIndex = 0; 4254d6c458bSopenharmony_ci size_t maxSize = 0; 4264d6c458bSopenharmony_ci size_t index = 0; 4274d6c458bSopenharmony_ci size_t size = 0; 4284d6c458bSopenharmony_ci bool isNeedZeroCompression = false; 4294d6c458bSopenharmony_ci size_t len = ipv6.size(); 4304d6c458bSopenharmony_ci for (size_t i = 0; i < len; ++i) { 4314d6c458bSopenharmony_ci index = i; 4324d6c458bSopenharmony_ci size = 0; 4334d6c458bSopenharmony_ci while (i < len && ipv6[i] == "0") { 4344d6c458bSopenharmony_ci isNeedZeroCompression = true; 4354d6c458bSopenharmony_ci size++; 4364d6c458bSopenharmony_ci i++; 4374d6c458bSopenharmony_ci } 4384d6c458bSopenharmony_ci if (maxSize < size) { 4394d6c458bSopenharmony_ci maxSize = size; 4404d6c458bSopenharmony_ci maxIndex = index; 4414d6c458bSopenharmony_ci } 4424d6c458bSopenharmony_ci } 4434d6c458bSopenharmony_ci std::string res = ""; 4444d6c458bSopenharmony_ci size_t ipv6Len = ipv6.size(); 4454d6c458bSopenharmony_ci for (size_t i = 0; i < ipv6Len; ++i) { 4464d6c458bSopenharmony_ci if (isNeedZeroCompression && i == maxIndex) { 4474d6c458bSopenharmony_ci if (maxIndex == 0) { 4484d6c458bSopenharmony_ci res += "::"; 4494d6c458bSopenharmony_ci } else { 4504d6c458bSopenharmony_ci res += ":"; 4514d6c458bSopenharmony_ci } 4524d6c458bSopenharmony_ci i += maxSize - 1; 4534d6c458bSopenharmony_ci continue; 4544d6c458bSopenharmony_ci } 4554d6c458bSopenharmony_ci res += ipv6[i]; 4564d6c458bSopenharmony_ci i != (ipv6Len - 1) ? res += ":" : ""; 4574d6c458bSopenharmony_ci } 4584d6c458bSopenharmony_ci return res; 4594d6c458bSopenharmony_ci } 4604d6c458bSopenharmony_ci 4614d6c458bSopenharmony_ci void ToLower(std::string &str) 4624d6c458bSopenharmony_ci { 4634d6c458bSopenharmony_ci size_t strLen = str.size(); 4644d6c458bSopenharmony_ci for (size_t i = 0; i < strLen; ++i) { 4654d6c458bSopenharmony_ci if (isupper(str[i])) { 4664d6c458bSopenharmony_ci str[i] = static_cast<size_t>(tolower(str[i])); 4674d6c458bSopenharmony_ci } 4684d6c458bSopenharmony_ci } 4694d6c458bSopenharmony_ci } 4704d6c458bSopenharmony_ci 4714d6c458bSopenharmony_ci std::string Compress(std::string str) 4724d6c458bSopenharmony_ci { 4734d6c458bSopenharmony_ci std::vector<std::string> temp; 4744d6c458bSopenharmony_ci size_t pos = 0; 4754d6c458bSopenharmony_ci size_t left = 0; 4764d6c458bSopenharmony_ci while ((pos = str.find(":", left)) != std::string::npos) { 4774d6c458bSopenharmony_ci temp.push_back(str.substr(left, pos - left)); 4784d6c458bSopenharmony_ci left = pos + 1; 4794d6c458bSopenharmony_ci } 4804d6c458bSopenharmony_ci temp.push_back(str.substr(left)); 4814d6c458bSopenharmony_ci RemoveLeadingZeros(temp); 4824d6c458bSopenharmony_ci std::string res = ZeroCompression(temp); 4834d6c458bSopenharmony_ci ToLower(res); 4844d6c458bSopenharmony_ci return res; 4854d6c458bSopenharmony_ci } 4864d6c458bSopenharmony_ci 4874d6c458bSopenharmony_ci void IPv6Host(std::string& input, std::string& host, 4884d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 4894d6c458bSopenharmony_ci { 4904d6c458bSopenharmony_ci std::regex ipv6("(::|(:((:[0-9A-Fa-f]{1,4}){1,7}))|(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|" 4914d6c458bSopenharmony_ci "(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|:))|(([0-9A-Fa-f]{1,4}:){2}" 4924d6c458bSopenharmony_ci "(((:[0-9A-Fa-f]{1,4}){1,5})|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})" 4934d6c458bSopenharmony_ci "|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|:))|(([0-9A-Fa-f]{1,4}:){5}" 4944d6c458bSopenharmony_ci "(((:[0-9A-Fa-f]{1,4}){1,2})|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|:))|" 4954d6c458bSopenharmony_ci "(((:(:[0-9A-Fa-f]{1,4}){0,5}:)|(([0-9A-Fa-f]{1,4}:){1}(:[0-9A-Fa-f]{1,4}){0,4}:)" 4964d6c458bSopenharmony_ci "|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}:)|(([0-9A-Fa-f]{1,4}:){3}" 4974d6c458bSopenharmony_ci "(:[0-9A-Fa-f]{1,4}){0,2}:)|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4})?:)|" 4984d6c458bSopenharmony_ci "(([0-9A-Fa-f]{1,4}:){5}:)|(([0-9A-Fa-f]{1,4}:){6}))((25[0-5]|2[0-4]\\d|1\\d{2}|" 4994d6c458bSopenharmony_ci "[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)))(%[a-zA-Z0-9._]+)?"); 5004d6c458bSopenharmony_ci if (!std::regex_match(input, ipv6)) { 5014d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 5024d6c458bSopenharmony_ci return; 5034d6c458bSopenharmony_ci } 5044d6c458bSopenharmony_ci size_t pos = 0; 5054d6c458bSopenharmony_ci pos = input.find('.'); 5064d6c458bSopenharmony_ci if (pos != std::string::npos) { 5074d6c458bSopenharmony_ci input = DealIpv4(input); 5084d6c458bSopenharmony_ci } 5094d6c458bSopenharmony_ci FormatIpv6(input); 5104d6c458bSopenharmony_ci input = Compress(input); 5114d6c458bSopenharmony_ci host = "[" + input + "]"; 5124d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 5134d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT10)); 5144d6c458bSopenharmony_ci } 5154d6c458bSopenharmony_ci 5164d6c458bSopenharmony_ci bool IsRadix(std::string num, std::string radix) 5174d6c458bSopenharmony_ci { 5184d6c458bSopenharmony_ci size_t len = num.size(); 5194d6c458bSopenharmony_ci for (size_t i = 0; i < len; ++i) { 5204d6c458bSopenharmony_ci if (radix.find(num[i]) == std::string::npos) { 5214d6c458bSopenharmony_ci return false; 5224d6c458bSopenharmony_ci } 5234d6c458bSopenharmony_ci } 5244d6c458bSopenharmony_ci return true; 5254d6c458bSopenharmony_ci } 5264d6c458bSopenharmony_ci 5274d6c458bSopenharmony_ci bool IsNumber(std::string num, int &radix) 5284d6c458bSopenharmony_ci { 5294d6c458bSopenharmony_ci size_t len = num.size(); 5304d6c458bSopenharmony_ci if (len >= 2 && num[0] == '0' && (num[1] == 'x' || num[1] == 'X')) { // 2:hex head length 5314d6c458bSopenharmony_ci radix = 16; // 16:hex 5324d6c458bSopenharmony_ci std::string subStr = num.substr(2); // 2:jump 0x 5334d6c458bSopenharmony_ci if (subStr.empty()) { 5344d6c458bSopenharmony_ci return true; 5354d6c458bSopenharmony_ci } 5364d6c458bSopenharmony_ci return IsRadix(subStr, "0123456789abcdefABCDEF"); 5374d6c458bSopenharmony_ci } else if (len >= 1 && num[0] == '0') { 5384d6c458bSopenharmony_ci radix = 8; // 8:octal 5394d6c458bSopenharmony_ci std::string subStr = num.substr(1); 5404d6c458bSopenharmony_ci if (subStr.empty()) { 5414d6c458bSopenharmony_ci return true; 5424d6c458bSopenharmony_ci } 5434d6c458bSopenharmony_ci return IsRadix(num.substr(1), "01234567"); 5444d6c458bSopenharmony_ci } else if (IsRadix(num, "0123456789")) { 5454d6c458bSopenharmony_ci radix = 10; // 10:decimal 5464d6c458bSopenharmony_ci return true; 5474d6c458bSopenharmony_ci } 5484d6c458bSopenharmony_ci return false; 5494d6c458bSopenharmony_ci } 5504d6c458bSopenharmony_ci 5514d6c458bSopenharmony_ci std::string BinaryConversion(std::string num, int radix) 5524d6c458bSopenharmony_ci { 5534d6c458bSopenharmony_ci int val = 0; 5544d6c458bSopenharmony_ci if (radix == 16) { // 16:hex 5554d6c458bSopenharmony_ci if (num.substr(2).empty()) { // 2:jump 0x 5564d6c458bSopenharmony_ci return "0"; 5574d6c458bSopenharmony_ci } 5584d6c458bSopenharmony_ci if (sscanf_s(num.c_str(), "%x", &val) == -1) { 5594d6c458bSopenharmony_ci HILOG_ERROR("sscanf_s is falie"); 5604d6c458bSopenharmony_ci return num; 5614d6c458bSopenharmony_ci } 5624d6c458bSopenharmony_ci return std::to_string(val); 5634d6c458bSopenharmony_ci } else if (radix == 8) { // 8:octal 5644d6c458bSopenharmony_ci if (num.substr(1).empty()) { 5654d6c458bSopenharmony_ci return "0"; 5664d6c458bSopenharmony_ci } 5674d6c458bSopenharmony_ci if (sscanf_s(num.c_str(), "%o", &val) == -1) { 5684d6c458bSopenharmony_ci HILOG_ERROR("sscanf_s is falie"); 5694d6c458bSopenharmony_ci return num; 5704d6c458bSopenharmony_ci } 5714d6c458bSopenharmony_ci return std::to_string(val); 5724d6c458bSopenharmony_ci } else { 5734d6c458bSopenharmony_ci return num; 5744d6c458bSopenharmony_ci } 5754d6c458bSopenharmony_ci } 5764d6c458bSopenharmony_ci 5774d6c458bSopenharmony_ci bool RemovalIpv4(std::vector<std::string> &temp, std::string str, 5784d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags) 5794d6c458bSopenharmony_ci { 5804d6c458bSopenharmony_ci size_t pos = 0; 5814d6c458bSopenharmony_ci size_t left = 0; 5824d6c458bSopenharmony_ci while ((pos = str.find(".", left)) != std::string::npos) { 5834d6c458bSopenharmony_ci temp.push_back(str.substr(left, pos - left)); 5844d6c458bSopenharmony_ci left = pos + 1; 5854d6c458bSopenharmony_ci } 5864d6c458bSopenharmony_ci 5874d6c458bSopenharmony_ci if (left != str.size()) { 5884d6c458bSopenharmony_ci temp.push_back(str.substr(left)); 5894d6c458bSopenharmony_ci } 5904d6c458bSopenharmony_ci 5914d6c458bSopenharmony_ci size_t tmpLen = temp.size(); 5924d6c458bSopenharmony_ci std::vector<std::string> res; 5934d6c458bSopenharmony_ci for (size_t i = 0; i < tmpLen; ++i) { 5944d6c458bSopenharmony_ci int radix = 0; 5954d6c458bSopenharmony_ci if (IsNumber(temp[i], radix)) { 5964d6c458bSopenharmony_ci res.push_back(BinaryConversion(temp[i], radix)); 5974d6c458bSopenharmony_ci } else { 5984d6c458bSopenharmony_ci return false; 5994d6c458bSopenharmony_ci } 6004d6c458bSopenharmony_ci } 6014d6c458bSopenharmony_ci temp = res; 6024d6c458bSopenharmony_ci bool isIpv4 = true; 6034d6c458bSopenharmony_ci for (size_t i = 0; i < tmpLen; ++i) { 6044d6c458bSopenharmony_ci if (temp[i] == "") { 6054d6c458bSopenharmony_ci isIpv4 = false; 6064d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 6074d6c458bSopenharmony_ci if (i == tmpLen - 1) { 6084d6c458bSopenharmony_ci temp.push_back(""); 6094d6c458bSopenharmony_ci flags.reset(static_cast<size_t>(BitsetStatusFlag::BIT0)); 6104d6c458bSopenharmony_ci } 6114d6c458bSopenharmony_ci } 6124d6c458bSopenharmony_ci } 6134d6c458bSopenharmony_ci return isIpv4; 6144d6c458bSopenharmony_ci } 6154d6c458bSopenharmony_ci 6164d6c458bSopenharmony_ci int IsFormatIpv4(std::vector<std::string> nums) 6174d6c458bSopenharmony_ci { 6184d6c458bSopenharmony_ci size_t len = nums.size(); 6194d6c458bSopenharmony_ci for (size_t i = 0; i < len; ++i) { 6204d6c458bSopenharmony_ci if (nums[i].size() > 8) { // 8:ipv4 max value size 6214d6c458bSopenharmony_ci return i; 6224d6c458bSopenharmony_ci } 6234d6c458bSopenharmony_ci if (!nums[i].empty() && stoi(nums[i]) > 255) { // 255:ipv4 max value 6244d6c458bSopenharmony_ci return i; 6254d6c458bSopenharmony_ci } 6264d6c458bSopenharmony_ci } 6274d6c458bSopenharmony_ci return -1; 6284d6c458bSopenharmony_ci } 6294d6c458bSopenharmony_ci 6304d6c458bSopenharmony_ci std::string SplitNum(std::string num, size_t& number) 6314d6c458bSopenharmony_ci { 6324d6c458bSopenharmony_ci if (num.size() > 8) { // 8:ipv4 max value size 6334d6c458bSopenharmony_ci number = num.size(); 6344d6c458bSopenharmony_ci return num; 6354d6c458bSopenharmony_ci } 6364d6c458bSopenharmony_ci int val = stoi(num); 6374d6c458bSopenharmony_ci std::vector<std::string> nums; 6384d6c458bSopenharmony_ci std::string res = ""; 6394d6c458bSopenharmony_ci while (val > 0) { 6404d6c458bSopenharmony_ci int numConver = val % 256; // 256:ipv4 max value 6414d6c458bSopenharmony_ci nums.push_back(std::to_string(numConver)); 6424d6c458bSopenharmony_ci val /= 256; // 256:ipv4 max value 6434d6c458bSopenharmony_ci } 6444d6c458bSopenharmony_ci for (int i = static_cast<int>(nums.size()) - 1; i >= 0; --i) { 6454d6c458bSopenharmony_ci res += nums[i] + "."; 6464d6c458bSopenharmony_ci } 6474d6c458bSopenharmony_ci number = nums.size(); 6484d6c458bSopenharmony_ci return res.substr(0, res.size() - 1); 6494d6c458bSopenharmony_ci } 6504d6c458bSopenharmony_ci 6514d6c458bSopenharmony_ci void FormatIpv4(std::vector<std::string> nums, std::string& host, 6524d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags) 6534d6c458bSopenharmony_ci { 6544d6c458bSopenharmony_ci size_t len = nums.size(); 6554d6c458bSopenharmony_ci int index = IsFormatIpv4(nums); 6564d6c458bSopenharmony_ci std::string res = ""; 6574d6c458bSopenharmony_ci if (index == -1) { 6584d6c458bSopenharmony_ci for (size_t i = 0; i < len - 1; ++i) { 6594d6c458bSopenharmony_ci res += nums[i] + "."; 6604d6c458bSopenharmony_ci } 6614d6c458bSopenharmony_ci for (size_t i = 0; i < 4 - len; ++i) { // 4:ipv4 max size 6624d6c458bSopenharmony_ci res += "0."; 6634d6c458bSopenharmony_ci } 6644d6c458bSopenharmony_ci res += nums[len - 1]; 6654d6c458bSopenharmony_ci host = res; 6664d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 6674d6c458bSopenharmony_ci } else if (index == static_cast<int>(len - 1)) { 6684d6c458bSopenharmony_ci for (size_t i = 0; i < len - 1; ++i) { 6694d6c458bSopenharmony_ci res += nums[i] + "."; 6704d6c458bSopenharmony_ci } 6714d6c458bSopenharmony_ci size_t number = 0; 6724d6c458bSopenharmony_ci std::string temp = SplitNum(nums[index], number); 6734d6c458bSopenharmony_ci if (number + (len - 1) > 4) { // 4:ipv4 max size 6744d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 6754d6c458bSopenharmony_ci return; 6764d6c458bSopenharmony_ci } 6774d6c458bSopenharmony_ci for (size_t i = 0; i < 4 - (len - 1 + number); ++i) { // 4:ipv4 max size 6784d6c458bSopenharmony_ci temp = "0." + temp; 6794d6c458bSopenharmony_ci } 6804d6c458bSopenharmony_ci host = res + temp; 6814d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 6824d6c458bSopenharmony_ci } else { 6834d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 6844d6c458bSopenharmony_ci return; 6854d6c458bSopenharmony_ci } 6864d6c458bSopenharmony_ci } 6874d6c458bSopenharmony_ci 6884d6c458bSopenharmony_ci void AnalyseIPv4(const std::string& input, std::string& host, 6894d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 6904d6c458bSopenharmony_ci { 6914d6c458bSopenharmony_ci bool isipv4 = false; 6924d6c458bSopenharmony_ci std::vector<std::string> temp; 6934d6c458bSopenharmony_ci isipv4 = RemovalIpv4(temp, input, flags); 6944d6c458bSopenharmony_ci size_t tempLen = temp.size(); 6954d6c458bSopenharmony_ci size_t lastSize = temp[tempLen - 1].size(); 6964d6c458bSopenharmony_ci if (isipv4 == true && lastSize > 8) { // 8: ipv4 last number size 6974d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 6984d6c458bSopenharmony_ci return; 6994d6c458bSopenharmony_ci } 7004d6c458bSopenharmony_ci std::string res = ""; 7014d6c458bSopenharmony_ci for (size_t i = 0; i < tempLen; ++i) { 7024d6c458bSopenharmony_ci res += temp[i]; 7034d6c458bSopenharmony_ci if (i != tempLen - 1) { 7044d6c458bSopenharmony_ci res += "."; 7054d6c458bSopenharmony_ci } 7064d6c458bSopenharmony_ci } 7074d6c458bSopenharmony_ci if (isipv4) { 7084d6c458bSopenharmony_ci if (tempLen > 4) { // 4:ipv4 max size 7094d6c458bSopenharmony_ci ToLower(res); 7104d6c458bSopenharmony_ci host = res; 7114d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 7124d6c458bSopenharmony_ci } else if (tempLen == 4) { // 4:ipv4 max size 7134d6c458bSopenharmony_ci if (IsFormatIpv4(temp) == -1) { 7144d6c458bSopenharmony_ci host = res; 7154d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 7164d6c458bSopenharmony_ci } else { 7174d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 7184d6c458bSopenharmony_ci } 7194d6c458bSopenharmony_ci } else { 7204d6c458bSopenharmony_ci FormatIpv4(temp, host, flags); 7214d6c458bSopenharmony_ci } 7224d6c458bSopenharmony_ci } else { 7234d6c458bSopenharmony_ci ToLower(res); 7244d6c458bSopenharmony_ci host = res; 7254d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 7264d6c458bSopenharmony_ci } 7274d6c458bSopenharmony_ci } 7284d6c458bSopenharmony_ci 7294d6c458bSopenharmony_ci void AnalysisHost(std::string& input, std::string& host, 7304d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, bool special) 7314d6c458bSopenharmony_ci { 7324d6c458bSopenharmony_ci if (input.empty()) { 7334d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 7344d6c458bSopenharmony_ci return; 7354d6c458bSopenharmony_ci } 7364d6c458bSopenharmony_ci if (input[0] == '[') { 7374d6c458bSopenharmony_ci if ((input[input.length() - 1]) == ']') { 7384d6c458bSopenharmony_ci size_t b = input.length(); 7394d6c458bSopenharmony_ci input = input.substr(1, b - 2); // 2:Truncating Strings 7404d6c458bSopenharmony_ci IPv6Host(input, host, flags); 7414d6c458bSopenharmony_ci return; 7424d6c458bSopenharmony_ci } else { 7434d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 7444d6c458bSopenharmony_ci return; 7454d6c458bSopenharmony_ci } 7464d6c458bSopenharmony_ci } 7474d6c458bSopenharmony_ci if (!special) { 7484d6c458bSopenharmony_ci AnalysisOpaqueHost(input, host, flags); 7494d6c458bSopenharmony_ci return; 7504d6c458bSopenharmony_ci } 7514d6c458bSopenharmony_ci std::string decodeInput = DecodeSpecialChars(input); 7524d6c458bSopenharmony_ci if (!CheckCharacter(decodeInput, g_specialCharForBit)) { 7534d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 7544d6c458bSopenharmony_ci return; 7554d6c458bSopenharmony_ci } 7564d6c458bSopenharmony_ci AnalyseIPv4(decodeInput, host, flags); 7574d6c458bSopenharmony_ci } 7584d6c458bSopenharmony_ci 7594d6c458bSopenharmony_ci bool ISFileNohost(const std::string& input) 7604d6c458bSopenharmony_ci { 7614d6c458bSopenharmony_ci if ((isalpha(input[0]) && (input[1] == ':' || input[1] == '|'))) { 7624d6c458bSopenharmony_ci return true; 7634d6c458bSopenharmony_ci } 7644d6c458bSopenharmony_ci return false; 7654d6c458bSopenharmony_ci } 7664d6c458bSopenharmony_ci 7674d6c458bSopenharmony_ci void AnalysisFilePath(std::string& input, UrlData& urlinfo, 7684d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 7694d6c458bSopenharmony_ci { 7704d6c458bSopenharmony_ci std::vector<std::string> temp; 7714d6c458bSopenharmony_ci size_t pos = 0; 7724d6c458bSopenharmony_ci while (((pos = input.find('/')) != std::string::npos) || ((pos = input.find('\\')) != std::string::npos)) { 7734d6c458bSopenharmony_ci temp.push_back(input.substr(0, pos)); 7744d6c458bSopenharmony_ci input = input.substr(pos + 1); 7754d6c458bSopenharmony_ci } 7764d6c458bSopenharmony_ci temp.push_back(input); 7774d6c458bSopenharmony_ci size_t length = temp.size(); 7784d6c458bSopenharmony_ci for (size_t i = 0; i < length; ++i) { 7794d6c458bSopenharmony_ci auto a = find(g_doubleSegment.begin(), g_doubleSegment.end(), temp[i]); 7804d6c458bSopenharmony_ci if (a != g_doubleSegment.end()) { 7814d6c458bSopenharmony_ci if ((urlinfo.path.size() == 1) && ISFileNohost(urlinfo.path[0]) && 7824d6c458bSopenharmony_ci urlinfo.path[0].size() == 2) { // 2:The interception length is 2 7834d6c458bSopenharmony_ci urlinfo.path[0][1] = ':'; 7844d6c458bSopenharmony_ci } else if (!urlinfo.path.empty()) { 7854d6c458bSopenharmony_ci urlinfo.path.pop_back(); 7864d6c458bSopenharmony_ci } 7874d6c458bSopenharmony_ci if (i == temp.size() - 1) { 7884d6c458bSopenharmony_ci urlinfo.path.push_back(""); 7894d6c458bSopenharmony_ci } 7904d6c458bSopenharmony_ci continue; 7914d6c458bSopenharmony_ci } 7924d6c458bSopenharmony_ci a = find(g_singlesegment.begin(), g_singlesegment.end(), temp[i]); 7934d6c458bSopenharmony_ci if (a != g_singlesegment.end()) { 7944d6c458bSopenharmony_ci if (i == temp.size() - 1) { 7954d6c458bSopenharmony_ci urlinfo.path.push_back(""); 7964d6c458bSopenharmony_ci } 7974d6c458bSopenharmony_ci continue; 7984d6c458bSopenharmony_ci } 7994d6c458bSopenharmony_ci urlinfo.path.push_back(temp[i]); 8004d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 8014d6c458bSopenharmony_ci } 8024d6c458bSopenharmony_ci std::string it = urlinfo.path[0]; 8034d6c458bSopenharmony_ci if (isalpha(it[0]) && (it[1] == ':' || it[1] == '|')) { 8044d6c458bSopenharmony_ci if (it.size() == 2) { // 2:The length is 2 8054d6c458bSopenharmony_ci it[1] = ':'; 8064d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4), 0); 8074d6c458bSopenharmony_ci urlinfo.host.clear(); 8084d6c458bSopenharmony_ci } 8094d6c458bSopenharmony_ci } 8104d6c458bSopenharmony_ci } 8114d6c458bSopenharmony_ci 8124d6c458bSopenharmony_ci void AnalysisSpecialFile(std::string& temp, size_t pos, UrlData& urlinfo, 8134d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 8144d6c458bSopenharmony_ci { 8154d6c458bSopenharmony_ci std::string strHost = temp.substr(0, pos); 8164d6c458bSopenharmony_ci std::string strPath = temp.substr(pos + 1); 8174d6c458bSopenharmony_ci bool special = true; 8184d6c458bSopenharmony_ci if (!ISFileNohost(strHost)) { 8194d6c458bSopenharmony_ci AnalysisHost(strHost, urlinfo.host, flags, special); 8204d6c458bSopenharmony_ci } else if (!ISFileNohost(strHost) && flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 8214d6c458bSopenharmony_ci return; 8224d6c458bSopenharmony_ci } 8234d6c458bSopenharmony_ci if (!ISFileNohost(strHost)) { 8244d6c458bSopenharmony_ci AnalysisFilePath(strPath, urlinfo, flags); 8254d6c458bSopenharmony_ci } else { 8264d6c458bSopenharmony_ci AnalysisFilePath(temp, urlinfo, flags); 8274d6c458bSopenharmony_ci } 8284d6c458bSopenharmony_ci } 8294d6c458bSopenharmony_ci void AnalysisFile(std::string& input, UrlData& urlinfo, 8304d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 8314d6c458bSopenharmony_ci { 8324d6c458bSopenharmony_ci bool special = true; 8334d6c458bSopenharmony_ci if ((input[0] == '/' || input[0] == '\\') && (input[1] == '/' || input[1] == '\\')) { 8344d6c458bSopenharmony_ci std::string temp = input.substr(2); // 2:Intercept from 2 subscripts 8354d6c458bSopenharmony_ci size_t pos = 0; 8364d6c458bSopenharmony_ci if ((((pos = temp.find('/')) != std::string::npos) || 8374d6c458bSopenharmony_ci ((pos = temp.find('\\')) != std::string::npos)) && pos == 0) { 8384d6c458bSopenharmony_ci temp = temp.substr(1); 8394d6c458bSopenharmony_ci AnalysisFilePath(temp, urlinfo, flags); 8404d6c458bSopenharmony_ci } else if ((((pos = temp.find('/')) != std::string::npos) || 8414d6c458bSopenharmony_ci ((pos = temp.find('\\')) != std::string::npos)) && pos != 0) { 8424d6c458bSopenharmony_ci AnalysisSpecialFile(temp, pos, urlinfo, flags); 8434d6c458bSopenharmony_ci } else { 8444d6c458bSopenharmony_ci if (!temp.empty() && flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 8454d6c458bSopenharmony_ci AnalysisHost(temp, urlinfo.host, flags, special); 8464d6c458bSopenharmony_ci } else if (!temp.empty() && !flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 8474d6c458bSopenharmony_ci AnalysisHost(temp, urlinfo.host, flags, special); 8484d6c458bSopenharmony_ci return; 8494d6c458bSopenharmony_ci } 8504d6c458bSopenharmony_ci } 8514d6c458bSopenharmony_ci } else { 8524d6c458bSopenharmony_ci if (input[0] == '/' || input[0] == '\\') { 8534d6c458bSopenharmony_ci input = input.substr(1); 8544d6c458bSopenharmony_ci } 8554d6c458bSopenharmony_ci AnalysisFilePath(input, urlinfo, flags); 8564d6c458bSopenharmony_ci } 8574d6c458bSopenharmony_ci } 8584d6c458bSopenharmony_ci 8594d6c458bSopenharmony_ci void AnalysisFilescheme(const std::string& input, UrlData& urlinfo, 8604d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 8614d6c458bSopenharmony_ci { 8624d6c458bSopenharmony_ci std::string strPath = urlinfo.scheme + input; 8634d6c458bSopenharmony_ci urlinfo.scheme = "file:"; 8644d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT1)); 8654d6c458bSopenharmony_ci AnalysisFilePath(strPath, urlinfo, flags); 8664d6c458bSopenharmony_ci } 8674d6c458bSopenharmony_ci 8684d6c458bSopenharmony_ci void AnalyInfoPath(std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags, 8694d6c458bSopenharmony_ci UrlData& urlinfo, const std::string& input) 8704d6c458bSopenharmony_ci { 8714d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT9)); 8724d6c458bSopenharmony_ci if (urlinfo.path.empty()) { 8734d6c458bSopenharmony_ci urlinfo.path.emplace_back(""); 8744d6c458bSopenharmony_ci } 8754d6c458bSopenharmony_ci urlinfo.path[0] = input; 8764d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 8774d6c458bSopenharmony_ci return; 8784d6c458bSopenharmony_ci } 8794d6c458bSopenharmony_ci 8804d6c458bSopenharmony_ci void AnalyHostPath(std::string &strHost, std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, 8814d6c458bSopenharmony_ci UrlData& urlinfo) 8824d6c458bSopenharmony_ci { 8834d6c458bSopenharmony_ci size_t pos = 0; 8844d6c458bSopenharmony_ci if (strHost[strHost.size() - 1] != ']' && (pos = strHost.find_last_of(':')) != std::string::npos) { 8854d6c458bSopenharmony_ci std::string port = strHost.substr(pos + 1); 8864d6c458bSopenharmony_ci strHost = strHost.substr(0, pos); 8874d6c458bSopenharmony_ci AnalysisPort(port, urlinfo, flags); 8884d6c458bSopenharmony_ci if (flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 8894d6c458bSopenharmony_ci return; 8904d6c458bSopenharmony_ci } 8914d6c458bSopenharmony_ci } 8924d6c458bSopenharmony_ci } 8934d6c458bSopenharmony_ci void AnalyStrHost(std::string &strHost, UrlData& urlinfo, 8944d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags) 8954d6c458bSopenharmony_ci { 8964d6c458bSopenharmony_ci if (strHost.find('@') != std::string::npos) { 8974d6c458bSopenharmony_ci AnalysisUsernameAndPasswd(strHost, urlinfo.username, urlinfo.password, flags); 8984d6c458bSopenharmony_ci } 8994d6c458bSopenharmony_ci if (strHost.empty()) { 9004d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 9014d6c458bSopenharmony_ci return; 9024d6c458bSopenharmony_ci } 9034d6c458bSopenharmony_ci } 9044d6c458bSopenharmony_ci 9054d6c458bSopenharmony_ci void AnalysisNoDefaultProtocol(std::string& input, UrlData& urlinfo, 9064d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 9074d6c458bSopenharmony_ci { 9084d6c458bSopenharmony_ci if (urlinfo.scheme.size() == 2) { // 2:The length is 2 9094d6c458bSopenharmony_ci AnalysisFilescheme(input, urlinfo, flags); 9104d6c458bSopenharmony_ci return; 9114d6c458bSopenharmony_ci } 9124d6c458bSopenharmony_ci if (input[0] == '/' && input[1] == '/' && input[2] != '/') { // 2:The third character of the input 9134d6c458bSopenharmony_ci std::string hostandpath = input.substr(2); // 2:Intercept from 2 subscripts 9144d6c458bSopenharmony_ci if (hostandpath.empty()) { 9154d6c458bSopenharmony_ci return; 9164d6c458bSopenharmony_ci } 9174d6c458bSopenharmony_ci size_t i = 0; 9184d6c458bSopenharmony_ci bool special = false; 9194d6c458bSopenharmony_ci std::string strHost = ""; 9204d6c458bSopenharmony_ci if (hostandpath.find('/') != std::string::npos) { 9214d6c458bSopenharmony_ci i = hostandpath.find('/'); 9224d6c458bSopenharmony_ci strHost = hostandpath.substr(0, i); 9234d6c458bSopenharmony_ci std::string strPath = hostandpath.substr(i + 1); 9244d6c458bSopenharmony_ci if (strHost.find('@') != std::string::npos) { 9254d6c458bSopenharmony_ci AnalysisUsernameAndPasswd(strHost, urlinfo.username, urlinfo.password, flags); 9264d6c458bSopenharmony_ci } 9274d6c458bSopenharmony_ci if (strHost.empty()) { 9284d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 9294d6c458bSopenharmony_ci return; 9304d6c458bSopenharmony_ci } 9314d6c458bSopenharmony_ci size_t pos = 0; 9324d6c458bSopenharmony_ci if (strHost[strHost.size() - 1] != ']' && (pos = strHost.find_last_of(':')) != std::string::npos) { 9334d6c458bSopenharmony_ci std::string port = strHost.substr(pos + 1); 9344d6c458bSopenharmony_ci strHost = strHost.substr(0, pos); 9354d6c458bSopenharmony_ci AnalysisPort(port, urlinfo, flags); 9364d6c458bSopenharmony_ci } 9374d6c458bSopenharmony_ci if (strHost[strHost.size() - 1] != ']' && (pos = strHost.find_last_of(':')) != std::string::npos && 9384d6c458bSopenharmony_ci flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 9394d6c458bSopenharmony_ci return; 9404d6c458bSopenharmony_ci } 9414d6c458bSopenharmony_ci AnalysisHost(strHost, urlinfo.host, flags, special); 9424d6c458bSopenharmony_ci AnalysisPath(strPath, urlinfo.path, flags, special); 9434d6c458bSopenharmony_ci } else { 9444d6c458bSopenharmony_ci strHost = hostandpath; 9454d6c458bSopenharmony_ci AnalyStrHost(strHost, urlinfo, flags); 9464d6c458bSopenharmony_ci AnalyHostPath(strHost, flags, urlinfo); 9474d6c458bSopenharmony_ci AnalysisHost(strHost, urlinfo.host, flags, special); 9484d6c458bSopenharmony_ci } 9494d6c458bSopenharmony_ci } else if (input[0] == '/' && input[1] == '/') { 9504d6c458bSopenharmony_ci std::string strOfPath = input.substr(1); 9514d6c458bSopenharmony_ci AnalysisPath(strOfPath, urlinfo.path, flags, false); 9524d6c458bSopenharmony_ci } else { 9534d6c458bSopenharmony_ci AnalyInfoPath(flags, urlinfo, input); 9544d6c458bSopenharmony_ci } 9554d6c458bSopenharmony_ci } 9564d6c458bSopenharmony_ci 9574d6c458bSopenharmony_ci void AnalysisOnlyHost(const std::string& input, UrlData& urlinfo, 9584d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, size_t pos) 9594d6c458bSopenharmony_ci { 9604d6c458bSopenharmony_ci std::string strHost = input; 9614d6c458bSopenharmony_ci if (strHost.find('@') != std::string::npos) { 9624d6c458bSopenharmony_ci AnalysisUsernameAndPasswd(strHost, urlinfo.username, urlinfo.password, flags); 9634d6c458bSopenharmony_ci } 9644d6c458bSopenharmony_ci if (strHost.empty()) { 9654d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 9664d6c458bSopenharmony_ci return; 9674d6c458bSopenharmony_ci } 9684d6c458bSopenharmony_ci if (strHost[strHost.size() - 1] != ']') { 9694d6c458bSopenharmony_ci if ((pos = strHost.find_last_of(':')) != std::string::npos) { 9704d6c458bSopenharmony_ci std::string port = strHost.substr(pos + 1); 9714d6c458bSopenharmony_ci strHost = strHost.substr(0, pos); 9724d6c458bSopenharmony_ci AnalysisPort(port, urlinfo, flags); 9734d6c458bSopenharmony_ci } 9744d6c458bSopenharmony_ci if ((pos = strHost.find_last_of(':')) != std::string::npos && 9754d6c458bSopenharmony_ci flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 9764d6c458bSopenharmony_ci return; 9774d6c458bSopenharmony_ci } 9784d6c458bSopenharmony_ci } 9794d6c458bSopenharmony_ci AnalysisHost(strHost, urlinfo.host, flags, true); 9804d6c458bSopenharmony_ci } 9814d6c458bSopenharmony_ci 9824d6c458bSopenharmony_ci void JudgePos(size_t &pos, const size_t &length, const std::string& input) 9834d6c458bSopenharmony_ci { 9844d6c458bSopenharmony_ci for (pos = 0; pos < length; pos++) { 9854d6c458bSopenharmony_ci if (input[pos] == '/' || input[pos] == '\\') { 9864d6c458bSopenharmony_ci break; 9874d6c458bSopenharmony_ci } 9884d6c458bSopenharmony_ci } 9894d6c458bSopenharmony_ci } 9904d6c458bSopenharmony_ci 9914d6c458bSopenharmony_ci void SkipSlashSymbol(std::string& input, size_t& pos) 9924d6c458bSopenharmony_ci { 9934d6c458bSopenharmony_ci size_t inputLen = input.size(); 9944d6c458bSopenharmony_ci while (pos < inputLen) { 9954d6c458bSopenharmony_ci if (input[pos] == '/' || input[pos] == '\\') { 9964d6c458bSopenharmony_ci pos++; 9974d6c458bSopenharmony_ci continue; 9984d6c458bSopenharmony_ci } 9994d6c458bSopenharmony_ci break; 10004d6c458bSopenharmony_ci } 10014d6c458bSopenharmony_ci input = input.substr(pos); 10024d6c458bSopenharmony_ci } 10034d6c458bSopenharmony_ci 10044d6c458bSopenharmony_ci void ParsingHostAndPath(std::string& input, UrlData& urlinfo, size_t& pos, 10054d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 10064d6c458bSopenharmony_ci { 10074d6c458bSopenharmony_ci bool special = true; 10084d6c458bSopenharmony_ci size_t length = input.size(); 10094d6c458bSopenharmony_ci JudgePos(pos, length, input); 10104d6c458bSopenharmony_ci std::string strHost = input.substr(0, pos); 10114d6c458bSopenharmony_ci std::string strPath = input.substr(pos + 1); 10124d6c458bSopenharmony_ci if (strHost.find('@') != std::string::npos) { 10134d6c458bSopenharmony_ci AnalysisUsernameAndPasswd(strHost, urlinfo.username, urlinfo.password, flags); 10144d6c458bSopenharmony_ci } 10154d6c458bSopenharmony_ci if (strHost.empty()) { 10164d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 10174d6c458bSopenharmony_ci return; 10184d6c458bSopenharmony_ci } 10194d6c458bSopenharmony_ci if (strHost[strHost.size() - 1] != ']' && (pos = strHost.find_last_of(':')) != std::string::npos) { 10204d6c458bSopenharmony_ci pos = strHost.find_last_of(':'); 10214d6c458bSopenharmony_ci if (pos != std::string::npos) { 10224d6c458bSopenharmony_ci std::string port = strHost.substr(pos + 1); 10234d6c458bSopenharmony_ci strHost = strHost.substr(0, pos); 10244d6c458bSopenharmony_ci AnalysisPort(port, urlinfo, flags); 10254d6c458bSopenharmony_ci } 10264d6c458bSopenharmony_ci } 10274d6c458bSopenharmony_ci if (strHost[strHost.size() - 1] != ']' && strHost.find_last_of(':') != std::string::npos && 10284d6c458bSopenharmony_ci flags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 10294d6c458bSopenharmony_ci return; 10304d6c458bSopenharmony_ci } 10314d6c458bSopenharmony_ci AnalysisHost(strHost, urlinfo.host, flags, special); 10324d6c458bSopenharmony_ci AnalysisPath(strPath, urlinfo.path, flags, special); 10334d6c458bSopenharmony_ci } 10344d6c458bSopenharmony_ci 10354d6c458bSopenharmony_ci void AnalysisHostAndPath(std::string& input, UrlData& urlinfo, 10364d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 10374d6c458bSopenharmony_ci { 10384d6c458bSopenharmony_ci if (flags.test(static_cast<size_t>(BitsetStatusFlag::BIT1))) { 10394d6c458bSopenharmony_ci size_t pos = 0; 10404d6c458bSopenharmony_ci SkipSlashSymbol(input, pos); 10414d6c458bSopenharmony_ci if (input.size() == 0) { 10424d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 10434d6c458bSopenharmony_ci return; 10444d6c458bSopenharmony_ci } else if ((input.find('/') != std::string::npos || input.find('\\') != std::string::npos)) { 10454d6c458bSopenharmony_ci ParsingHostAndPath(input, urlinfo, pos, flags); 10464d6c458bSopenharmony_ci } else if (input.size() != 0 && input.find('/') == std::string::npos && 10474d6c458bSopenharmony_ci input.find('\\') == std::string::npos) { 10484d6c458bSopenharmony_ci AnalysisOnlyHost(input, urlinfo, flags, pos); 10494d6c458bSopenharmony_ci } 10504d6c458bSopenharmony_ci } else { 10514d6c458bSopenharmony_ci size_t inputLen = input.size(); 10524d6c458bSopenharmony_ci if (inputLen > 0) { 10534d6c458bSopenharmony_ci urlinfo.isSpecialPath = input[0] != '/' ? true : false; 10544d6c458bSopenharmony_ci } 10554d6c458bSopenharmony_ci AnalysisNoDefaultProtocol(input, urlinfo, flags); 10564d6c458bSopenharmony_ci } 10574d6c458bSopenharmony_ci } 10584d6c458bSopenharmony_ci 10594d6c458bSopenharmony_ci void AnalysisInput(std::string& input, UrlData& urlData, 10604d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 10614d6c458bSopenharmony_ci { 10624d6c458bSopenharmony_ci size_t pos = 0; 10634d6c458bSopenharmony_ci if (input.find('#') != std::string::npos) { 10644d6c458bSopenharmony_ci pos = input.find('#'); 10654d6c458bSopenharmony_ci std::string fragment = input.substr(pos); 10664d6c458bSopenharmony_ci AnalysisFragment(fragment, urlData.fragment, flags); 10674d6c458bSopenharmony_ci input = input.substr(0, pos); 10684d6c458bSopenharmony_ci } 10694d6c458bSopenharmony_ci if (input.find('?') != std::string::npos) { 10704d6c458bSopenharmony_ci pos = input.find('?'); 10714d6c458bSopenharmony_ci std::string query = input.substr(pos); 10724d6c458bSopenharmony_ci AnalysisQuery(query, urlData.query, flags); 10734d6c458bSopenharmony_ci input = input.substr(0, pos); 10744d6c458bSopenharmony_ci } 10754d6c458bSopenharmony_ci bool special = (flags.test(static_cast<size_t>(BitsetStatusFlag::BIT1)) ? true : false); 10764d6c458bSopenharmony_ci std::string pathStr = input; 10774d6c458bSopenharmony_ci AnalysisPath(pathStr, urlData.path, flags, special); 10784d6c458bSopenharmony_ci } 10794d6c458bSopenharmony_ci 10804d6c458bSopenharmony_ci void BaseInfoToUrl(const UrlData& baseInfo, 10814d6c458bSopenharmony_ci const std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& baseflags, UrlData& urlData, 10824d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, bool inputIsEmpty) 10834d6c458bSopenharmony_ci { 10844d6c458bSopenharmony_ci urlData.scheme = baseInfo.scheme; 10854d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT1), 10864d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT1))); 10874d6c458bSopenharmony_ci urlData.host = baseInfo.host; 10884d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 10894d6c458bSopenharmony_ci urlData.username = baseInfo.username; 10904d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT2), 10914d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT2))); 10924d6c458bSopenharmony_ci urlData.password = baseInfo.password; 10934d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT3), 10944d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT3))); 10954d6c458bSopenharmony_ci urlData.port = baseInfo.port; 10964d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT5), 10974d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT5))); 10984d6c458bSopenharmony_ci if (inputIsEmpty) { 10994d6c458bSopenharmony_ci urlData.path = baseInfo.path; 11004d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT6), 11014d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT6))); 11024d6c458bSopenharmony_ci urlData.query = baseInfo.query; 11034d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT7), 11044d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT7))); 11054d6c458bSopenharmony_ci urlData.fragment = baseInfo.fragment; 11064d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT8), 11074d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT8))); 11084d6c458bSopenharmony_ci } 11094d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT9), 11104d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT9))); 11114d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT10), 11124d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT10))); 11134d6c458bSopenharmony_ci } 11144d6c458bSopenharmony_ci 11154d6c458bSopenharmony_ci void ShorteningPath(UrlData& urlData, UrlData& baseData, bool isFile) 11164d6c458bSopenharmony_ci { 11174d6c458bSopenharmony_ci if (baseData.path.empty()) { 11184d6c458bSopenharmony_ci return; 11194d6c458bSopenharmony_ci } 11204d6c458bSopenharmony_ci if (urlData.path.size() == 1 && urlData.path[0].empty()) { 11214d6c458bSopenharmony_ci urlData.path.pop_back(); 11224d6c458bSopenharmony_ci return; 11234d6c458bSopenharmony_ci } 11244d6c458bSopenharmony_ci if ((baseData.path.size() == 1) && isFile && 11254d6c458bSopenharmony_ci isalpha(baseData.path[0][0]) && (baseData.path[0][1] == ':')) { 11264d6c458bSopenharmony_ci return; 11274d6c458bSopenharmony_ci } 11284d6c458bSopenharmony_ci baseData.path.pop_back(); 11294d6c458bSopenharmony_ci } 11304d6c458bSopenharmony_ci 11314d6c458bSopenharmony_ci void InitOnlyInput(std::string& input, UrlData& urlData, 11324d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags) 11334d6c458bSopenharmony_ci { 11344d6c458bSopenharmony_ci if (input.empty()) { 11354d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 11364d6c458bSopenharmony_ci return; 11374d6c458bSopenharmony_ci } 11384d6c458bSopenharmony_ci if (input.find(':') != std::string::npos) { 11394d6c458bSopenharmony_ci size_t pos = input.find(':'); 11404d6c458bSopenharmony_ci pos++; 11414d6c458bSopenharmony_ci std::string scheme = input.substr(0, pos); 11424d6c458bSopenharmony_ci if (!AnalysisScheme(scheme, urlData.scheme, flags)) { 11434d6c458bSopenharmony_ci return; 11444d6c458bSopenharmony_ci } 11454d6c458bSopenharmony_ci if (input.find('#') != std::string::npos) { 11464d6c458bSopenharmony_ci size_t posTmp = input.find('#'); 11474d6c458bSopenharmony_ci std::string fragment = input.substr(posTmp); 11484d6c458bSopenharmony_ci AnalysisFragment(fragment, urlData.fragment, flags); 11494d6c458bSopenharmony_ci input = input.substr(0, posTmp); 11504d6c458bSopenharmony_ci } 11514d6c458bSopenharmony_ci if (input.find('?') != std::string::npos) { 11524d6c458bSopenharmony_ci size_t position = input.find('?'); 11534d6c458bSopenharmony_ci std::string query = input.substr(position); 11544d6c458bSopenharmony_ci AnalysisQuery(query, urlData.query, flags); 11554d6c458bSopenharmony_ci input = input.substr(0, position); 11564d6c458bSopenharmony_ci } 11574d6c458bSopenharmony_ci std::string str = input.substr(pos); 11584d6c458bSopenharmony_ci if (urlData.scheme == "file:") { 11594d6c458bSopenharmony_ci AnalysisFile(str, urlData, flags); 11604d6c458bSopenharmony_ci } else { 11614d6c458bSopenharmony_ci AnalysisHostAndPath(str, urlData, flags); 11624d6c458bSopenharmony_ci } 11634d6c458bSopenharmony_ci } else { 11644d6c458bSopenharmony_ci flags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 11654d6c458bSopenharmony_ci return; 11664d6c458bSopenharmony_ci } 11674d6c458bSopenharmony_ci } 11684d6c458bSopenharmony_ci 11694d6c458bSopenharmony_ci void ToolHasBase(std::string input, std::string &strInput, UrlData &urlData, 11704d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags) 11714d6c458bSopenharmony_ci { 11724d6c458bSopenharmony_ci if (!input.empty() && input[0] == '/') { 11734d6c458bSopenharmony_ci strInput = input.substr(1); 11744d6c458bSopenharmony_ci AnalysisInput(strInput, urlData, flags); 11754d6c458bSopenharmony_ci } else if (!input.empty() && input[0] != '/') { 11764d6c458bSopenharmony_ci AnalysisInput(strInput, urlData, flags); 11774d6c458bSopenharmony_ci } 11784d6c458bSopenharmony_ci } 11794d6c458bSopenharmony_ci 11804d6c458bSopenharmony_ci std::string BasePathToStr(UrlData &urlData) 11814d6c458bSopenharmony_ci { 11824d6c458bSopenharmony_ci std::string temp = ""; 11834d6c458bSopenharmony_ci size_t length = urlData.path.size(); 11844d6c458bSopenharmony_ci for (size_t i = 0; i < length; i++) { 11854d6c458bSopenharmony_ci if (i < length - 1) { 11864d6c458bSopenharmony_ci temp += urlData.path[i] + "/"; 11874d6c458bSopenharmony_ci } else { 11884d6c458bSopenharmony_ci temp += urlData.path[i]; 11894d6c458bSopenharmony_ci } 11904d6c458bSopenharmony_ci } 11914d6c458bSopenharmony_ci return temp; 11924d6c458bSopenharmony_ci } 11934d6c458bSopenharmony_ci 11944d6c458bSopenharmony_ci URL::URL(const std::string& input) 11954d6c458bSopenharmony_ci { 11964d6c458bSopenharmony_ci std::string str = input; 11974d6c458bSopenharmony_ci PreliminaryWork(); 11984d6c458bSopenharmony_ci DeleteC0OrSpace(str); 11994d6c458bSopenharmony_ci DeleteTabOrNewline(str); 12004d6c458bSopenharmony_ci InitOnlyInput(str, urlData_, flags_); 12014d6c458bSopenharmony_ci } 12024d6c458bSopenharmony_ci 12034d6c458bSopenharmony_ci void DelCont(std::string strBase, std::string &strInput, UrlData &baseInfo, 12044d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &baseflags) 12054d6c458bSopenharmony_ci { 12064d6c458bSopenharmony_ci DeleteC0OrSpace(strBase); 12074d6c458bSopenharmony_ci DeleteTabOrNewline(strBase); 12084d6c458bSopenharmony_ci DeleteC0OrSpace(strInput); 12094d6c458bSopenharmony_ci DeleteTabOrNewline(strInput); 12104d6c458bSopenharmony_ci InitOnlyInput(strBase, baseInfo, baseflags); 12114d6c458bSopenharmony_ci } 12124d6c458bSopenharmony_ci 12134d6c458bSopenharmony_ci URL::URL(const std::string& input, const std::string& base) 12144d6c458bSopenharmony_ci { 12154d6c458bSopenharmony_ci UrlData baseInfo; 12164d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> baseflags; 12174d6c458bSopenharmony_ci std::string strBase = base; 12184d6c458bSopenharmony_ci std::string strInput = input; 12194d6c458bSopenharmony_ci if (strBase.empty()) { 12204d6c458bSopenharmony_ci baseflags.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 12214d6c458bSopenharmony_ci } 12224d6c458bSopenharmony_ci DelCont(strBase, strInput, baseInfo, baseflags); 12234d6c458bSopenharmony_ci if (baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 12244d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 12254d6c458bSopenharmony_ci return; 12264d6c458bSopenharmony_ci } else if (!baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 12274d6c458bSopenharmony_ci InitOnlyInput(strInput, urlData_, flags_); 12284d6c458bSopenharmony_ci if (!flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 12294d6c458bSopenharmony_ci return; 12304d6c458bSopenharmony_ci } 12314d6c458bSopenharmony_ci if ((input[0] == '/') && (input[1] == '/' || (input[1] == '\\' && 12324d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT1))))) { 12334d6c458bSopenharmony_ci std::string newInput = baseInfo.scheme + input; 12344d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0), 0); 12354d6c458bSopenharmony_ci InitOnlyInput(newInput, urlData_, flags_); 12364d6c458bSopenharmony_ci return; 12374d6c458bSopenharmony_ci } 12384d6c458bSopenharmony_ci if (!baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT9))) { 12394d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0), 0); 12404d6c458bSopenharmony_ci BaseInfoToUrl(baseInfo, baseflags, urlData_, flags_, input.empty()); 12414d6c458bSopenharmony_ci ToolHasBase(input, strInput, urlData_, flags_); 12424d6c458bSopenharmony_ci if (!input.empty() && input[0] != '/' && urlData_.path.empty()) { 12434d6c458bSopenharmony_ci urlData_.path = baseInfo.path; 12444d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT6), 12454d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT6))); 12464d6c458bSopenharmony_ci } 12474d6c458bSopenharmony_ci if (!input.empty() && input[0] != '/' && !urlData_.path.empty()) { 12484d6c458bSopenharmony_ci bool isFile = ((urlData_.scheme == "file:") ? true : false); 12494d6c458bSopenharmony_ci ShorteningPath(urlData_, baseInfo, isFile); 12504d6c458bSopenharmony_ci std::string basePathStr = BasePathToStr(baseInfo); 12514d6c458bSopenharmony_ci basePathStr == "" ? basePathStr = strInput : basePathStr += "/" + strInput; 12524d6c458bSopenharmony_ci urlData_.path.clear(); 12534d6c458bSopenharmony_ci AnalysisInput(basePathStr, urlData_, flags_); 12544d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 12554d6c458bSopenharmony_ci } 12564d6c458bSopenharmony_ci } else if (baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT9))) { 12574d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 12584d6c458bSopenharmony_ci return; 12594d6c458bSopenharmony_ci } 12604d6c458bSopenharmony_ci } 12614d6c458bSopenharmony_ci } 12624d6c458bSopenharmony_ci 12634d6c458bSopenharmony_ci URL::URL(const std::string& input, const URL& base) 12644d6c458bSopenharmony_ci { 12654d6c458bSopenharmony_ci std::string strInput = input; 12664d6c458bSopenharmony_ci UrlData baseInfo = base.urlData_; 12674d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> baseflags = base.flags_; 12684d6c458bSopenharmony_ci DeleteC0OrSpace(strInput); 12694d6c458bSopenharmony_ci DeleteTabOrNewline(strInput); 12704d6c458bSopenharmony_ci InitOnlyInput(strInput, urlData_, flags_); 12714d6c458bSopenharmony_ci if (!flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 12724d6c458bSopenharmony_ci return; 12734d6c458bSopenharmony_ci } 12744d6c458bSopenharmony_ci if ((input[0] == '/') && (input[1] == '/' || (input[1] == '\\' && 12754d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT1))))) { 12764d6c458bSopenharmony_ci std::string newInput = baseInfo.scheme + input; 12774d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0), 0); 12784d6c458bSopenharmony_ci InitOnlyInput(newInput, urlData_, flags_); 12794d6c458bSopenharmony_ci return; 12804d6c458bSopenharmony_ci } 12814d6c458bSopenharmony_ci if (!baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT9))) { 12824d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0), 0); 12834d6c458bSopenharmony_ci BaseInfoToUrl(baseInfo, baseflags, urlData_, flags_, input.empty()); 12844d6c458bSopenharmony_ci ToolHasBase(input, strInput, urlData_, flags_); 12854d6c458bSopenharmony_ci if (!input.empty() && input[0] != '/' && urlData_.path.empty()) { 12864d6c458bSopenharmony_ci urlData_.path = baseInfo.path; 12874d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT6), 12884d6c458bSopenharmony_ci baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT6))); 12894d6c458bSopenharmony_ci } 12904d6c458bSopenharmony_ci if (!input.empty() && input[0] != '/' && !urlData_.path.empty()) { 12914d6c458bSopenharmony_ci bool isFile = ((urlData_.scheme == "file:") ? true : false); 12924d6c458bSopenharmony_ci ShorteningPath(urlData_, baseInfo, isFile); 12934d6c458bSopenharmony_ci std::string basePathStr = BasePathToStr(baseInfo); 12944d6c458bSopenharmony_ci basePathStr == "" ? basePathStr = strInput : basePathStr += "/" + strInput; 12954d6c458bSopenharmony_ci urlData_.path.clear(); 12964d6c458bSopenharmony_ci AnalysisInput(basePathStr, urlData_, flags_); 12974d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 12984d6c458bSopenharmony_ci } 12994d6c458bSopenharmony_ci } else if (baseflags.test(static_cast<size_t>(BitsetStatusFlag::BIT9))) { 13004d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT0)); 13014d6c458bSopenharmony_ci return; 13024d6c458bSopenharmony_ci } 13034d6c458bSopenharmony_ci } 13044d6c458bSopenharmony_ci 13054d6c458bSopenharmony_ci napi_value URL::GetHostname(napi_env env) const 13064d6c458bSopenharmony_ci { 13074d6c458bSopenharmony_ci napi_value result; 13084d6c458bSopenharmony_ci std::string temp = ""; 13094d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT4))) { 13104d6c458bSopenharmony_ci temp = urlData_.host; 13114d6c458bSopenharmony_ci } 13124d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13134d6c458bSopenharmony_ci return result; 13144d6c458bSopenharmony_ci } 13154d6c458bSopenharmony_ci 13164d6c458bSopenharmony_ci napi_value URL::GetSearch(napi_env env) const 13174d6c458bSopenharmony_ci { 13184d6c458bSopenharmony_ci napi_value result; 13194d6c458bSopenharmony_ci std::string temp = ""; 13204d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT7)) && !(urlData_.query.size() == 1)) { 13214d6c458bSopenharmony_ci temp = urlData_.query; 13224d6c458bSopenharmony_ci } 13234d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13244d6c458bSopenharmony_ci return result; 13254d6c458bSopenharmony_ci } 13264d6c458bSopenharmony_ci 13274d6c458bSopenharmony_ci napi_value URL::GetUsername(napi_env env) const 13284d6c458bSopenharmony_ci { 13294d6c458bSopenharmony_ci napi_value result; 13304d6c458bSopenharmony_ci std::string temp = ""; 13314d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT2))) { 13324d6c458bSopenharmony_ci temp = urlData_.username; 13334d6c458bSopenharmony_ci } 13344d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13354d6c458bSopenharmony_ci return result; 13364d6c458bSopenharmony_ci } 13374d6c458bSopenharmony_ci 13384d6c458bSopenharmony_ci napi_value URL::GetPassword(napi_env env) const 13394d6c458bSopenharmony_ci { 13404d6c458bSopenharmony_ci napi_value result; 13414d6c458bSopenharmony_ci std::string temp = ""; 13424d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT3))) { 13434d6c458bSopenharmony_ci temp = urlData_.password; 13444d6c458bSopenharmony_ci } 13454d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13464d6c458bSopenharmony_ci return result; 13474d6c458bSopenharmony_ci } 13484d6c458bSopenharmony_ci 13494d6c458bSopenharmony_ci napi_value URL::GetFragment(napi_env env) const 13504d6c458bSopenharmony_ci { 13514d6c458bSopenharmony_ci napi_value result; 13524d6c458bSopenharmony_ci std::string temp = ""; 13534d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT8)) && !(urlData_.fragment.size() == 1)) { 13544d6c458bSopenharmony_ci temp = urlData_.fragment; 13554d6c458bSopenharmony_ci } 13564d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13574d6c458bSopenharmony_ci return result; 13584d6c458bSopenharmony_ci } 13594d6c458bSopenharmony_ci 13604d6c458bSopenharmony_ci napi_value URL::GetScheme(napi_env env) const 13614d6c458bSopenharmony_ci { 13624d6c458bSopenharmony_ci napi_value result; 13634d6c458bSopenharmony_ci std::string temp = ""; 13644d6c458bSopenharmony_ci if (!urlData_.scheme.empty()) { 13654d6c458bSopenharmony_ci temp = urlData_.scheme; 13664d6c458bSopenharmony_ci } 13674d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13684d6c458bSopenharmony_ci return result; 13694d6c458bSopenharmony_ci } 13704d6c458bSopenharmony_ci 13714d6c458bSopenharmony_ci napi_value URL::GetPath(napi_env env) const 13724d6c458bSopenharmony_ci { 13734d6c458bSopenharmony_ci napi_value result; 13744d6c458bSopenharmony_ci std::string temp = "/"; 13754d6c458bSopenharmony_ci if (urlData_.isSpecialPath) { 13764d6c458bSopenharmony_ci temp = ""; 13774d6c458bSopenharmony_ci } 13784d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT6))) { 13794d6c458bSopenharmony_ci size_t length = urlData_.path.size(); 13804d6c458bSopenharmony_ci for (size_t i = 0; i < length; i++) { 13814d6c458bSopenharmony_ci if (i < length - 1) { 13824d6c458bSopenharmony_ci temp += urlData_.path[i] + "/"; 13834d6c458bSopenharmony_ci } else { 13844d6c458bSopenharmony_ci temp += urlData_.path[i]; 13854d6c458bSopenharmony_ci } 13864d6c458bSopenharmony_ci } 13874d6c458bSopenharmony_ci } else { 13884d6c458bSopenharmony_ci bool special = IsSpecial(urlData_.scheme); 13894d6c458bSopenharmony_ci if (!special) { 13904d6c458bSopenharmony_ci temp = ""; 13914d6c458bSopenharmony_ci } 13924d6c458bSopenharmony_ci } 13934d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 13944d6c458bSopenharmony_ci return result; 13954d6c458bSopenharmony_ci } 13964d6c458bSopenharmony_ci 13974d6c458bSopenharmony_ci 13984d6c458bSopenharmony_ci napi_value URL::GetPort(napi_env env) const 13994d6c458bSopenharmony_ci { 14004d6c458bSopenharmony_ci napi_value result; 14014d6c458bSopenharmony_ci std::string temp = ""; 14024d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT5))) { 14034d6c458bSopenharmony_ci temp = std::to_string(urlData_.port); 14044d6c458bSopenharmony_ci } 14054d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 14064d6c458bSopenharmony_ci return result; 14074d6c458bSopenharmony_ci } 14084d6c458bSopenharmony_ci 14094d6c458bSopenharmony_ci napi_value URL::GetHost(napi_env env) const 14104d6c458bSopenharmony_ci { 14114d6c458bSopenharmony_ci napi_value result; 14124d6c458bSopenharmony_ci std::string temp = urlData_.host; 14134d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT5))) { 14144d6c458bSopenharmony_ci temp += ":"; 14154d6c458bSopenharmony_ci temp += std::to_string(urlData_.port); 14164d6c458bSopenharmony_ci } 14174d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), temp.size(), &result)); 14184d6c458bSopenharmony_ci return result; 14194d6c458bSopenharmony_ci } 14204d6c458bSopenharmony_ci 14214d6c458bSopenharmony_ci napi_value URL::GetOnOrOff(napi_env env) const 14224d6c458bSopenharmony_ci { 14234d6c458bSopenharmony_ci napi_value result; 14244d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 14254d6c458bSopenharmony_ci bool flag = false; 14264d6c458bSopenharmony_ci NAPI_CALL(env, napi_get_boolean(env, flag, &result)); 14274d6c458bSopenharmony_ci } else { 14284d6c458bSopenharmony_ci bool flag = true; 14294d6c458bSopenharmony_ci NAPI_CALL(env, napi_get_boolean(env, flag, &result)); 14304d6c458bSopenharmony_ci } 14314d6c458bSopenharmony_ci return result; 14324d6c458bSopenharmony_ci } 14334d6c458bSopenharmony_ci 14344d6c458bSopenharmony_ci napi_value URL::GetIsIpv6(napi_env env) const 14354d6c458bSopenharmony_ci { 14364d6c458bSopenharmony_ci napi_value result; 14374d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT10))) { 14384d6c458bSopenharmony_ci NAPI_CALL(env, napi_get_boolean(env, true, &result)); 14394d6c458bSopenharmony_ci } else { 14404d6c458bSopenharmony_ci NAPI_CALL(env, napi_get_boolean(env, false, &result)); 14414d6c458bSopenharmony_ci } 14424d6c458bSopenharmony_ci return result; 14434d6c458bSopenharmony_ci } 14444d6c458bSopenharmony_ci 14454d6c458bSopenharmony_ci void URL::SetHostname(const std::string& input) 14464d6c458bSopenharmony_ci { 14474d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT9))) { 14484d6c458bSopenharmony_ci return; 14494d6c458bSopenharmony_ci } 14504d6c458bSopenharmony_ci std::string strHost = input; 14514d6c458bSopenharmony_ci size_t length = strHost.size(); 14524d6c458bSopenharmony_ci for (size_t pos = 0; pos < length; pos++) { 14534d6c458bSopenharmony_ci if ((strHost[pos] == ':') || (strHost[pos] == '?') || (strHost[pos] == '#') || 14544d6c458bSopenharmony_ci (strHost[pos] == '/') || (strHost[pos] == '\\')) { 14554d6c458bSopenharmony_ci strHost = strHost.substr(0, pos); 14564d6c458bSopenharmony_ci break; 14574d6c458bSopenharmony_ci } 14584d6c458bSopenharmony_ci } 14594d6c458bSopenharmony_ci if (strHost.size() == 0) { 14604d6c458bSopenharmony_ci return; 14614d6c458bSopenharmony_ci } 14624d6c458bSopenharmony_ci bool special = IsSpecial(urlData_.scheme); 14634d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisFlags; 14644d6c458bSopenharmony_ci std::string thisHostname = ""; 14654d6c458bSopenharmony_ci AnalysisHost(strHost, thisHostname, thisFlags, special); 14664d6c458bSopenharmony_ci if (thisFlags.test(static_cast<size_t>(BitsetStatusFlag::BIT4))) { 14674d6c458bSopenharmony_ci if ((urlData_.scheme == "file:") && (thisHostname == "localhost")) { 14684d6c458bSopenharmony_ci thisHostname = ""; 14694d6c458bSopenharmony_ci } 14704d6c458bSopenharmony_ci urlData_.host = thisHostname; 14714d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 14724d6c458bSopenharmony_ci } 14734d6c458bSopenharmony_ci } 14744d6c458bSopenharmony_ci 14754d6c458bSopenharmony_ci void URL::SetHref(const std::string& input) 14764d6c458bSopenharmony_ci { 14774d6c458bSopenharmony_ci std::string str = input; 14784d6c458bSopenharmony_ci DeleteC0OrSpace(str); 14794d6c458bSopenharmony_ci DeleteTabOrNewline(str); 14804d6c458bSopenharmony_ci UrlData thisNewUrl; 14814d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisNewFlags; 14824d6c458bSopenharmony_ci InitOnlyInput(str, thisNewUrl, thisNewFlags); 14834d6c458bSopenharmony_ci if (!thisNewFlags.test(static_cast<size_t>(BitsetStatusFlag::BIT0))) { 14844d6c458bSopenharmony_ci urlData_ = thisNewUrl; 14854d6c458bSopenharmony_ci flags_ = thisNewFlags; 14864d6c458bSopenharmony_ci } 14874d6c458bSopenharmony_ci } 14884d6c458bSopenharmony_ci 14894d6c458bSopenharmony_ci void URL::SetPath(const std::string& input) 14904d6c458bSopenharmony_ci { 14914d6c458bSopenharmony_ci std::string strPath = input; 14924d6c458bSopenharmony_ci if (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT9)) || strPath.empty()) { 14934d6c458bSopenharmony_ci return; 14944d6c458bSopenharmony_ci } 14954d6c458bSopenharmony_ci std::string oldstr = "%3A"; 14964d6c458bSopenharmony_ci std::string newstr = ":"; 14974d6c458bSopenharmony_ci ReplaceSpecialSymbols(strPath, oldstr, newstr); 14984d6c458bSopenharmony_ci bool special = IsSpecial(urlData_.scheme); 14994d6c458bSopenharmony_ci if (urlData_.scheme == "file:") { 15004d6c458bSopenharmony_ci UrlData thisFileDate; 15014d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisFileFlag; 15024d6c458bSopenharmony_ci if ((strPath[0] == '/') || (strPath[0] == '\\' && 15034d6c458bSopenharmony_ci flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT1)))) { 15044d6c458bSopenharmony_ci strPath = strPath.substr(1); 15054d6c458bSopenharmony_ci } 15064d6c458bSopenharmony_ci AnalysisFilePath(strPath, thisFileDate, thisFileFlag); 15074d6c458bSopenharmony_ci if (thisFileFlag.test(static_cast<size_t>(BitsetStatusFlag::BIT6))) { 15084d6c458bSopenharmony_ci urlData_.path = thisFileDate.path; 15094d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 15104d6c458bSopenharmony_ci } 15114d6c458bSopenharmony_ci } else { 15124d6c458bSopenharmony_ci std::vector<std::string> thisPath; 15134d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisFlags; 15144d6c458bSopenharmony_ci if ((strPath[0] == '/') || (strPath[0] == '\\' && 15154d6c458bSopenharmony_ci flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT1)))) { 15164d6c458bSopenharmony_ci strPath = strPath.substr(1); 15174d6c458bSopenharmony_ci } 15184d6c458bSopenharmony_ci AnalysisPath(strPath, thisPath, thisFlags, special); 15194d6c458bSopenharmony_ci if (thisFlags.test(static_cast<size_t>(BitsetStatusFlag::BIT6))) { 15204d6c458bSopenharmony_ci urlData_.path = thisPath; 15214d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT6)); 15224d6c458bSopenharmony_ci } 15234d6c458bSopenharmony_ci } 15244d6c458bSopenharmony_ci } 15254d6c458bSopenharmony_ci 15264d6c458bSopenharmony_ci void SplitString(const std::string& input, std::string& strHost, std::string& port) 15274d6c458bSopenharmony_ci { 15284d6c458bSopenharmony_ci size_t strlen = input.size(); 15294d6c458bSopenharmony_ci for (size_t pos = 0; pos < strlen; pos++) { 15304d6c458bSopenharmony_ci if ((input[pos] == ':') || (input[pos] == '?') || (input[pos] == '#') || 15314d6c458bSopenharmony_ci (input[pos] == '/') || (input[pos] == '\\')) { 15324d6c458bSopenharmony_ci strHost = input.substr(0, pos); 15334d6c458bSopenharmony_ci if (input[pos] == ':') { 15344d6c458bSopenharmony_ci pos++; 15354d6c458bSopenharmony_ci port = input.substr(pos); 15364d6c458bSopenharmony_ci } 15374d6c458bSopenharmony_ci break; 15384d6c458bSopenharmony_ci } 15394d6c458bSopenharmony_ci } 15404d6c458bSopenharmony_ci } 15414d6c458bSopenharmony_ci 15424d6c458bSopenharmony_ci void URL::SetHost(const std::string& input) 15434d6c458bSopenharmony_ci { 15444d6c458bSopenharmony_ci if (input.empty() || flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT9))) { 15454d6c458bSopenharmony_ci return; 15464d6c458bSopenharmony_ci } 15474d6c458bSopenharmony_ci std::string strHost = input; 15484d6c458bSopenharmony_ci std::string port = ""; 15494d6c458bSopenharmony_ci SplitString(input, strHost, port); 15504d6c458bSopenharmony_ci if (strHost.size() == 0) { 15514d6c458bSopenharmony_ci return; 15524d6c458bSopenharmony_ci } 15534d6c458bSopenharmony_ci bool special = IsSpecial(urlData_.scheme); 15544d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> hostnameflags; 15554d6c458bSopenharmony_ci std::string thisHostname = ""; 15564d6c458bSopenharmony_ci AnalysisHost(strHost, thisHostname, hostnameflags, special); 15574d6c458bSopenharmony_ci if (hostnameflags.test(static_cast<size_t>(BitsetStatusFlag::BIT4))) { 15584d6c458bSopenharmony_ci if ((urlData_.scheme == "file:") && (thisHostname == "localhost")) { 15594d6c458bSopenharmony_ci thisHostname = ""; 15604d6c458bSopenharmony_ci } 15614d6c458bSopenharmony_ci urlData_.host = thisHostname; 15624d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT4)); 15634d6c458bSopenharmony_ci } else { 15644d6c458bSopenharmony_ci return; 15654d6c458bSopenharmony_ci } 15664d6c458bSopenharmony_ci if (port.size() > 0) { 15674d6c458bSopenharmony_ci size_t strlen = port.size(); 15684d6c458bSopenharmony_ci for (size_t pos = 0; pos < strlen; pos++) { 15694d6c458bSopenharmony_ci if ((port[pos] == '?') || (port[pos] == '#') || (port[pos] == '/') || (port[pos] == '\\')) { 15704d6c458bSopenharmony_ci port = port.substr(0, pos); 15714d6c458bSopenharmony_ci break; 15724d6c458bSopenharmony_ci } 15734d6c458bSopenharmony_ci } 15744d6c458bSopenharmony_ci if (port.size() > 0) { 15754d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisFlags; 15764d6c458bSopenharmony_ci UrlData thisport; 15774d6c458bSopenharmony_ci AnalysisPort(port, thisport, thisFlags); 15784d6c458bSopenharmony_ci if (thisFlags.test(static_cast<size_t>(BitsetStatusFlag::BIT5))) { 15794d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT5)); 15804d6c458bSopenharmony_ci urlData_.port = thisport.port; 15814d6c458bSopenharmony_ci } 15824d6c458bSopenharmony_ci } 15834d6c458bSopenharmony_ci } 15844d6c458bSopenharmony_ci } 15854d6c458bSopenharmony_ci 15864d6c458bSopenharmony_ci void URL::SetPort(const std::string& input) 15874d6c458bSopenharmony_ci { 15884d6c458bSopenharmony_ci std::string port = input; 15894d6c458bSopenharmony_ci size_t portlen = port.size(); 15904d6c458bSopenharmony_ci for (size_t pos = 0; pos < portlen; pos++) { 15914d6c458bSopenharmony_ci if ((port[pos] == '?') || (port[pos] == '#') || (port[pos] == '/') || (port[pos] == '\\')) { 15924d6c458bSopenharmony_ci port = port.substr(0, pos); 15934d6c458bSopenharmony_ci break; 15944d6c458bSopenharmony_ci } 15954d6c458bSopenharmony_ci } 15964d6c458bSopenharmony_ci if (port.size() > 0) { 15974d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisFlags; 15984d6c458bSopenharmony_ci UrlData thisport; 15994d6c458bSopenharmony_ci AnalysisPort(port, thisport, thisFlags); 16004d6c458bSopenharmony_ci if (thisFlags.test(static_cast<size_t>(BitsetStatusFlag::BIT5))) { 16014d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT5)); 16024d6c458bSopenharmony_ci urlData_.port = thisport.port; 16034d6c458bSopenharmony_ci } 16044d6c458bSopenharmony_ci } 16054d6c458bSopenharmony_ci } 16064d6c458bSopenharmony_ci 16074d6c458bSopenharmony_ci void URL::SetSearch(const std::string& input) 16084d6c458bSopenharmony_ci { 16094d6c458bSopenharmony_ci std::string temp; 16104d6c458bSopenharmony_ci if (input.size() == 0) { 16114d6c458bSopenharmony_ci urlData_.query = ""; 16124d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT7), 0); 16134d6c458bSopenharmony_ci } else { 16144d6c458bSopenharmony_ci if (input[0] != '?') { 16154d6c458bSopenharmony_ci temp = "?"; 16164d6c458bSopenharmony_ci temp += input; 16174d6c458bSopenharmony_ci } else { 16184d6c458bSopenharmony_ci temp = input; 16194d6c458bSopenharmony_ci } 16204d6c458bSopenharmony_ci std::string oldstr = "#"; 16214d6c458bSopenharmony_ci std::string newstr = "%23"; 16224d6c458bSopenharmony_ci ReplaceSpecialSymbols(temp, oldstr, newstr); 16234d6c458bSopenharmony_ci AnalysisQuery(temp, urlData_.query, flags_); 16244d6c458bSopenharmony_ci } 16254d6c458bSopenharmony_ci } 16264d6c458bSopenharmony_ci 16274d6c458bSopenharmony_ci void URL::SetFragment(const std::string& input) 16284d6c458bSopenharmony_ci { 16294d6c458bSopenharmony_ci std::string temp; 16304d6c458bSopenharmony_ci if (input.size() == 0) { 16314d6c458bSopenharmony_ci urlData_.fragment = ""; 16324d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT8), 0); 16334d6c458bSopenharmony_ci } else { 16344d6c458bSopenharmony_ci if (input[0] != '#') { 16354d6c458bSopenharmony_ci temp = "#"; 16364d6c458bSopenharmony_ci temp += input; 16374d6c458bSopenharmony_ci } else { 16384d6c458bSopenharmony_ci temp = input; 16394d6c458bSopenharmony_ci } 16404d6c458bSopenharmony_ci AnalysisFragment(temp, urlData_.fragment, flags_); 16414d6c458bSopenharmony_ci } 16424d6c458bSopenharmony_ci } 16434d6c458bSopenharmony_ci 16444d6c458bSopenharmony_ci void URL::SetScheme(const std::string& input) 16454d6c458bSopenharmony_ci { 16464d6c458bSopenharmony_ci std::string strInput = input; 16474d6c458bSopenharmony_ci bool special = IsSpecial(urlData_.scheme); 16484d6c458bSopenharmony_ci bool inputIsSpecial = IsSpecial(input); 16494d6c458bSopenharmony_ci if ((special != inputIsSpecial) || ((input == "file") && 16504d6c458bSopenharmony_ci (flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT2)) || 16514d6c458bSopenharmony_ci flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT3)) || 16524d6c458bSopenharmony_ci flags_.test(static_cast<size_t>(BitsetStatusFlag::BIT5))))) { 16534d6c458bSopenharmony_ci return; 16544d6c458bSopenharmony_ci } 16554d6c458bSopenharmony_ci std::string thisScheme = ""; 16564d6c458bSopenharmony_ci std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> thisFlags; 16574d6c458bSopenharmony_ci if (AnalysisScheme(strInput, thisScheme, thisFlags)) { 16584d6c458bSopenharmony_ci if (thisFlags.test(static_cast<size_t>(BitsetStatusFlag::BIT1))) { 16594d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT1)); 16604d6c458bSopenharmony_ci } 16614d6c458bSopenharmony_ci urlData_.scheme = thisScheme; 16624d6c458bSopenharmony_ci } 16634d6c458bSopenharmony_ci } 16644d6c458bSopenharmony_ci 16654d6c458bSopenharmony_ci void URL::SetUsername(const std::string& input) 16664d6c458bSopenharmony_ci { 16674d6c458bSopenharmony_ci if (input.size() == 0) { 16684d6c458bSopenharmony_ci urlData_.username = ""; 16694d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT2), 0); 16704d6c458bSopenharmony_ci } else { 16714d6c458bSopenharmony_ci std::string usname = input; 16724d6c458bSopenharmony_ci size_t len = g_specialSymbols.size() - 2; // 2:Maximum position of subscript 16734d6c458bSopenharmony_ci for (size_t i = 0; i <= len; i += 2) { // 2:Shift subscript right 2 16744d6c458bSopenharmony_ci ReplaceSpecialSymbols(usname, g_specialSymbols[i], g_specialSymbols[i + 1]); 16754d6c458bSopenharmony_ci } 16764d6c458bSopenharmony_ci urlData_.username = usname; 16774d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT2)); 16784d6c458bSopenharmony_ci } 16794d6c458bSopenharmony_ci } 16804d6c458bSopenharmony_ci 16814d6c458bSopenharmony_ci void URL::SetPassword(const std::string& input) 16824d6c458bSopenharmony_ci { 16834d6c458bSopenharmony_ci if (input.size() == 0) { 16844d6c458bSopenharmony_ci urlData_.password = ""; 16854d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT3), 0); 16864d6c458bSopenharmony_ci } else { 16874d6c458bSopenharmony_ci std::string keyWord = input; 16884d6c458bSopenharmony_ci size_t len = g_specialSymbols.size() - 2; // 2:Maximum position of subscript 16894d6c458bSopenharmony_ci for (size_t i = 0; i <= len; i += 2) { // 2:Shift subscript right 2 16904d6c458bSopenharmony_ci ReplaceSpecialSymbols(keyWord, g_specialSymbols[i], g_specialSymbols[i + 1]); 16914d6c458bSopenharmony_ci } 16924d6c458bSopenharmony_ci urlData_.password = keyWord; 16934d6c458bSopenharmony_ci flags_.set(static_cast<size_t>(BitsetStatusFlag::BIT3)); 16944d6c458bSopenharmony_ci } 16954d6c458bSopenharmony_ci } 16964d6c458bSopenharmony_ci 16974d6c458bSopenharmony_ci bool ContainsWideOrUnicodeChars(const std::string& str) 16984d6c458bSopenharmony_ci { 16994d6c458bSopenharmony_ci for (char c : str) { 17004d6c458bSopenharmony_ci if (static_cast<unsigned char>(c) > 127) { // 127:Value range for non ASCII characters 17014d6c458bSopenharmony_ci return true; 17024d6c458bSopenharmony_ci } 17034d6c458bSopenharmony_ci } 17044d6c458bSopenharmony_ci return false; 17054d6c458bSopenharmony_ci } 17064d6c458bSopenharmony_ci 17074d6c458bSopenharmony_ci void URLSearchParams::HandleIllegalChar(std::wstring& inputStr, std::wstring::const_iterator it) 17084d6c458bSopenharmony_ci { 17094d6c458bSopenharmony_ci std::wstring::iterator iter = inputStr.begin(); 17104d6c458bSopenharmony_ci advance(iter, std::distance<std::wstring::const_iterator>(iter, it)); 17114d6c458bSopenharmony_ci while (iter != inputStr.end()) { 17124d6c458bSopenharmony_ci char16_t ch = *iter; 17134d6c458bSopenharmony_ci if (!((ch & 0xF800) == 0xD800)) { 17144d6c458bSopenharmony_ci ++iter; 17154d6c458bSopenharmony_ci continue; 17164d6c458bSopenharmony_ci } else if ((ch & 0x400) != 0 || iter == inputStr.end() - 1) { 17174d6c458bSopenharmony_ci *iter = 0xFFFD; 17184d6c458bSopenharmony_ci } else { 17194d6c458bSopenharmony_ci char16_t dh = *(iter + 1); 17204d6c458bSopenharmony_ci if ((dh & 0xFC00) == 0xDC00) { 17214d6c458bSopenharmony_ci ++iter; 17224d6c458bSopenharmony_ci } else { 17234d6c458bSopenharmony_ci *iter = 0xFFFD; 17244d6c458bSopenharmony_ci } 17254d6c458bSopenharmony_ci } 17264d6c458bSopenharmony_ci ++iter; 17274d6c458bSopenharmony_ci } 17284d6c458bSopenharmony_ci } 17294d6c458bSopenharmony_ci std::string URLSearchParams::ToUSVString(std::string inputStr) 17304d6c458bSopenharmony_ci { 17314d6c458bSopenharmony_ci std::wstring winput(inputStr.length(), L' '); 17324d6c458bSopenharmony_ci std::copy(inputStr.begin(), inputStr.end(), winput.begin()); 17334d6c458bSopenharmony_ci std::wregex wexpr(L"(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])"); 17344d6c458bSopenharmony_ci std::wsmatch result; 17354d6c458bSopenharmony_ci std::wstring::const_iterator iterStart = winput.begin(); 17364d6c458bSopenharmony_ci std::wstring::const_iterator iterEnd = winput.end(); 17374d6c458bSopenharmony_ci if (!regex_search(iterStart, iterEnd, result, wexpr)) { 17384d6c458bSopenharmony_ci return inputStr; 17394d6c458bSopenharmony_ci } 17404d6c458bSopenharmony_ci HandleIllegalChar(winput, result[0].first); 17414d6c458bSopenharmony_ci size_t inputLen = wcslen(winput.c_str()); 17424d6c458bSopenharmony_ci char *rePtr = nullptr; 17434d6c458bSopenharmony_ci std::string reStr = ""; 17444d6c458bSopenharmony_ci size_t reSize = wcstombs(rePtr, winput.c_str(), 0) + 1; 17454d6c458bSopenharmony_ci if (reSize > 0) { 17464d6c458bSopenharmony_ci rePtr = new (std::nothrow) char[reSize]; 17474d6c458bSopenharmony_ci if (rePtr == nullptr) { 17484d6c458bSopenharmony_ci HILOG_ERROR("URLSearchParams:: rePtr is nullptr"); 17494d6c458bSopenharmony_ci return reStr; 17504d6c458bSopenharmony_ci } 17514d6c458bSopenharmony_ci if (memset_s(rePtr, reSize, 0, reSize) != EOK) { 17524d6c458bSopenharmony_ci HILOG_ERROR("ToUSVString memset_s failed"); 17534d6c458bSopenharmony_ci delete[] rePtr; 17544d6c458bSopenharmony_ci return reStr; 17554d6c458bSopenharmony_ci } else { 17564d6c458bSopenharmony_ci wcstombs(rePtr, winput.c_str(), inputLen); 17574d6c458bSopenharmony_ci reStr = rePtr; 17584d6c458bSopenharmony_ci } 17594d6c458bSopenharmony_ci } 17604d6c458bSopenharmony_ci delete[] rePtr; 17614d6c458bSopenharmony_ci return reStr; 17624d6c458bSopenharmony_ci } 17634d6c458bSopenharmony_ci napi_value URLSearchParams::Get(napi_env env, napi_value buffer) 17644d6c458bSopenharmony_ci { 17654d6c458bSopenharmony_ci std::string name = ""; 17664d6c458bSopenharmony_ci size_t nameSize = 0; 17674d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { 17684d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer size"); 17694d6c458bSopenharmony_ci return nullptr; 17704d6c458bSopenharmony_ci } 17714d6c458bSopenharmony_ci name.reserve(nameSize); 17724d6c458bSopenharmony_ci name.resize(nameSize); 17734d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { 17744d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer value"); 17754d6c458bSopenharmony_ci return nullptr; 17764d6c458bSopenharmony_ci } 17774d6c458bSopenharmony_ci std::string sname = name; 17784d6c458bSopenharmony_ci if (ContainsWideOrUnicodeChars(name)) { 17794d6c458bSopenharmony_ci sname = ToUSVString(name); 17804d6c458bSopenharmony_ci } 17814d6c458bSopenharmony_ci napi_value result = nullptr; 17824d6c458bSopenharmony_ci if (searchParams.size() == 0) { 17834d6c458bSopenharmony_ci return result; 17844d6c458bSopenharmony_ci } 17854d6c458bSopenharmony_ci size_t size = searchParams.size() - 1; 17864d6c458bSopenharmony_ci for (size_t i = 0; i < size; i += 2) { // 2:Searching for the number and number of keys and values 17874d6c458bSopenharmony_ci if (searchParams[i] == sname) { 17884d6c458bSopenharmony_ci napi_create_string_utf8(env, searchParams[i + 1].c_str(), searchParams[i + 1].length(), &result); 17894d6c458bSopenharmony_ci return result; 17904d6c458bSopenharmony_ci } 17914d6c458bSopenharmony_ci } 17924d6c458bSopenharmony_ci return result; 17934d6c458bSopenharmony_ci } 17944d6c458bSopenharmony_ci napi_value URLSearchParams::GetAll(napi_env env, napi_value buffer) 17954d6c458bSopenharmony_ci { 17964d6c458bSopenharmony_ci std::string name = ""; 17974d6c458bSopenharmony_ci size_t nameSize = 0; 17984d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { 17994d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer size"); 18004d6c458bSopenharmony_ci return nullptr; 18014d6c458bSopenharmony_ci } 18024d6c458bSopenharmony_ci name.reserve(nameSize); 18034d6c458bSopenharmony_ci name.resize(nameSize); 18044d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { 18054d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer value"); 18064d6c458bSopenharmony_ci return nullptr; 18074d6c458bSopenharmony_ci } 18084d6c458bSopenharmony_ci std::string sname = name; 18094d6c458bSopenharmony_ci if (ContainsWideOrUnicodeChars(name)) { 18104d6c458bSopenharmony_ci sname = ToUSVString(name); 18114d6c458bSopenharmony_ci } 18124d6c458bSopenharmony_ci napi_value result = nullptr; 18134d6c458bSopenharmony_ci napi_value napiStr = nullptr; 18144d6c458bSopenharmony_ci NAPI_CALL(env, napi_create_array(env, &result)); 18154d6c458bSopenharmony_ci size_t flag = 0; 18164d6c458bSopenharmony_ci if (searchParams.size() == 0) { 18174d6c458bSopenharmony_ci return result; 18184d6c458bSopenharmony_ci } 18194d6c458bSopenharmony_ci size_t size = searchParams.size() - 1; 18204d6c458bSopenharmony_ci for (size_t i = 0; i < size; i += 2) { // 2:Searching for the number and number of keys and values 18214d6c458bSopenharmony_ci if (searchParams[i] == sname) { 18224d6c458bSopenharmony_ci napi_create_string_utf8(env, searchParams[i + 1].c_str(), searchParams[i + 1].length(), &napiStr); 18234d6c458bSopenharmony_ci NAPI_CALL(env, napi_set_element(env, result, flag, napiStr)); 18244d6c458bSopenharmony_ci flag++; 18254d6c458bSopenharmony_ci } 18264d6c458bSopenharmony_ci } 18274d6c458bSopenharmony_ci return result; 18284d6c458bSopenharmony_ci } 18294d6c458bSopenharmony_ci void URLSearchParams::Append(napi_env env, napi_value buffer, napi_value temp) 18304d6c458bSopenharmony_ci { 18314d6c458bSopenharmony_ci std::string name = ""; 18324d6c458bSopenharmony_ci size_t nameSize = 0; 18334d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { 18344d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer size"); 18354d6c458bSopenharmony_ci return; 18364d6c458bSopenharmony_ci } 18374d6c458bSopenharmony_ci name.reserve(nameSize); 18384d6c458bSopenharmony_ci name.resize(nameSize); 18394d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { 18404d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer value"); 18414d6c458bSopenharmony_ci return; 18424d6c458bSopenharmony_ci } 18434d6c458bSopenharmony_ci std::string tempName = name; 18444d6c458bSopenharmony_ci std::string value = ""; 18454d6c458bSopenharmony_ci size_t valueSize = 0; 18464d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, temp, nullptr, 0, &valueSize) != napi_ok) { 18474d6c458bSopenharmony_ci HILOG_ERROR("can not get temp size"); 18484d6c458bSopenharmony_ci return; 18494d6c458bSopenharmony_ci } 18504d6c458bSopenharmony_ci value.reserve(valueSize); 18514d6c458bSopenharmony_ci value.resize(valueSize); 18524d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, temp, value.data(), valueSize + 1, &valueSize) != napi_ok) { 18534d6c458bSopenharmony_ci HILOG_ERROR("can not get temp value"); 18544d6c458bSopenharmony_ci return; 18554d6c458bSopenharmony_ci } 18564d6c458bSopenharmony_ci std::string tempValue = value; 18574d6c458bSopenharmony_ci searchParams.push_back(tempName); 18584d6c458bSopenharmony_ci searchParams.push_back(tempValue); 18594d6c458bSopenharmony_ci } 18604d6c458bSopenharmony_ci void URLSearchParams::Delete(napi_env env, napi_value buffer) 18614d6c458bSopenharmony_ci { 18624d6c458bSopenharmony_ci std::string name = ""; 18634d6c458bSopenharmony_ci size_t nameSize = 0; 18644d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { 18654d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer size"); 18664d6c458bSopenharmony_ci return; 18674d6c458bSopenharmony_ci } 18684d6c458bSopenharmony_ci name.reserve(nameSize); 18694d6c458bSopenharmony_ci name.resize(nameSize); 18704d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { 18714d6c458bSopenharmony_ci HILOG_ERROR("can not get buffer value"); 18724d6c458bSopenharmony_ci return; 18734d6c458bSopenharmony_ci } 18744d6c458bSopenharmony_ci std::string sname = name; 18754d6c458bSopenharmony_ci if (ContainsWideOrUnicodeChars(name)) { 18764d6c458bSopenharmony_ci sname = ToUSVString(name); 18774d6c458bSopenharmony_ci } 18784d6c458bSopenharmony_ci for (auto iter = searchParams.begin(); iter != searchParams.end();) { 18794d6c458bSopenharmony_ci if (*iter == sname) { 18804d6c458bSopenharmony_ci iter = searchParams.erase(iter, iter + 2); // 2:Searching for the number and number of keys and values 18814d6c458bSopenharmony_ci } else { 18824d6c458bSopenharmony_ci iter += 2; // 2:Searching for the number and number of keys and values 18834d6c458bSopenharmony_ci } 18844d6c458bSopenharmony_ci } 18854d6c458bSopenharmony_ci } 18864d6c458bSopenharmony_ci napi_value URLSearchParams::Entries(napi_env env) const 18874d6c458bSopenharmony_ci { 18884d6c458bSopenharmony_ci napi_value resend = nullptr; 18894d6c458bSopenharmony_ci napi_value firNapiStr = nullptr; 18904d6c458bSopenharmony_ci napi_value secNapiStr = nullptr; 18914d6c458bSopenharmony_ci napi_create_array(env, &resend); 18924d6c458bSopenharmony_ci if (searchParams.size() == 0) { 18934d6c458bSopenharmony_ci return resend; 18944d6c458bSopenharmony_ci } 18954d6c458bSopenharmony_ci size_t size = searchParams.size() - 1; 18964d6c458bSopenharmony_ci for (size_t i = 0; i < size; i += 2) { // 2:Searching for the number and number of keys and values 18974d6c458bSopenharmony_ci napi_value result = nullptr; 18984d6c458bSopenharmony_ci napi_create_array(env, &result); 18994d6c458bSopenharmony_ci napi_create_string_utf8(env, searchParams[i].c_str(), searchParams[i].length(), &firNapiStr); 19004d6c458bSopenharmony_ci napi_create_string_utf8(env, searchParams[i + 1].c_str(), searchParams[i + 1].length(), &secNapiStr); 19014d6c458bSopenharmony_ci napi_set_element(env, result, 0, firNapiStr); 19024d6c458bSopenharmony_ci napi_set_element(env, result, 1, secNapiStr); 19034d6c458bSopenharmony_ci napi_set_element(env, resend, i / 2, result); // 2:Find the number of keys 19044d6c458bSopenharmony_ci } 19054d6c458bSopenharmony_ci return resend; 19064d6c458bSopenharmony_ci } 19074d6c458bSopenharmony_ci 19084d6c458bSopenharmony_ci napi_value URLSearchParams::IsHas(napi_env env, napi_value name) const 19094d6c458bSopenharmony_ci { 19104d6c458bSopenharmony_ci size_t bufferSize = 0; 19114d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { 19124d6c458bSopenharmony_ci HILOG_ERROR("can not get name size"); 19134d6c458bSopenharmony_ci return nullptr; 19144d6c458bSopenharmony_ci } 19154d6c458bSopenharmony_ci std::string buf = ""; 19164d6c458bSopenharmony_ci buf.resize(bufferSize); 19174d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, name, buf.data(), bufferSize + 1, &bufferSize) != napi_ok) { 19184d6c458bSopenharmony_ci HILOG_ERROR("can not get name value"); 19194d6c458bSopenharmony_ci return nullptr; 19204d6c458bSopenharmony_ci } 19214d6c458bSopenharmony_ci bool flag = false; 19224d6c458bSopenharmony_ci napi_value result = nullptr; 19234d6c458bSopenharmony_ci size_t lenStr = searchParams.size(); 19244d6c458bSopenharmony_ci for (size_t i = 0; i != lenStr; i += 2) { // 2:Searching for the number and number of keys and values 19254d6c458bSopenharmony_ci if (searchParams[i] == buf) { 19264d6c458bSopenharmony_ci flag = true; 19274d6c458bSopenharmony_ci napi_get_boolean(env, flag, &result); 19284d6c458bSopenharmony_ci return result; 19294d6c458bSopenharmony_ci } 19304d6c458bSopenharmony_ci } 19314d6c458bSopenharmony_ci napi_get_boolean(env, flag, &result); 19324d6c458bSopenharmony_ci return result; 19334d6c458bSopenharmony_ci } 19344d6c458bSopenharmony_ci void URLSearchParams::Set(napi_env env, napi_value name, napi_value value) 19354d6c458bSopenharmony_ci { 19364d6c458bSopenharmony_ci std::string buffer = ""; 19374d6c458bSopenharmony_ci size_t bufferSize = 0; 19384d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { 19394d6c458bSopenharmony_ci HILOG_ERROR("can not get name size"); 19404d6c458bSopenharmony_ci return; 19414d6c458bSopenharmony_ci } 19424d6c458bSopenharmony_ci buffer.reserve(bufferSize); 19434d6c458bSopenharmony_ci buffer.resize(bufferSize); 19444d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, name, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { 19454d6c458bSopenharmony_ci HILOG_ERROR("can not get name value"); 19464d6c458bSopenharmony_ci return; 19474d6c458bSopenharmony_ci } 19484d6c458bSopenharmony_ci std::string cppName = buffer; 19494d6c458bSopenharmony_ci std::string temp = ""; 19504d6c458bSopenharmony_ci size_t tempSize = 0; 19514d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, value, nullptr, 0, &tempSize) != napi_ok) { 19524d6c458bSopenharmony_ci HILOG_ERROR("can not get value size"); 19534d6c458bSopenharmony_ci return; 19544d6c458bSopenharmony_ci } 19554d6c458bSopenharmony_ci temp.reserve(tempSize); 19564d6c458bSopenharmony_ci temp.resize(tempSize); 19574d6c458bSopenharmony_ci if (napi_get_value_string_utf8(env, value, temp.data(), tempSize + 1, &tempSize) != napi_ok) { 19584d6c458bSopenharmony_ci HILOG_ERROR("can not get value value"); 19594d6c458bSopenharmony_ci return; 19604d6c458bSopenharmony_ci } 19614d6c458bSopenharmony_ci std::string cppValue = temp; 19624d6c458bSopenharmony_ci bool flag = false; 19634d6c458bSopenharmony_ci for (auto it = searchParams.begin(); it < (searchParams.end() - 1) && !searchParams.empty();) { 19644d6c458bSopenharmony_ci if (*it == cppName) { 19654d6c458bSopenharmony_ci if (!flag) { 19664d6c458bSopenharmony_ci *(it + 1) = cppValue; 19674d6c458bSopenharmony_ci flag = true; 19684d6c458bSopenharmony_ci it += 2; // 2:Searching for the number and number of keys and values 19694d6c458bSopenharmony_ci } else { 19704d6c458bSopenharmony_ci it = searchParams.erase(it, it + 2); // 2:Searching for the number and number of keys and values 19714d6c458bSopenharmony_ci } 19724d6c458bSopenharmony_ci } else { 19734d6c458bSopenharmony_ci it += 2; // 2:Searching for the number and number of keys and values 19744d6c458bSopenharmony_ci } 19754d6c458bSopenharmony_ci } 19764d6c458bSopenharmony_ci if (!flag) { 19774d6c458bSopenharmony_ci searchParams.push_back(cppName); 19784d6c458bSopenharmony_ci searchParams.push_back(cppValue); 19794d6c458bSopenharmony_ci } 19804d6c458bSopenharmony_ci } 19814d6c458bSopenharmony_ci void URLSearchParams::Sort() 19824d6c458bSopenharmony_ci { 19834d6c458bSopenharmony_ci size_t len = searchParams.size(); 19844d6c458bSopenharmony_ci if (len <= 2 || (len % 2 != 0)) { // 2: Iterate over key-value pairs 19854d6c458bSopenharmony_ci return; 19864d6c458bSopenharmony_ci } 19874d6c458bSopenharmony_ci size_t i = 0; 19884d6c458bSopenharmony_ci for (; i < len - 2; i += 2) { // 2:Iterate over key-value pairs 19894d6c458bSopenharmony_ci size_t j = i + 2; // 2:Iterate over key-value pairs 19904d6c458bSopenharmony_ci for (; j < len; j += 2) { // 2:Iterate over key-value pairs 19914d6c458bSopenharmony_ci bool tmp = (searchParams[i] > searchParams[j]); 19924d6c458bSopenharmony_ci if (tmp) { 19934d6c458bSopenharmony_ci const std::string curKey = searchParams[i]; 19944d6c458bSopenharmony_ci const std::string curVal = searchParams[i + 1]; 19954d6c458bSopenharmony_ci searchParams[i] = searchParams[j]; 19964d6c458bSopenharmony_ci searchParams[i + 1] = searchParams[j + 1]; 19974d6c458bSopenharmony_ci searchParams[j] = curKey; 19984d6c458bSopenharmony_ci searchParams[j + 1] = curVal; 19994d6c458bSopenharmony_ci } 20004d6c458bSopenharmony_ci } 20014d6c458bSopenharmony_ci } 20024d6c458bSopenharmony_ci } 20034d6c458bSopenharmony_ci napi_value URLSearchParams::IterByKeys(napi_env env) 20044d6c458bSopenharmony_ci { 20054d6c458bSopenharmony_ci std::vector<std::string> toKeys; 20064d6c458bSopenharmony_ci napi_value result = nullptr; 20074d6c458bSopenharmony_ci napi_value napiStr = nullptr; 20084d6c458bSopenharmony_ci napi_create_array(env, &result); 20094d6c458bSopenharmony_ci size_t stepSize = 2; // 2:Searching for the number and number of keys and values 20104d6c458bSopenharmony_ci size_t lenStr = searchParams.size(); 20114d6c458bSopenharmony_ci if (lenStr % 2 == 0) { // 2:Get the number of values 20124d6c458bSopenharmony_ci for (auto it = searchParams.begin(); it != searchParams.end(); it += stepSize) { 20134d6c458bSopenharmony_ci toKeys.push_back(*it); 20144d6c458bSopenharmony_ci } 20154d6c458bSopenharmony_ci size_t lenToKeys = toKeys.size(); 20164d6c458bSopenharmony_ci for (size_t i = 0; i < lenToKeys; i++) { 20174d6c458bSopenharmony_ci napi_create_string_utf8(env, toKeys[i].c_str(), toKeys[i].length(), &napiStr); 20184d6c458bSopenharmony_ci napi_set_element(env, result, i, napiStr); 20194d6c458bSopenharmony_ci } 20204d6c458bSopenharmony_ci } 20214d6c458bSopenharmony_ci return result; 20224d6c458bSopenharmony_ci } 20234d6c458bSopenharmony_ci napi_value URLSearchParams::IterByValues(napi_env env) 20244d6c458bSopenharmony_ci { 20254d6c458bSopenharmony_ci std::vector<std::string> toKeys; 20264d6c458bSopenharmony_ci napi_value result = nullptr; 20274d6c458bSopenharmony_ci napi_value napiStr = nullptr; 20284d6c458bSopenharmony_ci napi_create_array(env, &result); 20294d6c458bSopenharmony_ci size_t stepSize = 2; // 2:Searching for the number and number of keys and values 20304d6c458bSopenharmony_ci size_t lenStr = searchParams.size(); 20314d6c458bSopenharmony_ci if (lenStr % 2 == 0) { // 2:Get the number of values 20324d6c458bSopenharmony_ci for (auto it = searchParams.begin(); 20334d6c458bSopenharmony_ci it != searchParams.end(); 20344d6c458bSopenharmony_ci it += stepSize) { 20354d6c458bSopenharmony_ci toKeys.push_back(*(it + 1)); 20364d6c458bSopenharmony_ci } 20374d6c458bSopenharmony_ci size_t lenToKeys = toKeys.size(); 20384d6c458bSopenharmony_ci for (size_t i = 0; i < lenToKeys; i++) { 20394d6c458bSopenharmony_ci napi_create_string_utf8(env, toKeys[i].c_str(), toKeys[i].length(), &napiStr); 20404d6c458bSopenharmony_ci napi_set_element(env, result, i, napiStr); 20414d6c458bSopenharmony_ci } 20424d6c458bSopenharmony_ci } 20434d6c458bSopenharmony_ci return result; 20444d6c458bSopenharmony_ci } 20454d6c458bSopenharmony_ci void URLSearchParams::SetArray(napi_env env, const std::vector<std::string> vec) 20464d6c458bSopenharmony_ci { 20474d6c458bSopenharmony_ci searchParams = vec; 20484d6c458bSopenharmony_ci } 20494d6c458bSopenharmony_ci napi_value URLSearchParams::GetArray(napi_env env) const 20504d6c458bSopenharmony_ci { 20514d6c458bSopenharmony_ci napi_value arr = nullptr; 20524d6c458bSopenharmony_ci napi_create_array(env, &arr); 20534d6c458bSopenharmony_ci size_t length = searchParams.size(); 20544d6c458bSopenharmony_ci for (size_t i = 0; i < length; i++) { 20554d6c458bSopenharmony_ci napi_value result = nullptr; 20564d6c458bSopenharmony_ci napi_create_string_utf8(env, searchParams[i].c_str(), searchParams[i].size(), &result); 20574d6c458bSopenharmony_ci napi_set_element(env, arr, i, result); 20584d6c458bSopenharmony_ci } 20594d6c458bSopenharmony_ci return arr; 20604d6c458bSopenharmony_ci } 20614d6c458bSopenharmony_ci} // namespace OHOS::Url 2062