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