Skip to content

Commit 9e98e44

Browse files
committed
url: introduce git_net_url_matches_pattern_list
Provide a utility method on a url to determine if it matches any pattern in a comma-separated list, similar to what one would find in `NO_PROXY` environment variables.
1 parent e5ba0a3 commit 9e98e44

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

src/net.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,25 @@ bool git_net_url_matches_pattern(git_net_url *url, const char *pattern)
459459
return matches_pattern(url, pattern, strlen(pattern));
460460
}
461461

462+
bool git_net_url_matches_pattern_list(
463+
git_net_url *url,
464+
const char *pattern_list)
465+
{
466+
const char *pattern, *pattern_end, *sep;
467+
468+
for (pattern = pattern_list;
469+
pattern && *pattern;
470+
pattern = sep ? sep + 1 : NULL) {
471+
sep = strchr(pattern, ',');
472+
pattern_end = sep ? sep : strchr(pattern, '\0');
473+
474+
if (matches_pattern(url, pattern, (pattern_end - pattern)))
475+
return true;
476+
}
477+
478+
return false;
479+
}
480+
462481
void git_net_url_dispose(git_net_url *url)
463482
{
464483
if (url->username)

src/net.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ extern int git_net_url_fmt_path(git_buf *buf, git_net_url *url);
5858
extern bool git_net_url_matches_pattern(
5959
git_net_url *url,
6060
const char *pattern);
61+
extern bool git_net_url_matches_pattern_list(
62+
git_net_url *url,
63+
const char *pattern_list);
6164

6265
/** Disposes the contents of the structure. */
6366
extern void git_net_url_dispose(git_net_url *url);

tests/network/url/pattern.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,52 @@ void test_network_url_pattern__single(void)
5252
git_net_url_dispose(&url);
5353
}
5454
}
55+
56+
void test_network_url_pattern__list(void)
57+
{
58+
git_net_url url;
59+
size_t i;
60+
61+
struct url_pattern url_patterns[] = {
62+
/* Wildcard matches */
63+
{ "https://example.com/", "", false },
64+
{ "https://example.com/", "*", true },
65+
{ "https://example.com/", ",example.com,", true },
66+
{ "https://example.com/", "foo,,example.com,,bar", true },
67+
{ "https://example.com/", "foo,,zzz,,*,,bar", true },
68+
69+
/* Literals */
70+
{ "https://example.com/", "example.com", true },
71+
{ "https://example.com/", "foo.bar,example.com", true },
72+
{ "https://example.com/", "foo.bar", false },
73+
{ "https://example.com/", "foo.bar,example.org", false },
74+
{ "https://www.example.com/", "foo.example.com,www.example.com,bar.example.com", true },
75+
{ "https://www.example.com/", "foo.example.com,baz.example.com,bar.example.com", false },
76+
{ "https://foo.example.com/", "www.example.com", false },
77+
{ "https://foo.example.com/", "bar.example.com,www.example.com,", false },
78+
79+
/* Wildcards */
80+
{ "https://example.com/", ".example.com", true },
81+
{ "https://example.com/", "*.example.com", true },
82+
{ "https://example.com/", "foo.com,bar.com,.example.com", true },
83+
{ "https://example.com/", ".foo.com,.bar.com,.example.com", true },
84+
{ "https://example.com/", ".foo.com,.bar.com,asdf.com", false },
85+
{ "https://example.com/", "*.foo,*.bar,*.example.com,*.asdf", true },
86+
{ "https://example.com/", "*.foo,*.bar,*.asdf", false },
87+
88+
89+
/* Ports! */
90+
{ "https://example.com/", "example.com:443", true },
91+
{ "https://example.com/", "example.com:42,example.com:443,example.com:99", true },
92+
{ "https://example.com/", "example.com:42,example.com:80,example.org:443", false },
93+
{ "https://example.com:1443/", "example.com", true },
94+
{ "https://example.com:44/", "example.com:443", false },
95+
{ "https://example.com:443/", "example.com:44", false },
96+
};
97+
98+
for (i = 0; i < ARRAY_SIZE(url_patterns); i++) {
99+
cl_git_pass(git_net_url_parse(&url, url_patterns[i].url));
100+
cl_assert_(git_net_url_matches_pattern_list(&url, url_patterns[i].pattern) == url_patterns[i].matches, url_patterns[i].pattern);
101+
git_net_url_dispose(&url);
102+
}
103+
}

0 commit comments

Comments
 (0)