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#ifndef URL_JS_URL_H
174d6c458bSopenharmony_ci#define URL_JS_URL_H
184d6c458bSopenharmony_ci
194d6c458bSopenharmony_ci#include <algorithm>
204d6c458bSopenharmony_ci#include <bitset>
214d6c458bSopenharmony_ci#include <cmath>
224d6c458bSopenharmony_ci#include <cstdio>
234d6c458bSopenharmony_ci#include <cstdlib>
244d6c458bSopenharmony_ci#include <map>
254d6c458bSopenharmony_ci#include <string>
264d6c458bSopenharmony_ci#include <vector>
274d6c458bSopenharmony_ci#include "napi/native_api.h"
284d6c458bSopenharmony_ci#include "napi/native_node_api.h"
294d6c458bSopenharmony_cinamespace OHOS::Url {
304d6c458bSopenharmony_ci    enum class BitsetStatusFlag {
314d6c458bSopenharmony_ci        BIT0 = 0, // 0:Bit 0 Set to true,The URL analysis failed
324d6c458bSopenharmony_ci        BIT1 = 1, // 1:Bit 1 Set to true,The protocol is the default protocol
334d6c458bSopenharmony_ci        BIT2 = 2, // 2:Bit 2 Set to true,The URL has username
344d6c458bSopenharmony_ci        BIT3 = 3, // 3:Bit 3 Set to true,The URL has password
354d6c458bSopenharmony_ci        BIT4 = 4, // 4:Bit 4 Set to true,The URL has hostname
364d6c458bSopenharmony_ci        BIT5 = 5, // 5:Bit 5 Set to true,The URL Port is the specially
374d6c458bSopenharmony_ci        BIT6 = 6, // 6:Bit 6 Set to true,The URL has pathname
384d6c458bSopenharmony_ci        BIT7 = 7, // 7:Bit 7 Set to true,The URL has query
394d6c458bSopenharmony_ci        BIT8 = 8, // 8:Bit 8 Set to true,The URL has fragment
404d6c458bSopenharmony_ci        BIT9 = 9, // 9:Bit 9 Set to true,The URL Can not be base
414d6c458bSopenharmony_ci        BIT10 = 10, // 10:Bit 10 Set to true,The host is IPV6
424d6c458bSopenharmony_ci        BIT_STATUS_11 = 11, // 11:Each bit of a BIT represents a different parsing state.
434d6c458bSopenharmony_ci        BIT_ASCII_32 = 32, // 32:32-bit previously invalid control characters in ascii
444d6c458bSopenharmony_ci        BIT_ASCII_127 = 127, // 127:127 bits in ascii are DEL characters
454d6c458bSopenharmony_ci        MAX_BIT_SIZE = 128 // 128:ascii max range
464d6c458bSopenharmony_ci    };
474d6c458bSopenharmony_ci
484d6c458bSopenharmony_ci    struct UrlData {
494d6c458bSopenharmony_ci        int port = -1;
504d6c458bSopenharmony_ci        bool isSpecialPath = false;
514d6c458bSopenharmony_ci        std::vector<std::string> path;
524d6c458bSopenharmony_ci        std::string password = "";
534d6c458bSopenharmony_ci        std::string scheme = "";
544d6c458bSopenharmony_ci        std::string query = "";
554d6c458bSopenharmony_ci        std::string username = "";
564d6c458bSopenharmony_ci        std::string fragment = "";
574d6c458bSopenharmony_ci        std::string host = "";
584d6c458bSopenharmony_ci    };
594d6c458bSopenharmony_ci
604d6c458bSopenharmony_ci    bool IsHexDigit(const char& ch);
614d6c458bSopenharmony_ci    std::string DecodeSpecialChars(std::string input);
624d6c458bSopenharmony_ci    void DeleteC0OrSpace(std::string& str);
634d6c458bSopenharmony_ci    void DeleteTabOrNewline(std::string& str1);
644d6c458bSopenharmony_ci    std::string DealIpv4(std::string str);
654d6c458bSopenharmony_ci    std::string SplitNum(std::string num, size_t& number);
664d6c458bSopenharmony_ci    void FormatIpv6(std::string& str);
674d6c458bSopenharmony_ci    bool ISFileNohost(const std::string& input);
684d6c458bSopenharmony_ci    bool AnalysisScheme(std::string& input, std::string& scheme,
694d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
704d6c458bSopenharmony_ci    void AnalysisUsernameAndPasswd(std::string& input, std::string& username, std::string& password,
714d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
724d6c458bSopenharmony_ci    void AnalysisPath(std::string& input, std::vector<std::string>& path,
734d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, bool isSpecial);
744d6c458bSopenharmony_ci    void AnalysisOpaqueHost(std::string input, std::string& host,
754d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
764d6c458bSopenharmony_ci    void AnalyseIPv4(const std::string& input, std::string& host,
774d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
784d6c458bSopenharmony_ci    void AnalysisHost(std::string& input, std::string& host,
794d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, bool special);
804d6c458bSopenharmony_ci    void AnalysisFilePath(std::string& input, UrlData& urlinfo,
814d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
824d6c458bSopenharmony_ci    void AnalysisFilescheme(const std::string& input, UrlData& urlinfo,
834d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
844d6c458bSopenharmony_ci    void AnalyInfoPath(std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags,
854d6c458bSopenharmony_ci        UrlData& urlinfo, const std::string& input);
864d6c458bSopenharmony_ci    void AnalyHostPath(std::string &strHost, std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags,
874d6c458bSopenharmony_ci        UrlData& urlinfo);
884d6c458bSopenharmony_ci    void AnalyStrHost(std::string &strHost, UrlData& urlinfo,
894d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags);
904d6c458bSopenharmony_ci    void AnalysisNoDefaultProtocol(std::string& input, UrlData& urlinfo,
914d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
924d6c458bSopenharmony_ci    void AnalysisOnlyHost(const std::string& input, UrlData& urlinfo,
934d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags, size_t pos);
944d6c458bSopenharmony_ci    void FormatIpv4(std::vector<std::string> nums, std::string& host,
954d6c458bSopenharmony_ci                    std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> &flags);
964d6c458bSopenharmony_ci    void AnalysisSpecialFile(std::string& temp, size_t pos, UrlData& urlinfo,
974d6c458bSopenharmony_ci                             std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
984d6c458bSopenharmony_ci    void AnalysisFile(std::string& input, UrlData& urlinfo,
994d6c458bSopenharmony_ci                      std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
1004d6c458bSopenharmony_ci    void ParsingHostAndPath(std::string& input, UrlData& urlinfo, size_t& pos,
1014d6c458bSopenharmony_ci                            std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
1024d6c458bSopenharmony_ci    void ShorteningPath(UrlData& urlData, UrlData& baseData, bool isFile);
1034d6c458bSopenharmony_ci    void RemoveLeadingZeros(std::vector<std::string> &ipv6);
1044d6c458bSopenharmony_ci    void IPv6Host(std::string& input, std::string& host,
1054d6c458bSopenharmony_ci                  std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)>& flags);
1064d6c458bSopenharmony_ci    std::string BasePathToStr(UrlData& urlData);
1074d6c458bSopenharmony_ci    class URL {
1084d6c458bSopenharmony_ci    public:
1094d6c458bSopenharmony_ci        /**
1104d6c458bSopenharmony_ci         * URI constructor, which is used to instantiate a URI object.
1114d6c458bSopenharmony_ci         *
1124d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1134d6c458bSopenharmony_ci         */
1144d6c458bSopenharmony_ci        explicit URL(const std::string& input);
1154d6c458bSopenharmony_ci
1164d6c458bSopenharmony_ci        /**
1174d6c458bSopenharmony_ci         * URI constructor, which is used to instantiate a URI object.
1184d6c458bSopenharmony_ci         *
1194d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1204d6c458bSopenharmony_ci         * @param base The input parameter is a character string.
1214d6c458bSopenharmony_ci         */
1224d6c458bSopenharmony_ci        URL(const std::string& input, const std::string& base);
1234d6c458bSopenharmony_ci
1244d6c458bSopenharmony_ci        /**
1254d6c458bSopenharmony_ci         * URI constructor, which is used to instantiate a URI object.
1264d6c458bSopenharmony_ci         *
1274d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1284d6c458bSopenharmony_ci         * @param base The input parameter is the URL object.
1294d6c458bSopenharmony_ci         */
1304d6c458bSopenharmony_ci        URL(const std::string& input, const URL& base);
1314d6c458bSopenharmony_ci
1324d6c458bSopenharmony_ci        /**
1334d6c458bSopenharmony_ci         *
1344d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1354d6c458bSopenharmony_ci         * Gets the host name portion of the URL��not include the port.
1364d6c458bSopenharmony_ci         */
1374d6c458bSopenharmony_ci        napi_value GetHostname(napi_env env) const;
1384d6c458bSopenharmony_ci
1394d6c458bSopenharmony_ci        /**
1404d6c458bSopenharmony_ci         * Sets the host name portion of the URL��not include the port.
1414d6c458bSopenharmony_ci         *
1424d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1434d6c458bSopenharmony_ci         */
1444d6c458bSopenharmony_ci        void SetHostname(const std::string& input);
1454d6c458bSopenharmony_ci
1464d6c458bSopenharmony_ci        /**
1474d6c458bSopenharmony_ci         * Sets the username name portion of the URL��not include the port.
1484d6c458bSopenharmony_ci         *
1494d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1504d6c458bSopenharmony_ci         */
1514d6c458bSopenharmony_ci        void SetUsername(const std::string& input);
1524d6c458bSopenharmony_ci
1534d6c458bSopenharmony_ci        /**
1544d6c458bSopenharmony_ci         * Sets the password portion of the URL��not include the port.
1554d6c458bSopenharmony_ci         *
1564d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1574d6c458bSopenharmony_ci         */
1584d6c458bSopenharmony_ci        void SetPassword(const std::string& input);
1594d6c458bSopenharmony_ci
1604d6c458bSopenharmony_ci        /**
1614d6c458bSopenharmony_ci         * Sets the scheme portion of the URL��not include the port.
1624d6c458bSopenharmony_ci         *
1634d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1644d6c458bSopenharmony_ci         */
1654d6c458bSopenharmony_ci        void SetScheme(const std::string& input);
1664d6c458bSopenharmony_ci
1674d6c458bSopenharmony_ci        /**
1684d6c458bSopenharmony_ci         * Sets the fragment portion of the URL��not include the port.
1694d6c458bSopenharmony_ci         *
1704d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1714d6c458bSopenharmony_ci         */
1724d6c458bSopenharmony_ci        void SetFragment(const std::string& input);
1734d6c458bSopenharmony_ci
1744d6c458bSopenharmony_ci        /**
1754d6c458bSopenharmony_ci         * Sets the search portion of the URL��not include the port.
1764d6c458bSopenharmony_ci         *
1774d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1784d6c458bSopenharmony_ci         */
1794d6c458bSopenharmony_ci        void SetSearch(const std::string& input);
1804d6c458bSopenharmony_ci
1814d6c458bSopenharmony_ci        /**
1824d6c458bSopenharmony_ci         * Sets the host portion of the URL��not include the port.
1834d6c458bSopenharmony_ci         *
1844d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1854d6c458bSopenharmony_ci         */
1864d6c458bSopenharmony_ci        void SetHost(const std::string& input);
1874d6c458bSopenharmony_ci
1884d6c458bSopenharmony_ci        /**
1894d6c458bSopenharmony_ci         * Sets the port portion of the URL��not include the port.
1904d6c458bSopenharmony_ci         *
1914d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1924d6c458bSopenharmony_ci         */
1934d6c458bSopenharmony_ci        void SetPort(const std::string& input);
1944d6c458bSopenharmony_ci
1954d6c458bSopenharmony_ci        /**
1964d6c458bSopenharmony_ci         * Sets the href portion of the URL��not include the port.
1974d6c458bSopenharmony_ci         *
1984d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
1994d6c458bSopenharmony_ci         */
2004d6c458bSopenharmony_ci        void SetHref(const std::string& input);
2014d6c458bSopenharmony_ci
2024d6c458bSopenharmony_ci        /**
2034d6c458bSopenharmony_ci         * Sets the path portion of the URL��not include the port.
2044d6c458bSopenharmony_ci         *
2054d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
2064d6c458bSopenharmony_ci         */
2074d6c458bSopenharmony_ci        void SetPath(const std::string& input);
2084d6c458bSopenharmony_ci
2094d6c458bSopenharmony_ci        /**
2104d6c458bSopenharmony_ci         * Gets the search portion of the URL��not include the port.
2114d6c458bSopenharmony_ci         *
2124d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2134d6c458bSopenharmony_ci         */
2144d6c458bSopenharmony_ci        napi_value GetSearch(napi_env env) const;
2154d6c458bSopenharmony_ci
2164d6c458bSopenharmony_ci        /**
2174d6c458bSopenharmony_ci         * Gets the username portion of the URL��not include the port.
2184d6c458bSopenharmony_ci         *
2194d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2204d6c458bSopenharmony_ci         */
2214d6c458bSopenharmony_ci        napi_value GetUsername(napi_env env) const;
2224d6c458bSopenharmony_ci
2234d6c458bSopenharmony_ci        /**
2244d6c458bSopenharmony_ci         * Gets the password portion of the URL��not include the port.
2254d6c458bSopenharmony_ci         *
2264d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2274d6c458bSopenharmony_ci         */
2284d6c458bSopenharmony_ci        napi_value GetPassword(napi_env env) const;
2294d6c458bSopenharmony_ci
2304d6c458bSopenharmony_ci        /**
2314d6c458bSopenharmony_ci         * Gets the fragment portion of the URL��not include the port.
2324d6c458bSopenharmony_ci         *
2334d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2344d6c458bSopenharmony_ci         */
2354d6c458bSopenharmony_ci        napi_value GetFragment(napi_env env) const;
2364d6c458bSopenharmony_ci
2374d6c458bSopenharmony_ci        /**
2384d6c458bSopenharmony_ci         * Gets the scheme portion of the URL��not include the port.
2394d6c458bSopenharmony_ci         *
2404d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2414d6c458bSopenharmony_ci         */
2424d6c458bSopenharmony_ci        napi_value GetScheme(napi_env env) const;
2434d6c458bSopenharmony_ci
2444d6c458bSopenharmony_ci        /**
2454d6c458bSopenharmony_ci         * Gets the path portion of the URL��not include the port.
2464d6c458bSopenharmony_ci         *
2474d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2484d6c458bSopenharmony_ci         */
2494d6c458bSopenharmony_ci        napi_value GetPath(napi_env env) const;
2504d6c458bSopenharmony_ci
2514d6c458bSopenharmony_ci        /**
2524d6c458bSopenharmony_ci         * Gets the port portion of the URL��not include the port.
2534d6c458bSopenharmony_ci         *
2544d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2554d6c458bSopenharmony_ci         */
2564d6c458bSopenharmony_ci        napi_value GetPort(napi_env env) const;
2574d6c458bSopenharmony_ci
2584d6c458bSopenharmony_ci        /**
2594d6c458bSopenharmony_ci         * Judge whether it's on or off.
2604d6c458bSopenharmony_ci         *
2614d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2624d6c458bSopenharmony_ci         */
2634d6c458bSopenharmony_ci        napi_value GetOnOrOff(napi_env env) const;
2644d6c458bSopenharmony_ci
2654d6c458bSopenharmony_ci        /**
2664d6c458bSopenharmony_ci         * Judge whether it's Ipv6.
2674d6c458bSopenharmony_ci         *
2684d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2694d6c458bSopenharmony_ci         */
2704d6c458bSopenharmony_ci        napi_value GetIsIpv6(napi_env env) const;
2714d6c458bSopenharmony_ci
2724d6c458bSopenharmony_ci        /**
2734d6c458bSopenharmony_ci         * Gets the host name portion of the URL��not include the port.
2744d6c458bSopenharmony_ci         *
2754d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
2764d6c458bSopenharmony_ci         */
2774d6c458bSopenharmony_ci        napi_value GetHost(napi_env env) const;
2784d6c458bSopenharmony_ci
2794d6c458bSopenharmony_ci        /**
2804d6c458bSopenharmony_ci         * The destructor of the url
2814d6c458bSopenharmony_ci         */
2824d6c458bSopenharmony_ci        virtual ~URL() {}
2834d6c458bSopenharmony_ci
2844d6c458bSopenharmony_ci    private:
2854d6c458bSopenharmony_ci        UrlData urlData_;
2864d6c458bSopenharmony_ci        std::bitset<static_cast<size_t>(BitsetStatusFlag::BIT_STATUS_11)> flags_;
2874d6c458bSopenharmony_ci        // bitset<11>:Similar to bool array, each bit status represents the real-time status of current URL parsing
2884d6c458bSopenharmony_ci    };
2894d6c458bSopenharmony_ci
2904d6c458bSopenharmony_ci    class URLSearchParams {
2914d6c458bSopenharmony_ci    public:
2924d6c458bSopenharmony_ci        /**
2934d6c458bSopenharmony_ci         * A parameterized constructor used to create an URLSearchParams instance.
2944d6c458bSopenharmony_ci         */
2954d6c458bSopenharmony_ci        explicit URLSearchParams() {}
2964d6c458bSopenharmony_ci
2974d6c458bSopenharmony_ci        /**
2984d6c458bSopenharmony_ci         * Virtual destructor of URLSearchParams
2994d6c458bSopenharmony_ci         */
3004d6c458bSopenharmony_ci        virtual ~URLSearchParams() {}
3014d6c458bSopenharmony_ci
3024d6c458bSopenharmony_ci        /**
3034d6c458bSopenharmony_ci         * Returns a Boolean that indicates whether a parameter with the specified name exists.
3044d6c458bSopenharmony_ci         *
3054d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3064d6c458bSopenharmony_ci         * @param name Specifies the name of a key-value pair.
3074d6c458bSopenharmony_ci         */
3084d6c458bSopenharmony_ci        napi_value IsHas(napi_env env, napi_value  name) const;
3094d6c458bSopenharmony_ci
3104d6c458bSopenharmony_ci        /**
3114d6c458bSopenharmony_ci         * Returns the first value associated to the given search parameter.
3124d6c458bSopenharmony_ci         *
3134d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3144d6c458bSopenharmony_ci         * @param buffer Returns the first value associated to the given search parameter.
3154d6c458bSopenharmony_ci         */
3164d6c458bSopenharmony_ci        napi_value Get(napi_env env, napi_value buffer);
3174d6c458bSopenharmony_ci
3184d6c458bSopenharmony_ci        /**
3194d6c458bSopenharmony_ci         * Returns all key-value pairs associated with a given search parameter as an array.
3204d6c458bSopenharmony_ci         *
3214d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3224d6c458bSopenharmony_ci         * @param buffer Specifies the name of a key value.
3234d6c458bSopenharmony_ci         */
3244d6c458bSopenharmony_ci        napi_value GetAll(napi_env env, napi_value buffer);
3254d6c458bSopenharmony_ci
3264d6c458bSopenharmony_ci        /**
3274d6c458bSopenharmony_ci         * Appends a specified key/value pair as a new search parameter.
3284d6c458bSopenharmony_ci         *
3294d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3304d6c458bSopenharmony_ci         * @param buffer Key name of the search parameter to be inserted.
3314d6c458bSopenharmony_ci         * @param temp Values of search parameters to be inserted.
3324d6c458bSopenharmony_ci         */
3334d6c458bSopenharmony_ci        void Append(napi_env env, napi_value buffer, napi_value temp);
3344d6c458bSopenharmony_ci
3354d6c458bSopenharmony_ci        /**
3364d6c458bSopenharmony_ci         * Deletes the given search parameter and its associated value,from the list of all search parameters.
3374d6c458bSopenharmony_ci         *
3384d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3394d6c458bSopenharmony_ci         * @param buffer Name of the key-value pair to be deleted.
3404d6c458bSopenharmony_ci         */
3414d6c458bSopenharmony_ci        void Delete(napi_env env, napi_value buffer);
3424d6c458bSopenharmony_ci
3434d6c458bSopenharmony_ci        /**
3444d6c458bSopenharmony_ci         * Returns an ES6 iterator. Each item of the iterator is a JavaScript Array.
3454d6c458bSopenharmony_ci         *
3464d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3474d6c458bSopenharmony_ci         */
3484d6c458bSopenharmony_ci        napi_value Entries(napi_env env) const;
3494d6c458bSopenharmony_ci
3504d6c458bSopenharmony_ci        /**
3514d6c458bSopenharmony_ci         * Sets the value associated with a given search parameter to the
3524d6c458bSopenharmony_ci         * given value. If there were several matching values, this method
3534d6c458bSopenharmony_ci         * deletes the others. If the search parameter doesn't exist, this
3544d6c458bSopenharmony_ci         * method creates it.
3554d6c458bSopenharmony_ci         *
3564d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3574d6c458bSopenharmony_ci         * @param name Key name of the parameter to be set.
3584d6c458bSopenharmony_ci         * @param value Indicates the parameter value to be set.
3594d6c458bSopenharmony_ci         */
3604d6c458bSopenharmony_ci        void Set(napi_env env, napi_value name, napi_value value);
3614d6c458bSopenharmony_ci
3624d6c458bSopenharmony_ci        /**
3634d6c458bSopenharmony_ci         * Sort all key/value pairs contained in this object in place and return undefined.
3644d6c458bSopenharmony_ci         */
3654d6c458bSopenharmony_ci        void Sort();
3664d6c458bSopenharmony_ci
3674d6c458bSopenharmony_ci        /**
3684d6c458bSopenharmony_ci         * Returns an iterator allowing to go through all keys contained in this object.
3694d6c458bSopenharmony_ci         *
3704d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3714d6c458bSopenharmony_ci         */
3724d6c458bSopenharmony_ci        napi_value IterByKeys(napi_env env);
3734d6c458bSopenharmony_ci
3744d6c458bSopenharmony_ci        /**
3754d6c458bSopenharmony_ci         * Returns an iterator allowing to go through all values contained in this object.
3764d6c458bSopenharmony_ci         *
3774d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3784d6c458bSopenharmony_ci         */
3794d6c458bSopenharmony_ci        napi_value IterByValues(napi_env env);
3804d6c458bSopenharmony_ci
3814d6c458bSopenharmony_ci        /**
3824d6c458bSopenharmony_ci         * Sets the string array of searchParams.
3834d6c458bSopenharmony_ci         *
3844d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3854d6c458bSopenharmony_ci         * @param input String array.
3864d6c458bSopenharmony_ci         */
3874d6c458bSopenharmony_ci        void SetArray(napi_env env, std::vector<std::string> input);
3884d6c458bSopenharmony_ci
3894d6c458bSopenharmony_ci        /**
3904d6c458bSopenharmony_ci         * Gets the string array of searchParams.
3914d6c458bSopenharmony_ci         *
3924d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
3934d6c458bSopenharmony_ci         */
3944d6c458bSopenharmony_ci        napi_value GetArray(napi_env env) const;
3954d6c458bSopenharmony_ci
3964d6c458bSopenharmony_ci        /**
3974d6c458bSopenharmony_ci         * This function will decode the string and put the parsed key and value values into the
3984d6c458bSopenharmony_ci         * vector container of urlsearchparams class according to the rules.
3994d6c458bSopenharmony_ci         *
4004d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
4014d6c458bSopenharmony_ci         * @param Stringpar The input parameter of urlsearchparams is string.
4024d6c458bSopenharmony_ci         */
4034d6c458bSopenharmony_ci        std::vector<std::string> StringParmas(napi_env env, std::string Stringpar);
4044d6c458bSopenharmony_ci
4054d6c458bSopenharmony_ci    private:
4064d6c458bSopenharmony_ci        std::string ToUSVString(std::string inputStr);
4074d6c458bSopenharmony_ci        void HandleIllegalChar(std::wstring& inputStr, std::wstring::const_iterator it);
4084d6c458bSopenharmony_ci        std::vector<std::string> searchParams {};
4094d6c458bSopenharmony_ci    };
4104d6c458bSopenharmony_ci} // namespace OHOS::Url
4114d6c458bSopenharmony_ci#endif // URL_JS_URL_H
412