urlapi: URL encoding for the URL missed the fragment

Meaning that it would wrongly still store the fragment using spaces
instead of %20 if allowing space while also asking for URL encoding.

Discovered when playing with trurl.

Added test to lib1560 to verify the fix.

Closes #10887
This commit is contained in:
Daniel Stenberg 2023-04-04 16:59:59 +02:00
parent 4399a532e9
commit f042e1e75d
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 21 additions and 7 deletions

View file

@ -1131,15 +1131,26 @@ static CURLUcode parseurl(const char *url, CURLU *u, unsigned int flags)
fraglen = strlen(fragment);
if(fraglen > 1) {
/* skip the leading '#' in the copy but include the terminating null */
u->fragment = Curl_memdup(fragment + 1, fraglen);
if(!u->fragment) {
result = CURLUE_OUT_OF_MEMORY;
goto fail;
if(flags & CURLU_URLENCODE) {
struct dynbuf enc;
Curl_dyn_init(&enc, CURL_MAX_INPUT_LENGTH);
if(urlencode_str(&enc, fragment + 1, fraglen, TRUE, FALSE)) {
result = CURLUE_OUT_OF_MEMORY;
goto fail;
}
u->fragment = Curl_dyn_ptr(&enc);
}
else {
u->fragment = Curl_memdup(fragment + 1, fraglen);
if(!u->fragment) {
result = CURLUE_OUT_OF_MEMORY;
goto fail;
}
if(junkscan(u->fragment, flags)) {
result = CURLUE_BAD_FRAGMENT;
goto fail;
if(junkscan(u->fragment, flags)) {
result = CURLUE_BAD_FRAGMENT;
goto fail;
}
}
}
}