1  /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef URI_JS_URI_H
17 #define URI_JS_URI_H
18 
19 #include <bitset>
20 #include <cstdlib>
21 #include <regex>
22 #include <string>
23 #include <vector>
24 #include "napi/native_api.h"
25 #include "napi/native_node_api.h"
26 
27 namespace OHOS::Uri {
28     constexpr int MAX_BIT_SIZE = 128;
29     struct UriData {
30         int port = -1;
31         std::string scheme = "";
32         std::string userInfo = "";
33         std::string host = "";
34         std::string query = "";
35         std::string fragment = "";
36         std::string path = "";
37         std::string authority = "";
38         std::string SchemeSpecificPart = "";
39     };
40 
41     class Uri {
42     public:
43         /**
44          * URI constructor, which is used to instantiate a URI object.
45          *
46          * @param input Constructs a URI by parsing a given string.
47          */
48         explicit Uri(const std::string input);
49 
50         /**
51          * The destructor of the Uri.
52          */
~Uri()53         virtual ~Uri() {}
54 
55         /**
56          * Tests whether this URI is equivalent to other URI objects.
57          *
58          * @param other URI object to be compared
59          */
60         bool Equals(const Uri other) const;
61 
62         /**
63          * Indicates whether this URI is an absolute URI.
64          */
65         bool IsAbsolute() const;
66 
67         /**
68          * Determine whether parsing failed.
69          */
70         std::string IsFailed() const;
71 
72         /**
73          * Returns the serialized URI as a string.
74          */
75         std::string ToString() const;
76 
77         /**
78          * Indicates whether this URI is an relative URI.
79          */
80         bool IsRelative() const;
81 
82         /**
83          * Indicates whether this URI is an opaque URI.
84          */
85         bool IsOpaque() const;
86 
87         /**
88          * Indicates whether this URI is an hierarchical URI.
89          */
90         bool IsHierarchical() const;
91 
92         /**
93          * Add key and value to Uri's query
94          */
95         std::string AddQueryValue(const std::string key, const std::string value) const;
96 
97         /**
98          * Add pathSegment to Uri's segment
99          */
100         std::string AddSegment(const std::string pathSegment) const;
101 
102         /**
103          * Gets the all Segment of the URI.
104          */
105         std::vector<std::string> GetSegment() const;
106 
107         /**
108          * Normalize the path of this URI.
109          */
110         std::string Normalize() const;
111 
112         /**
113          * Gets the protocol part of the URI.
114          */
115         std::string GetScheme() const;
116 
117         /**
118          * Gets the decoding permission component part of this URI.
119          */
120         std::string GetAuthority() const;
121 
122         /**
123          * Gets the decoding scheme-specific part of the URI.
124          */
125         std::string GetSsp() const;
126 
127         /**
128          * Obtains the user information part of the URI.
129          */
130         std::string GetUserinfo() const;
131 
132         /**
133          * Gets the hostname portion of the URI without a port.
134          */
135         std::string GetHost() const;
136 
137         /**
138          * Gets the hostname portion of the URI without a port.
139          */
140         std::string GetPort() const;
141 
142         /**
143          * Gets the path portion of the URI.
144          */
145         std::string GetPath() const;
146 
147         /**
148          * Gets the query portion of the URI.
149          */
150         std::string GetQuery() const;
151 
152         /**
153          * Gets the fragment part of the URI.
154          */
155         std::string GetFragment() const;
156 
157         /**
158          * Clear Uri's query
159          */
160         std::string ClearQuery() const;
161 
162     private:
163         void PreliminaryWork() const;
164         void AnalysisUri();
165         void SpecialPath();
166         void AnalysisFragment(size_t pos);
167         void AnalysisQuery(size_t pos);
168         void AnalysisScheme(size_t pos);
169         void AnalysisHostAndPath();
170         void AnalysisHost(bool isLawfulProt);
171         void AnalysisPath(size_t pos);
172         void AnalysisUserInfo(size_t pos);
173         void AnalysisIPV6();
174         void AssignSchemeSpecificPart();
175 
176         bool CheckCharacter(std::string data, std::bitset<MAX_BIT_SIZE> rule, bool flag) const;
177         bool AnalysisPort(size_t pos);
178         bool AnalysisIPV4();
179 
180         std::string Split(const std::string &path) const;
181         std::string BuildUriString(const std::string str, const std::string param) const;
182 
183     private:
184         UriData uriData_;
185         std::string data_ {};
186         std::string inputUri_ {};
187         std::string errStr_ {};
188     };
189 } // namespace OHOS::Uri
190 #endif // URI_JS_URI_H
191