lib1560: add CURLU_NO_GUESS_SCHEME tests

Closes #22469
This commit is contained in:
Daniel Stenberg 2026-08-03 12:51:02 +02:00
parent a2b178d378
commit 1f860394e6
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 87 additions and 1 deletions

View file

@ -36,7 +36,7 @@ lib%TESTNUMBER
success
</stdout>
<limits>
Allocations: 3550
Allocations: 3650
</limits>
</verify>
</testcase>

View file

@ -2416,12 +2416,98 @@ static int test_api_errors(void)
return 0;
}
struct guessscheme1560 {
const char *url;
bool expectedfail; /* the URL should fail to parse */
unsigned int setflags;
const char *scheme;
unsigned int getflags;
};
static int test_scheme_guess(void)
{
const struct guessscheme1560 g[] = {
{ "https://example.com", FALSE, 0, "https", 0 },
{ "example.com", TRUE, 0, NULL, 0 },
{ "example.com", FALSE, CURLU_GUESS_SCHEME, "http", 0 },
{ "ftp.example.com:22", FALSE, CURLU_GUESS_SCHEME, "ftp", 0 },
{ "ftp.example.com/foo", FALSE, CURLU_GUESS_SCHEME,
NULL, CURLU_NO_GUESS_SCHEME },
{ "dict.example.com:33", FALSE, CURLU_GUESS_SCHEME, "dict", 0 },
{ "dict.example.com/bar", FALSE, CURLU_GUESS_SCHEME,
NULL, CURLU_NO_GUESS_SCHEME },
{ "ldap.example.com#none", FALSE, CURLU_GUESS_SCHEME, "ldap", 0 },
{ "ldap.example.com?special", FALSE, CURLU_GUESS_SCHEME,
NULL, CURLU_NO_GUESS_SCHEME },
{ "smtp.example.com?hey#ho", FALSE, CURLU_GUESS_SCHEME, "smtp", 0 },
{ "smtp.example.com:99/moo", FALSE, CURLU_GUESS_SCHEME,
NULL, CURLU_NO_GUESS_SCHEME },
{ "pop3.example.com:100#foobar", FALSE, CURLU_GUESS_SCHEME, "pop3", 0 },
{ "pop3.example.com:101?gg", FALSE, CURLU_GUESS_SCHEME,
NULL, CURLU_NO_GUESS_SCHEME },
{ "example.com", FALSE, CURLU_GUESS_SCHEME, NULL, CURLU_NO_GUESS_SCHEME },
{ "https://example.com", FALSE, CURLU_GUESS_SCHEME,
"https", CURLU_NO_GUESS_SCHEME },
{ "foobar://example.com", FALSE,
CURLU_GUESS_SCHEME|CURLU_NON_SUPPORT_SCHEME,
"foobar", CURLU_NO_GUESS_SCHEME },
{ "foobar://example.com", FALSE, CURLU_NON_SUPPORT_SCHEME,
"foobar", CURLU_NO_GUESS_SCHEME },
{ "foobar://example.com", FALSE, CURLU_NON_SUPPORT_SCHEME, "foobar", 0 },
};
int error = 0;
unsigned int i;
for(i = 0; i < CURL_ARRAYSIZE(g) && !error; i++) {
CURLU *u = curl_url();
char *schemep = NULL;
if(u) {
int rc = curl_url_set(u, CURLUPART_URL, g[i].url, g[i].setflags);
if(!rc) {
rc = curl_url_get(u, CURLUPART_SCHEME, &schemep, g[i].getflags);
if(!rc && !schemep) {
curl_mfprintf(stderr, "%u: returned success but no scheme\n", i);
error++;
}
else if(rc && schemep) {
curl_mfprintf(stderr, "%u: returned error but with scheme\n", i);
error++;
}
}
else if(!g[i].expectedfail) {
curl_mfprintf(stderr, "%u: URL parsing failed unexpectedly\n", i);
error++;
}
}
if(!schemep && g[i].scheme) {
curl_mfprintf(stderr, "%u: got no scheme when %s was expected\n", i,
g[i].scheme);
error++;
}
else if(schemep && !g[i].scheme) {
curl_mfprintf(stderr, "%u: got scheme %s when none was expected\n", i,
schemep);
error++;
}
else if(schemep && g[i].scheme && strcmp(schemep, g[i].scheme)) {
curl_mfprintf(stderr, "%u: got scheme %s when %s was expected\n", i,
schemep, g[i].scheme);
error++;
}
curl_free(schemep);
curl_url_cleanup(u);
}
return error;
}
static CURLcode test_lib1560(const char *URL)
{
bool has_utf8 = !!getenv("CURL_TEST_HAVE_CODESET_UTF8");
(void)URL;
if(test_scheme_guess())
return (CURLcode)13;
if(test_api_errors())
return (CURLcode)12;