urlapi: drop base fragment on empty redirect

Extended test 1560 to verify

Fixes #21745
Closes #21763
This commit is contained in:
tiymat 2026-05-26 23:32:32 -02:30 committed by Daniel Stenberg
parent 4ff212f8ed
commit 780ccb256e
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
3 changed files with 33 additions and 3 deletions

View file

@ -1721,8 +1721,11 @@ static CURLUcode set_url(CURLU *u, const char *url, size_t part_size,
and this is a redirect */
uc = curl_url_get(u, CURLUPART_URL, &oldurl, flags);
if(!uc) {
/* success, meaning the "" is a fine relative URL, but nothing
changes */
/* success, meaning the "" is a fine relative URL, and the new URL
inherits scheme/authority/path/query, but not fragment, from the
existing URL (RFC 3986 section 5.2.2) */
curlx_safefree(u->fragment);
u->fragment_present = FALSE;
curlx_free(oldurl);
return CURLUE_OK;
}

View file

@ -37,7 +37,7 @@ lib%TESTNUMBER
success
</stdout>
<limits>
Allocations: 3200
Allocations: 3250
</limits>
</verify>
</testcase>

View file

@ -1356,6 +1356,33 @@ static const struct redircase set_url_list[] = {
"", /* blank redirect */
"https://example.com/",
0, 0, CURLUE_OK },
{"file:///test?test#test",
"", "file:///test?test",
0, 0, CURLUE_OK},
{"https://example.com/path?query#frag",
"", "https://example.com/path?query",
0, 0, CURLUE_OK},
{"ftp://example.com/dir/file#anchor",
"", "ftp://example.com/dir/file",
0, 0, CURLUE_OK},
{"http://example.com/path#frag",
"", "http://example.com/path",
0, 0, CURLUE_OK},
{"http://example.com/#frag",
"", "http://example.com/",
0, 0, CURLUE_OK},
{"http://user:pass@example.com/path?query#frag",
"", "http://user:pass@example.com/path?query",
0, 0, CURLUE_OK},
{"http://example.com:8080/path?query#frag",
"", "http://example.com:8080/path?query",
0, 0, CURLUE_OK},
{"https://user:pass@example.com:8443/path?query#frag",
"", "https://user:pass@example.com:8443/path?query",
0, 0, CURLUE_OK},
{"http://[::1]/path#frag",
"", "http://[::1]/path",
0, 0, CURLUE_OK},
{"http://firstplace.example.com/want/1314",
"//somewhere.example.com/reply/1314",
"http://somewhere.example.com/reply/1314",