1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include "common.hh"
#include "urlutil.hh"
#include <gtest/gtest.h>
TEST(urlutil, escape) {
EXPECT_EQ("", url::escape(""));
EXPECT_EQ("foo", url::escape("foo"));
EXPECT_EQ("%2Ffoo%2F", url::escape("/foo/"));
EXPECT_EQ("%252Ffoo%252F", url::escape("%2Ffoo%2F"));
EXPECT_EQ("%FF%00", url::escape(std::string_view("\xff\x00", 2)));
EXPECT_EQ("/foo%20bar/", url::escape("/foo bar/",
url::EscapeFlags::KEEP_SLASH));
}
TEST(urlutil, unescape) {
EXPECT_EQ("", url::unescape(""));
EXPECT_EQ("foo", url::unescape("foo"));
EXPECT_EQ("/foo/", url::unescape("%2Ffoo%2F"));
EXPECT_EQ("%2Ffoo%2F", url::unescape("%252Ffoo%252F"));
EXPECT_EQ(std::string_view("\xff\x00", 2), url::unescape("%FF%00"));
}
TEST(urlutil, unescape_invalid) {
EXPECT_EQ("%", url::unescape("%"));
EXPECT_EQ("%2", url::unescape("%2"));
EXPECT_EQ("%2X", url::unescape("%2X"));
EXPECT_EQ("%X2", url::unescape("%X2"));
EXPECT_EQ("%%%%%", url::unescape("%%%%%"));
}
TEST(urlutil, expand_and_unescape_query) {
auto ret = url::expand_and_unescape_query("");
EXPECT_TRUE(ret.empty());
ret = url::expand_and_unescape_query("foo=bar");
EXPECT_EQ(1, ret.size());
EXPECT_EQ("bar", ret["foo"]);
ret = url::expand_and_unescape_query("foo=bar&fum&a=&foo");
EXPECT_EQ(3, ret.size());
EXPECT_EQ("bar", ret["foo"]);
EXPECT_EQ("", ret["fum"]);
EXPECT_EQ("", ret["a"]);
ret = url::expand_and_unescape_query("foo=b%20a%20r&bar=f+o+o");
EXPECT_EQ(2, ret.size());
EXPECT_EQ("b a r", ret["foo"]);
EXPECT_EQ("f o o", ret["bar"]);
ret = url::expand_and_unescape_query("foo=%26amp%3B&%3D=%25");
EXPECT_EQ(2, ret.size());
EXPECT_EQ("&", ret["foo"]);
EXPECT_EQ("%", ret["="]);
ret = url::expand_and_unescape_query("=");
EXPECT_EQ(1, ret.size());
EXPECT_EQ("", ret[""]);
ret = url::expand_and_unescape_query("&&=&=&&");
EXPECT_EQ(1, ret.size());
EXPECT_EQ("", ret[""]);
ret = url::expand_and_unescape_query("=====");
EXPECT_EQ(1, ret.size());
EXPECT_EQ("====", ret[""]);
}
TEST(urlutil, split_and_unescape_path_and_query) {
std::string path;
std::unordered_map<std::string, std::string> query;
url::split_and_unescape_path_and_query("", path, query);
EXPECT_EQ("", path);
EXPECT_TRUE(query.empty());
url::split_and_unescape_path_and_query("foo", path, query);
EXPECT_EQ("foo", path);
EXPECT_TRUE(query.empty());
url::split_and_unescape_path_and_query("?foo=bar", path, query);
EXPECT_EQ("", path);
EXPECT_EQ(1, query.size());
EXPECT_EQ("bar", query["foo"]);
url::split_and_unescape_path_and_query("foo?foo=bar", path, query);
EXPECT_EQ("foo", path);
EXPECT_EQ(1, query.size());
EXPECT_EQ("bar", query["foo"]);
url::split_and_unescape_path_and_query("%3F%3F%3D", path, query);
EXPECT_EQ("\?\?=", path);
EXPECT_TRUE(query.empty());
}
|