|
ferencd@0
|
1 //
|
|
ferencd@0
|
2 // VMime library (http://www.vmime.org)
|
|
ferencd@0
|
3 // Copyright (C) 2002-2013 Vincent Richard <vincent@vmime.org>
|
|
ferencd@0
|
4 //
|
|
ferencd@0
|
5 // This program is free software; you can redistribute it and/or
|
|
ferencd@0
|
6 // modify it under the terms of the GNU General Public License as
|
|
ferencd@0
|
7 // published by the Free Software Foundation; either version 3 of
|
|
ferencd@0
|
8 // the License, or (at your option) any later version.
|
|
ferencd@0
|
9 //
|
|
ferencd@0
|
10 // This program is distributed in the hope that it will be useful,
|
|
ferencd@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ferencd@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
ferencd@0
|
13 // General Public License for more details.
|
|
ferencd@0
|
14 //
|
|
ferencd@0
|
15 // You should have received a copy of the GNU General Public License along
|
|
ferencd@0
|
16 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ferencd@0
|
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ferencd@0
|
18 //
|
|
ferencd@0
|
19 // Linking this library statically or dynamically with other modules is making
|
|
ferencd@0
|
20 // a combined work based on this library. Thus, the terms and conditions of
|
|
ferencd@0
|
21 // the GNU General Public License cover the whole combination.
|
|
ferencd@0
|
22 //
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 #include "tests/testUtils.hpp"
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26 #include "vmime/utility/url.hpp"
|
|
ferencd@0
|
27 #include "vmime/utility/urlUtils.hpp"
|
|
ferencd@0
|
28
|
|
ferencd@0
|
29
|
|
ferencd@0
|
30 VMIME_TEST_SUITE_BEGIN(urlTest)
|
|
ferencd@0
|
31
|
|
ferencd@0
|
32 VMIME_TEST_LIST_BEGIN
|
|
ferencd@0
|
33 VMIME_TEST(testParse1)
|
|
ferencd@0
|
34 VMIME_TEST(testParse2)
|
|
ferencd@0
|
35 VMIME_TEST(testParse3)
|
|
ferencd@0
|
36 VMIME_TEST(testParse4)
|
|
ferencd@0
|
37 VMIME_TEST(testParse5)
|
|
ferencd@0
|
38 VMIME_TEST(testGenerate)
|
|
ferencd@0
|
39 VMIME_TEST(testUtilsEncode)
|
|
ferencd@0
|
40 VMIME_TEST(testUtilsDecode)
|
|
ferencd@0
|
41 VMIME_TEST(testUtilsDecodeSpecialCases)
|
|
ferencd@0
|
42 VMIME_TEST(testUtilsEncodeReservedChars)
|
|
ferencd@0
|
43 VMIME_TEST(testUtilsEncodeUnsafeChars)
|
|
ferencd@0
|
44 VMIME_TEST_LIST_END
|
|
ferencd@0
|
45
|
|
ferencd@0
|
46
|
|
ferencd@0
|
47 static bool parseHelper(vmime::utility::url& u, const vmime::string& str)
|
|
ferencd@0
|
48 {
|
|
ferencd@0
|
49 try
|
|
ferencd@0
|
50 {
|
|
ferencd@0
|
51 u = vmime::utility::url(str);
|
|
ferencd@0
|
52 }
|
|
ferencd@0
|
53 catch (vmime::exceptions::malformed_url)
|
|
ferencd@0
|
54 {
|
|
ferencd@0
|
55 return false;
|
|
ferencd@0
|
56 }
|
|
ferencd@0
|
57
|
|
ferencd@0
|
58 return true;
|
|
ferencd@0
|
59 }
|
|
ferencd@0
|
60
|
|
ferencd@0
|
61
|
|
ferencd@0
|
62 void testParse1()
|
|
ferencd@0
|
63 {
|
|
ferencd@0
|
64 // Test some valid constructions
|
|
ferencd@0
|
65 vmime::utility::url u1("", "");
|
|
ferencd@0
|
66
|
|
ferencd@0
|
67 VASSERT_EQ("1.1", true, parseHelper(u1, "protocol://user:password@host:12345/path/"));
|
|
ferencd@0
|
68 VASSERT_EQ("1.2", "protocol", u1.getProtocol());
|
|
ferencd@0
|
69 VASSERT_EQ("1.3", "user", u1.getUsername());
|
|
ferencd@0
|
70 VASSERT_EQ("1.4", "password", u1.getPassword());
|
|
ferencd@0
|
71 VASSERT_EQ("1.5", "host", u1.getHost());
|
|
ferencd@0
|
72 VASSERT_EQ("1.6", 12345, u1.getPort());
|
|
ferencd@0
|
73 VASSERT_EQ("1.7", "/path/", u1.getPath());
|
|
ferencd@0
|
74
|
|
ferencd@0
|
75 vmime::utility::url u2("", "");
|
|
ferencd@0
|
76
|
|
ferencd@0
|
77 VASSERT_EQ("2.1", true, parseHelper(u2, "protocol://user@host:12345/path/"));
|
|
ferencd@0
|
78 VASSERT_EQ("2.2", "protocol", u2.getProtocol());
|
|
ferencd@0
|
79 VASSERT_EQ("2.3", "user", u2.getUsername());
|
|
ferencd@0
|
80 VASSERT_EQ("2.4", "", u2.getPassword());
|
|
ferencd@0
|
81 VASSERT_EQ("2.5", "host", u2.getHost());
|
|
ferencd@0
|
82 VASSERT_EQ("2.6", 12345, u2.getPort());
|
|
ferencd@0
|
83 VASSERT_EQ("2.7", "/path/", u2.getPath());
|
|
ferencd@0
|
84
|
|
ferencd@0
|
85 vmime::utility::url u3("", "");
|
|
ferencd@0
|
86
|
|
ferencd@0
|
87 VASSERT_EQ("3.1", true, parseHelper(u3, "protocol://host:12345/path/"));
|
|
ferencd@0
|
88 VASSERT_EQ("3.2", "protocol", u3.getProtocol());
|
|
ferencd@0
|
89 VASSERT_EQ("3.3", "", u3.getUsername());
|
|
ferencd@0
|
90 VASSERT_EQ("3.4", "", u3.getPassword());
|
|
ferencd@0
|
91 VASSERT_EQ("3.5", "host", u3.getHost());
|
|
ferencd@0
|
92 VASSERT_EQ("3.6", 12345, u3.getPort());
|
|
ferencd@0
|
93 VASSERT_EQ("3.7", "/path/", u3.getPath());
|
|
ferencd@0
|
94
|
|
ferencd@0
|
95 vmime::utility::url u4("", "");
|
|
ferencd@0
|
96
|
|
ferencd@0
|
97 VASSERT_EQ("4.1", true, parseHelper(u4, "protocol://host/path/"));
|
|
ferencd@0
|
98 VASSERT_EQ("4.2", "protocol", u4.getProtocol());
|
|
ferencd@0
|
99 VASSERT_EQ("4.3", "", u4.getUsername());
|
|
ferencd@0
|
100 VASSERT_EQ("4.4", "", u4.getPassword());
|
|
ferencd@0
|
101 VASSERT_EQ("4.5", "host", u4.getHost());
|
|
ferencd@0
|
102 VASSERT_EQ("4.6", vmime::utility::url::UNSPECIFIED_PORT, u4.getPort());
|
|
ferencd@0
|
103 VASSERT_EQ("4.7", "/path/", u4.getPath());
|
|
ferencd@0
|
104
|
|
ferencd@0
|
105 vmime::utility::url u5("", "");
|
|
ferencd@0
|
106
|
|
ferencd@0
|
107 VASSERT_EQ("5.1", true, parseHelper(u5, "protocol://host/"));
|
|
ferencd@0
|
108 VASSERT_EQ("5.2", "protocol", u5.getProtocol());
|
|
ferencd@0
|
109 VASSERT_EQ("5.3", "", u5.getUsername());
|
|
ferencd@0
|
110 VASSERT_EQ("5.4", "", u5.getPassword());
|
|
ferencd@0
|
111 VASSERT_EQ("5.5", "host", u5.getHost());
|
|
ferencd@0
|
112 VASSERT_EQ("5.6", vmime::utility::url::UNSPECIFIED_PORT, u4.getPort());
|
|
ferencd@0
|
113 VASSERT_EQ("5.7", "", u5.getPath());
|
|
ferencd@0
|
114
|
|
ferencd@0
|
115 vmime::utility::url u6("", "");
|
|
ferencd@0
|
116
|
|
ferencd@0
|
117 VASSERT_EQ("6.1", true, parseHelper(u4, "protocol://host/path/file"));
|
|
ferencd@0
|
118 VASSERT_EQ("6.2", "protocol", u4.getProtocol());
|
|
ferencd@0
|
119 VASSERT_EQ("6.3", "", u4.getUsername());
|
|
ferencd@0
|
120 VASSERT_EQ("6.4", "", u4.getPassword());
|
|
ferencd@0
|
121 VASSERT_EQ("6.5", "host", u4.getHost());
|
|
ferencd@0
|
122 VASSERT_EQ("6.6", vmime::utility::url::UNSPECIFIED_PORT, u4.getPort());
|
|
ferencd@0
|
123 VASSERT_EQ("6.7", "/path/file", u4.getPath());
|
|
ferencd@0
|
124 }
|
|
ferencd@0
|
125
|
|
ferencd@0
|
126 void testParse2()
|
|
ferencd@0
|
127 {
|
|
ferencd@0
|
128 // Now, test some ill-formed URLs
|
|
ferencd@0
|
129
|
|
ferencd@0
|
130 // -- missing protocol
|
|
ferencd@0
|
131 vmime::utility::url u1("", "");
|
|
ferencd@0
|
132 VASSERT_EQ("1", false, parseHelper(u1, "://host"));
|
|
ferencd@0
|
133
|
|
ferencd@0
|
134 // -- port can contain only digits
|
|
ferencd@0
|
135 vmime::utility::url u2("", "");
|
|
ferencd@0
|
136 VASSERT_EQ("2", false, parseHelper(u2, "proto://host:abc123"));
|
|
ferencd@0
|
137
|
|
ferencd@0
|
138 // -- no host specified
|
|
ferencd@0
|
139 vmime::utility::url u3("", "");
|
|
ferencd@0
|
140 VASSERT_EQ("3", false, parseHelper(u3, "proto:///path"));
|
|
ferencd@0
|
141
|
|
ferencd@0
|
142 // -- no protocol separator (://)
|
|
ferencd@0
|
143 vmime::utility::url u4("", "");
|
|
ferencd@0
|
144 VASSERT_EQ("4", false, parseHelper(u4, "protohost/path"));
|
|
ferencd@0
|
145 }
|
|
ferencd@0
|
146
|
|
ferencd@0
|
147 void testParse3()
|
|
ferencd@0
|
148 {
|
|
ferencd@0
|
149 // Test decoding
|
|
ferencd@0
|
150 vmime::utility::url u1("", "");
|
|
ferencd@0
|
151
|
|
ferencd@0
|
152 VASSERT_EQ("1.1", true, parseHelper(u1, "pro%12to://user%34:pass%56word@ho%78st:12345/pa%abth/"));
|
|
ferencd@0
|
153 VASSERT_EQ("1.2", "pro%12to", u1.getProtocol()); // protocol should not be decoded
|
|
ferencd@0
|
154 VASSERT_EQ("1.3", "user\x34", u1.getUsername());
|
|
ferencd@0
|
155 VASSERT_EQ("1.4", "pass\x56word", u1.getPassword());
|
|
ferencd@0
|
156 VASSERT_EQ("1.5", "ho\x78st", u1.getHost());
|
|
ferencd@0
|
157 VASSERT_EQ("1.6", 12345, u1.getPort());
|
|
ferencd@0
|
158 VASSERT_EQ("1.7", "/pa\xabth/", u1.getPath());
|
|
ferencd@0
|
159 }
|
|
ferencd@0
|
160
|
|
ferencd@0
|
161 void testParse4()
|
|
ferencd@0
|
162 {
|
|
ferencd@0
|
163 // Test parameters
|
|
ferencd@0
|
164 vmime::utility::url u1("", "");
|
|
ferencd@0
|
165
|
|
ferencd@0
|
166 VASSERT_EQ("1.1", true, parseHelper(u1, "proto://host/path?p1=v1&p2=v2"));
|
|
ferencd@0
|
167 VASSERT_EQ("1.2", "v1", u1.getParams()["p1"]);
|
|
ferencd@0
|
168 VASSERT_EQ("1.3", "v2", u1.getParams()["p2"]);
|
|
ferencd@0
|
169 VASSERT_EQ("1.4", "/path", u1.getPath());
|
|
ferencd@0
|
170
|
|
ferencd@0
|
171 vmime::utility::url u2("", "");
|
|
ferencd@0
|
172
|
|
ferencd@0
|
173 VASSERT_EQ("2.1", true, parseHelper(u2, "proto://host/path?p1=v1&p2"));
|
|
ferencd@0
|
174 VASSERT_EQ("2.2", "v1", u2.getParams()["p1"]);
|
|
ferencd@0
|
175 VASSERT_EQ("2.3", "p2", u2.getParams()["p2"]);
|
|
ferencd@0
|
176 VASSERT_EQ("2.4", "/path", u2.getPath());
|
|
ferencd@0
|
177
|
|
ferencd@0
|
178 vmime::utility::url u3("", "");
|
|
ferencd@0
|
179
|
|
ferencd@0
|
180 VASSERT_EQ("3.1", true, parseHelper(u3, "proto://host/?p1=v1&p2=v2"));
|
|
ferencd@0
|
181 VASSERT_EQ("3.2", "v1", u3.getParams()["p1"]);
|
|
ferencd@0
|
182 VASSERT_EQ("3.3", "v2", u3.getParams()["p2"]);
|
|
ferencd@0
|
183 VASSERT_EQ("3.4", "", u3.getPath());
|
|
ferencd@0
|
184
|
|
ferencd@0
|
185 vmime::utility::url u4("", "");
|
|
ferencd@0
|
186
|
|
ferencd@0
|
187 VASSERT_EQ("4.1", true, parseHelper(u4, "proto://host/path?p1=%3D&%3D=v2"));
|
|
ferencd@0
|
188 VASSERT_EQ("4.2", "=", u4.getParams()["p1"]);
|
|
ferencd@0
|
189 VASSERT_EQ("4.3", "v2", u4.getParams()["="]);
|
|
ferencd@0
|
190 VASSERT_EQ("4.4", "/path", u4.getPath());
|
|
ferencd@0
|
191 }
|
|
ferencd@0
|
192
|
|
ferencd@0
|
193 // '@' symbol in the username part
|
|
ferencd@0
|
194 void testParse5()
|
|
ferencd@0
|
195 {
|
|
ferencd@0
|
196 vmime::utility::url u1("", "");
|
|
ferencd@0
|
197
|
|
ferencd@0
|
198 VASSERT_EQ("1", true, parseHelper(u1, "imap://account@myserver.com:password@myserver.com"));
|
|
ferencd@0
|
199 VASSERT_EQ("2", "account@myserver.com", u1.getUsername());
|
|
ferencd@0
|
200 VASSERT_EQ("3", "password", u1.getPassword());
|
|
ferencd@0
|
201 VASSERT_EQ("4", "myserver.com", u1.getHost());
|
|
ferencd@0
|
202 }
|
|
ferencd@0
|
203
|
|
ferencd@0
|
204 void testGenerate()
|
|
ferencd@0
|
205 {
|
|
ferencd@0
|
206 vmime::utility::url u1("proto", "host", 12345, "path", "user", "password");
|
|
ferencd@0
|
207 VASSERT_EQ("1", "proto://user:password@host:12345/path",
|
|
ferencd@0
|
208 static_cast <vmime::string>(u1));
|
|
ferencd@0
|
209
|
|
ferencd@0
|
210 vmime::utility::url u2("proto", "host");
|
|
ferencd@0
|
211 VASSERT_EQ("2", "proto://host", static_cast <vmime::string>(u2));
|
|
ferencd@0
|
212
|
|
ferencd@0
|
213 vmime::utility::url u3("proto", "host");
|
|
ferencd@0
|
214 u3.getParams()["p1"] = "v1";
|
|
ferencd@0
|
215 VASSERT_EQ("3.1", "proto://host/?p1=v1",
|
|
ferencd@0
|
216 static_cast <vmime::string>(u3));
|
|
ferencd@0
|
217 u3.getParams()["p2"] = "v2";
|
|
ferencd@0
|
218 VASSERT_EQ("3.2", "proto://host/?p1=v1&p2=v2",
|
|
ferencd@0
|
219 static_cast <vmime::string>(u3));
|
|
ferencd@0
|
220
|
|
ferencd@0
|
221 // Test special characters
|
|
ferencd@0
|
222 u3.getParams().clear();
|
|
ferencd@0
|
223 u3.getParams()["&"] = "=";
|
|
ferencd@0
|
224 VASSERT_EQ("3.3", "proto://host/?%26=%3D",
|
|
ferencd@0
|
225 static_cast <vmime::string>(u3));
|
|
ferencd@0
|
226 }
|
|
ferencd@0
|
227
|
|
ferencd@0
|
228 void testUtilsEncode()
|
|
ferencd@0
|
229 {
|
|
ferencd@0
|
230 VASSERT_EQ("1", "%01", vmime::utility::urlUtils::encode("\x01"));
|
|
ferencd@0
|
231 VASSERT_EQ("2", "%20", vmime::utility::urlUtils::encode(" "));
|
|
ferencd@0
|
232 VASSERT_EQ("3", "%FF", vmime::utility::urlUtils::encode("\xff"));
|
|
ferencd@0
|
233 VASSERT_EQ("4", "a", vmime::utility::urlUtils::encode("a"));
|
|
ferencd@0
|
234 }
|
|
ferencd@0
|
235
|
|
ferencd@0
|
236 void testUtilsDecode()
|
|
ferencd@0
|
237 {
|
|
ferencd@0
|
238 for (int i = 0 ; i < 255 ; ++i)
|
|
ferencd@0
|
239 {
|
|
ferencd@0
|
240 std::ostringstream ossTest;
|
|
ferencd@0
|
241 ossTest << "%" << "0123456789ABCDEF"[i / 16]
|
|
ferencd@0
|
242 << "0123456789ABCDEF"[i % 16];
|
|
ferencd@0
|
243
|
|
ferencd@0
|
244 std::ostringstream ossNum;
|
|
ferencd@0
|
245 ossNum << i;
|
|
ferencd@0
|
246
|
|
ferencd@0
|
247 vmime::string res;
|
|
ferencd@0
|
248 res += static_cast <unsigned char>(i);
|
|
ferencd@0
|
249
|
|
ferencd@0
|
250 VASSERT_EQ(ossNum.str(), res,
|
|
ferencd@0
|
251 vmime::utility::urlUtils::decode(ossTest.str()));
|
|
ferencd@0
|
252 }
|
|
ferencd@0
|
253
|
|
ferencd@0
|
254 }
|
|
ferencd@0
|
255
|
|
ferencd@0
|
256 void testUtilsDecodeSpecialCases()
|
|
ferencd@0
|
257 {
|
|
ferencd@0
|
258 // Bug #1656547: segfault with '%' at the end of the string
|
|
ferencd@0
|
259 VASSERT_EQ("1.1", "sadfsda%", vmime::utility::urlUtils::decode("sadfsda%"));
|
|
ferencd@0
|
260 VASSERT_EQ("1.2", "sadfsda\x05", vmime::utility::urlUtils::decode("sadfsda%5"));
|
|
ferencd@0
|
261 VASSERT_EQ("1.3", "sadfsda\x42", vmime::utility::urlUtils::decode("sadfsda%42"));
|
|
ferencd@0
|
262 }
|
|
ferencd@0
|
263
|
|
ferencd@0
|
264 void testUtilsEncodeReservedChars()
|
|
ferencd@0
|
265 {
|
|
ferencd@0
|
266 VASSERT_EQ("1", "%24", vmime::utility::urlUtils::encode("$"));
|
|
ferencd@0
|
267 VASSERT_EQ("2", "%26", vmime::utility::urlUtils::encode("&"));
|
|
ferencd@0
|
268 VASSERT_EQ("3", "%2B", vmime::utility::urlUtils::encode("+"));
|
|
ferencd@0
|
269 VASSERT_EQ("4", "%2C", vmime::utility::urlUtils::encode(","));
|
|
ferencd@0
|
270 VASSERT_EQ("5", "%2F", vmime::utility::urlUtils::encode("/"));
|
|
ferencd@0
|
271 VASSERT_EQ("6", "%3A", vmime::utility::urlUtils::encode(":"));
|
|
ferencd@0
|
272 VASSERT_EQ("7", "%3B", vmime::utility::urlUtils::encode(";"));
|
|
ferencd@0
|
273 VASSERT_EQ("8", "%3D", vmime::utility::urlUtils::encode("="));
|
|
ferencd@0
|
274 VASSERT_EQ("9", "%3F", vmime::utility::urlUtils::encode("?"));
|
|
ferencd@0
|
275 VASSERT_EQ("10", "%40", vmime::utility::urlUtils::encode("@"));
|
|
ferencd@0
|
276 }
|
|
ferencd@0
|
277
|
|
ferencd@0
|
278 void testUtilsEncodeUnsafeChars()
|
|
ferencd@0
|
279 {
|
|
ferencd@0
|
280 VASSERT_EQ("1", "%20", vmime::utility::urlUtils::encode(" "));
|
|
ferencd@0
|
281 VASSERT_EQ("2", "%22", vmime::utility::urlUtils::encode("\""));
|
|
ferencd@0
|
282 VASSERT_EQ("3", "%3C", vmime::utility::urlUtils::encode("<"));
|
|
ferencd@0
|
283 VASSERT_EQ("4", "%3E", vmime::utility::urlUtils::encode(">"));
|
|
ferencd@0
|
284 VASSERT_EQ("5", "%23", vmime::utility::urlUtils::encode("#"));
|
|
ferencd@0
|
285 VASSERT_EQ("6", "%25", vmime::utility::urlUtils::encode("%"));
|
|
ferencd@0
|
286 VASSERT_EQ("7", "%7B", vmime::utility::urlUtils::encode("{"));
|
|
ferencd@0
|
287 VASSERT_EQ("8", "%7D", vmime::utility::urlUtils::encode("}"));
|
|
ferencd@0
|
288 VASSERT_EQ("9", "%7C", vmime::utility::urlUtils::encode("|"));
|
|
ferencd@0
|
289 VASSERT_EQ("10", "%5C", vmime::utility::urlUtils::encode("\\"));
|
|
ferencd@0
|
290 VASSERT_EQ("11", "%5E", vmime::utility::urlUtils::encode("^"));
|
|
ferencd@0
|
291 VASSERT_EQ("12", "%7E", vmime::utility::urlUtils::encode("~"));
|
|
ferencd@0
|
292 VASSERT_EQ("13", "%5B", vmime::utility::urlUtils::encode("["));
|
|
ferencd@0
|
293 VASSERT_EQ("14", "%5D", vmime::utility::urlUtils::encode("]"));
|
|
ferencd@0
|
294 VASSERT_EQ("15", "%60", vmime::utility::urlUtils::encode("`"));
|
|
ferencd@0
|
295 }
|
|
ferencd@0
|
296
|
|
ferencd@0
|
297 VMIME_TEST_SUITE_END
|
|
ferencd@0
|
298
|