21 #include "absl/status/status.h"
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
41 const std::map<absl::string_view, absl::string_view>& query_param_map,
42 const std::vector<URI::QueryParam>& query_param_pairs,
61 TestSucceeds(
"http://www.google.com",
"http",
"www.google.com",
"", {}, {},
63 TestSucceeds(
"dns:///foo",
"dns",
"",
"/foo", {}, {},
"");
64 TestSucceeds(
"http://www.google.com:90",
"http",
"www.google.com:90",
"", {},
66 TestSucceeds(
"a192.4-df:foo.coom",
"a192.4-df",
"",
"foo.coom", {}, {},
"");
67 TestSucceeds(
"a+b:foo.coom",
"a+b",
"",
"foo.coom", {}, {},
"");
68 TestSucceeds(
"zookeeper://127.0.0.1:2181/foo/bar",
"zookeeper",
69 "127.0.0.1:2181",
"/foo/bar", {}, {},
"");
70 TestSucceeds(
"dns:foo.com#fragment-all-the-things",
"dns",
"",
"foo.com", {},
71 {},
"fragment-all-the-things");
72 TestSucceeds(
"http://localhost:8080/whatzit?mi_casa=su_casa",
"http",
73 "localhost:8080",
"/whatzit", {{
"mi_casa",
"su_casa"}},
74 {{
"mi_casa",
"su_casa"}},
"");
75 TestSucceeds(
"http://localhost:8080/whatzit?1=2#buckle/my/shoe",
"http",
76 "localhost:8080",
"/whatzit", {{
"1",
"2"}}, {{
"1",
"2"}},
81 TestSucceeds(
"scheme:path//is/ok",
"scheme",
"",
"path//is/ok", {}, {},
"");
82 TestSucceeds(
"http:?legit",
"http",
"",
"", {{
"legit",
""}}, {{
"legit",
""}},
84 TestSucceeds(
"unix:#this-is-ok-too",
"unix",
"",
"", {}, {},
86 TestSucceeds(
"http:?legit#twice",
"http",
"",
"", {{
"legit",
""}},
87 {{
"legit",
""}},
"twice");
88 TestSucceeds(
"fake:///",
"fake",
"",
"/", {}, {},
"");
89 TestSucceeds(
"http://local%25host:8080/whatz%25it?1%25=2%25#fragment",
"http",
90 "local%host:8080",
"/whatz%it", {{
"1%",
"2%"}}, {{
"1%",
"2%"}},
95 TestSucceeds(
"http://foo/path?a&b=B&c=&#frag",
"http",
"foo",
"/path",
96 {{
"c",
""}, {
"a",
""}, {
"b",
"B"}},
97 {{
"a",
""}, {
"b",
"B"}, {
"c",
""}},
"frag");
102 "http://localhost:8080/?too=many=equals&are=present=here#fragged",
"http",
103 "localhost:8080",
"/", {{
"are",
"present=here"}, {
"too",
"many=equals"}},
104 {{
"too",
"many=equals"}, {
"are",
"present=here"}},
"fragged");
105 TestSucceeds(
"http://auth/path?foo=bar=baz&foobar===",
"http",
"auth",
106 "/path", {{
"foo",
"bar=baz"}, {
"foobar",
"=="}},
107 {{
"foo",
"bar=baz"}, {
"foobar",
"=="}},
"");
111 RepeatedQueryParamsAreSupportedInOrderedPairsButDeduplicatedInTheMap) {
145 URI* del_uri2 =
new URI(uri_copy);
146 URI uri_copy2(*del_uri2);
153 "https://foo.com:5555/v1/"
154 "token-exchange?subject_token=eyJhbGciO&subject_token_type=urn:ietf:"
155 "params:oauth:token-type:id_token",
156 "https",
"foo.com:5555",
"/v1/token-exchange",
157 {{
"subject_token",
"eyJhbGciO"},
158 {
"subject_token_type",
"urn:ietf:params:oauth:token-type:id_token"}},
159 {{
"subject_token",
"eyJhbGciO"},
160 {
"subject_token_type",
"urn:ietf:params:oauth:token-type:id_token"}},
165 TestSucceeds(
"http://www.google.com?yay-i'm-using-queries",
"http",
166 "www.google.com",
"", {{
"yay-i'm-using-queries",
""}},
167 {{
"yay-i'm-using-queries",
""}},
"");
171 TestSucceeds(
"ipv6:[2001:db8::1%252]:12345",
"ipv6",
"",
172 "[2001:db8::1%2]:12345", {}, {},
"");
173 TestSucceeds(
"ipv6:[fe80::90%eth1.sky1]:6010",
"ipv6",
"",
174 "[fe80::90%eth1.sky1]:6010", {}, {},
"");
178 PreviouslyReservedCharactersInUnrelatedURIPartsAreIgnored) {
181 TestSucceeds(
"http://foo?bar#lol?",
"http",
"foo",
"", {{
"bar",
""}},
182 {{
"bar",
""}},
"lol?");
183 TestSucceeds(
"http://foo?bar#lol?/",
"http",
"foo",
"", {{
"bar",
""}},
184 {{
"bar",
""}},
"lol?/");
188 TestSucceeds(
"https://www.google.com/?a=1%26b%3D2&c=3",
"https",
189 "www.google.com",
"/", {{
"c",
"3"}, {
"a",
"1&b=2"}},
190 {{
"a",
"1&b=2"}, {
"c",
"3"}},
"");
194 TestSucceeds(
"x:y?%xx",
"x",
"",
"y", {{
"%xx",
""}}, {{
"%xx",
""}},
"");
195 TestSucceeds(
"http:?dangling-pct-%0",
"http",
"",
"",
196 {{
"dangling-pct-%0",
""}}, {{
"dangling-pct-%0",
""}},
"");
201 TestSucceeds(
std::string(
"unix-abstract:\0should-be-ok", 27),
"unix-abstract",
202 "",
std::string(
"\0should-be-ok", 13), {}, {},
"");
206 TestSucceeds(
"unix-abstract:%00x",
"unix-abstract",
"",
std::string(
"\0x", 2),
212 TestFails(
"http://foo?[bar]");
213 TestFails(
"http://foo?x[bar]");
214 TestFails(
"http://foo?bar#lol#");
216 TestFails(
":no_scheme");
217 TestFails(
"0invalid_scheme:must_start/with?alpha");
220 TEST(URITest, PercentEncodePath) {
223 "abcdefghijklmnopqrstuvwxyz"
224 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
229 "abcdefghijklmnopqrstuvwxyz"
230 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
233 "%5C%3F%25%23%5B%5D%5E");
238 URI::Create(
"http",
"server.example.com",
"/path/to/file.html", {},
"");
241 EXPECT_EQ(uri->authority(),
"server.example.com");
242 EXPECT_EQ(uri->path(),
"/path/to/file.html");
246 EXPECT_EQ(
"http://server.example.com/path/to/file.html", uri->ToString());
250 auto uri =
URI::Create(
"http",
"",
"/path/to/file.html", {},
"");
254 EXPECT_EQ(uri->path(),
"/path/to/file.html");
258 EXPECT_EQ(
"http:/path/to/file.html", uri->ToString());
261 TEST(URITest, NoAuthorityRelativePath) {
262 auto uri =
URI::Create(
"http",
"",
"path/to/file.html", {},
"");
266 EXPECT_EQ(uri->path(),
"path/to/file.html");
270 EXPECT_EQ(
"http:path/to/file.html", uri->ToString());
273 TEST(URITest, AuthorityRelativePath) {
275 URI::Create(
"http",
"server.example.com",
"path/to/file.html", {},
"");
279 "if authority is present, path must start with a '/'");
283 auto uri =
URI::Create(
"http",
"server.example.com",
"/path/to/file.html",
284 {{
"key",
"value"}, {
"key2",
"value2"}},
"");
287 EXPECT_EQ(uri->authority(),
"server.example.com");
288 EXPECT_EQ(uri->path(),
"/path/to/file.html");
290 uri->query_parameter_pairs(),
300 EXPECT_EQ(
"http://server.example.com/path/to/file.html?key=value&key2=value2",
304 TEST(URITest, DuplicateQueryParams) {
306 "http",
"server.example.com",
"/path/to/file.html",
307 {{
"key",
"value"}, {
"key2",
"value2"}, {
"key",
"other_value"}},
"");
310 EXPECT_EQ(uri->authority(),
"server.example.com");
311 EXPECT_EQ(uri->path(),
"/path/to/file.html");
313 uri->query_parameter_pairs(),
327 "http://server.example.com/path/to/file.html"
328 "?key=value&key2=value2&key=other_value",
333 auto uri =
URI::Create(
"http",
"server.example.com",
"/path/to/file.html", {},
337 EXPECT_EQ(uri->authority(),
"server.example.com");
338 EXPECT_EQ(uri->path(),
"/path/to/file.html");
342 EXPECT_EQ(
"http://server.example.com/path/to/file.html#fragment",
346 TEST(URITest, QueryParamsAndFragment) {
347 auto uri =
URI::Create(
"http",
"server.example.com",
"/path/to/file.html",
348 {{
"key",
"value"}, {
"key2",
"value2"}},
"fragment");
351 EXPECT_EQ(uri->authority(),
"server.example.com");
352 EXPECT_EQ(uri->path(),
"/path/to/file.html");
354 uri->query_parameter_pairs(),
365 "http://server.example.com/path/to/"
366 "file.html?key=value&key2=value2#fragment",
370 TEST(URITest, ToStringPercentEncoding) {
373 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-."
375 "%:/?#[]@!$&'()*,;=",
377 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
378 "-.+~!$&'()*+,;=:[]@"
382 "/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
387 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
392 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
397 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
398 "-._~!$'()*+,;:@/?=&"
403 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-."
404 "%:/?#[]@!$&'()*,;=");
406 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
407 "-.+~!$&'()*+,;=:[]@"
410 "/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
414 uri->query_parameter_pairs(),
418 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
423 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
427 uri->query_parameter_map(),
429 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
432 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
436 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
437 "-._~!$'()*+,;:@/?=&"
441 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-."
442 "%25%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2C%3B%3D"
444 "://abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
445 "-.+~!$&'()*+,;=:[]@"
448 "/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
452 "?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
455 "=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
459 "#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
460 "-._~!$'()*+,;:@/?=&"
467 int main(
int argc,
char** argv) {