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 URI_JS_URI_H
174d6c458bSopenharmony_ci#define URI_JS_URI_H
184d6c458bSopenharmony_ci
194d6c458bSopenharmony_ci#include <bitset>
204d6c458bSopenharmony_ci#include <cstdlib>
214d6c458bSopenharmony_ci#include <regex>
224d6c458bSopenharmony_ci#include <string>
234d6c458bSopenharmony_ci#include <vector>
244d6c458bSopenharmony_ci#include "napi/native_api.h"
254d6c458bSopenharmony_ci#include "napi/native_node_api.h"
264d6c458bSopenharmony_ci
274d6c458bSopenharmony_cinamespace OHOS::Uri {
284d6c458bSopenharmony_ci    constexpr int MAX_BIT_SIZE = 128;
294d6c458bSopenharmony_ci    struct UriData {
304d6c458bSopenharmony_ci        int port = -1;
314d6c458bSopenharmony_ci        std::string scheme = "";
324d6c458bSopenharmony_ci        std::string userInfo = "";
334d6c458bSopenharmony_ci        std::string host = "";
344d6c458bSopenharmony_ci        std::string query = "";
354d6c458bSopenharmony_ci        std::string fragment = "";
364d6c458bSopenharmony_ci        std::string path = "";
374d6c458bSopenharmony_ci        std::string authority = "";
384d6c458bSopenharmony_ci        std::string SchemeSpecificPart = "";
394d6c458bSopenharmony_ci    };
404d6c458bSopenharmony_ci
414d6c458bSopenharmony_ci    class Uri {
424d6c458bSopenharmony_ci    public:
434d6c458bSopenharmony_ci        /**
444d6c458bSopenharmony_ci         * URI constructor, which is used to instantiate a URI object.
454d6c458bSopenharmony_ci         *
464d6c458bSopenharmony_ci         * @param input Constructs a URI by parsing a given string.
474d6c458bSopenharmony_ci         */
484d6c458bSopenharmony_ci        explicit Uri(const std::string input);
494d6c458bSopenharmony_ci
504d6c458bSopenharmony_ci        /**
514d6c458bSopenharmony_ci         * The destructor of the Uri.
524d6c458bSopenharmony_ci         */
534d6c458bSopenharmony_ci        virtual ~Uri() {}
544d6c458bSopenharmony_ci
554d6c458bSopenharmony_ci        /**
564d6c458bSopenharmony_ci         * Tests whether this URI is equivalent to other URI objects.
574d6c458bSopenharmony_ci         *
584d6c458bSopenharmony_ci         * @param other URI object to be compared
594d6c458bSopenharmony_ci         */
604d6c458bSopenharmony_ci        bool Equals(const Uri other) const;
614d6c458bSopenharmony_ci
624d6c458bSopenharmony_ci        /**
634d6c458bSopenharmony_ci         * Indicates whether this URI is an absolute URI.
644d6c458bSopenharmony_ci         */
654d6c458bSopenharmony_ci        bool IsAbsolute() const;
664d6c458bSopenharmony_ci
674d6c458bSopenharmony_ci        /**
684d6c458bSopenharmony_ci         * Determine whether parsing failed.
694d6c458bSopenharmony_ci         */
704d6c458bSopenharmony_ci        std::string IsFailed() const;
714d6c458bSopenharmony_ci
724d6c458bSopenharmony_ci        /**
734d6c458bSopenharmony_ci         * Returns the serialized URI as a string.
744d6c458bSopenharmony_ci         */
754d6c458bSopenharmony_ci        std::string ToString() const;
764d6c458bSopenharmony_ci
774d6c458bSopenharmony_ci        /**
784d6c458bSopenharmony_ci         * Indicates whether this URI is an relative URI.
794d6c458bSopenharmony_ci         */
804d6c458bSopenharmony_ci        bool IsRelative() const;
814d6c458bSopenharmony_ci
824d6c458bSopenharmony_ci        /**
834d6c458bSopenharmony_ci         * Indicates whether this URI is an opaque URI.
844d6c458bSopenharmony_ci         */
854d6c458bSopenharmony_ci        bool IsOpaque() const;
864d6c458bSopenharmony_ci
874d6c458bSopenharmony_ci        /**
884d6c458bSopenharmony_ci         * Indicates whether this URI is an hierarchical URI.
894d6c458bSopenharmony_ci         */
904d6c458bSopenharmony_ci        bool IsHierarchical() const;
914d6c458bSopenharmony_ci
924d6c458bSopenharmony_ci        /**
934d6c458bSopenharmony_ci         * Add key and value to Uri's query
944d6c458bSopenharmony_ci         */
954d6c458bSopenharmony_ci        std::string AddQueryValue(const std::string key, const std::string value) const;
964d6c458bSopenharmony_ci
974d6c458bSopenharmony_ci        /**
984d6c458bSopenharmony_ci         * Add pathSegment to Uri's segment
994d6c458bSopenharmony_ci         */
1004d6c458bSopenharmony_ci        std::string AddSegment(const std::string pathSegment) const;
1014d6c458bSopenharmony_ci
1024d6c458bSopenharmony_ci        /**
1034d6c458bSopenharmony_ci         * Gets the all Segment of the URI.
1044d6c458bSopenharmony_ci         */
1054d6c458bSopenharmony_ci        std::vector<std::string> GetSegment() const;
1064d6c458bSopenharmony_ci
1074d6c458bSopenharmony_ci        /**
1084d6c458bSopenharmony_ci         * Normalize the path of this URI.
1094d6c458bSopenharmony_ci         */
1104d6c458bSopenharmony_ci        std::string Normalize() const;
1114d6c458bSopenharmony_ci
1124d6c458bSopenharmony_ci        /**
1134d6c458bSopenharmony_ci         * Gets the protocol part of the URI.
1144d6c458bSopenharmony_ci         */
1154d6c458bSopenharmony_ci        std::string GetScheme() const;
1164d6c458bSopenharmony_ci
1174d6c458bSopenharmony_ci        /**
1184d6c458bSopenharmony_ci         * Gets the decoding permission component part of this URI.
1194d6c458bSopenharmony_ci         */
1204d6c458bSopenharmony_ci        std::string GetAuthority() const;
1214d6c458bSopenharmony_ci
1224d6c458bSopenharmony_ci        /**
1234d6c458bSopenharmony_ci         * Gets the decoding scheme-specific part of the URI.
1244d6c458bSopenharmony_ci         */
1254d6c458bSopenharmony_ci        std::string GetSsp() const;
1264d6c458bSopenharmony_ci
1274d6c458bSopenharmony_ci        /**
1284d6c458bSopenharmony_ci         * Obtains the user information part of the URI.
1294d6c458bSopenharmony_ci         */
1304d6c458bSopenharmony_ci        std::string GetUserinfo() const;
1314d6c458bSopenharmony_ci
1324d6c458bSopenharmony_ci        /**
1334d6c458bSopenharmony_ci         * Gets the hostname portion of the URI without a port.
1344d6c458bSopenharmony_ci         */
1354d6c458bSopenharmony_ci        std::string GetHost() const;
1364d6c458bSopenharmony_ci
1374d6c458bSopenharmony_ci        /**
1384d6c458bSopenharmony_ci         * Gets the hostname portion of the URI without a port.
1394d6c458bSopenharmony_ci         */
1404d6c458bSopenharmony_ci        std::string GetPort() const;
1414d6c458bSopenharmony_ci
1424d6c458bSopenharmony_ci        /**
1434d6c458bSopenharmony_ci         * Gets the path portion of the URI.
1444d6c458bSopenharmony_ci         */
1454d6c458bSopenharmony_ci        std::string GetPath() const;
1464d6c458bSopenharmony_ci
1474d6c458bSopenharmony_ci        /**
1484d6c458bSopenharmony_ci         * Gets the query portion of the URI.
1494d6c458bSopenharmony_ci         */
1504d6c458bSopenharmony_ci        std::string GetQuery() const;
1514d6c458bSopenharmony_ci
1524d6c458bSopenharmony_ci        /**
1534d6c458bSopenharmony_ci         * Gets the fragment part of the URI.
1544d6c458bSopenharmony_ci         */
1554d6c458bSopenharmony_ci        std::string GetFragment() const;
1564d6c458bSopenharmony_ci
1574d6c458bSopenharmony_ci        /**
1584d6c458bSopenharmony_ci         * Clear Uri's query
1594d6c458bSopenharmony_ci         */
1604d6c458bSopenharmony_ci        std::string ClearQuery() const;
1614d6c458bSopenharmony_ci
1624d6c458bSopenharmony_ci    private:
1634d6c458bSopenharmony_ci        void PreliminaryWork() const;
1644d6c458bSopenharmony_ci        void AnalysisUri();
1654d6c458bSopenharmony_ci        void SpecialPath();
1664d6c458bSopenharmony_ci        void AnalysisFragment(size_t pos);
1674d6c458bSopenharmony_ci        void AnalysisQuery(size_t pos);
1684d6c458bSopenharmony_ci        void AnalysisScheme(size_t pos);
1694d6c458bSopenharmony_ci        void AnalysisHostAndPath();
1704d6c458bSopenharmony_ci        void AnalysisHost(bool isLawfulProt);
1714d6c458bSopenharmony_ci        void AnalysisPath(size_t pos);
1724d6c458bSopenharmony_ci        void AnalysisUserInfo(size_t pos);
1734d6c458bSopenharmony_ci        void AnalysisIPV6();
1744d6c458bSopenharmony_ci        void AssignSchemeSpecificPart();
1754d6c458bSopenharmony_ci
1764d6c458bSopenharmony_ci        bool CheckCharacter(std::string data, std::bitset<MAX_BIT_SIZE> rule, bool flag) const;
1774d6c458bSopenharmony_ci        bool AnalysisPort(size_t pos);
1784d6c458bSopenharmony_ci        bool AnalysisIPV4();
1794d6c458bSopenharmony_ci
1804d6c458bSopenharmony_ci        std::string Split(const std::string &path) const;
1814d6c458bSopenharmony_ci        std::string BuildUriString(const std::string str, const std::string param) const;
1824d6c458bSopenharmony_ci
1834d6c458bSopenharmony_ci    private:
1844d6c458bSopenharmony_ci        UriData uriData_;
1854d6c458bSopenharmony_ci        std::string data_ {};
1864d6c458bSopenharmony_ci        std::string inputUri_ {};
1874d6c458bSopenharmony_ci        std::string errStr_ {};
1884d6c458bSopenharmony_ci    };
1894d6c458bSopenharmony_ci} // namespace OHOS::Uri
1904d6c458bSopenharmony_ci#endif // URI_JS_URI_H
191