From: Daniel Stenberg Date: Mon, 3 Aug 2026 10:51:02 +0000 (+0200) Subject: lib1560: add CURLU_NO_GUESS_SCHEME tests X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=HEAD;p=thirdparty%2Fcurl.git lib1560: add CURLU_NO_GUESS_SCHEME tests Closes #22469 --- diff --git a/tests/data/test1560 b/tests/data/test1560 index f4cbaa8e0e..a710c8a683 100644 --- a/tests/data/test1560 +++ b/tests/data/test1560 @@ -36,7 +36,7 @@ lib%TESTNUMBER success -Allocations: 3550 +Allocations: 3650 diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c index fafdd8de99..e18b2d6508 100644 --- a/tests/libtest/lib1560.c +++ b/tests/libtest/lib1560.c @@ -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;