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