urlapi: support CURLU_URLENCODE for curl_url_get()

This commit is contained in:
Daniel Stenberg 2022-06-08 16:32:46 +02:00
parent db8cfdc8f7
commit c3fc406ebb
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -175,14 +175,17 @@ static size_t strlen_url(const char *url, bool relative)
* the source URL accordingly.
* URL encoding should be skipped for host names, otherwise IDN resolution
* will fail.
*
* Returns TRUE if something was updated.
*/
static void strcpy_url(char *output, const char *url, bool relative)
static bool strcpy_url(char *output, const char *url, bool relative)
{
/* we must add this with whitespace-replacing */
bool left = TRUE;
const unsigned char *iptr;
char *optr = output;
const unsigned char *host_sep = (const unsigned char *) url;
bool changed = FALSE;
if(!relative)
host_sep = (const unsigned char *) find_host_sep(url);
@ -204,6 +207,7 @@ static void strcpy_url(char *output, const char *url, bool relative)
}
else
*optr++='+'; /* add a '+' here */
changed = TRUE;
continue;
}
@ -212,6 +216,7 @@ static void strcpy_url(char *output, const char *url, bool relative)
if(urlchar_needs_escaping(*iptr)) {
msnprintf(optr, 4, "%%%02x", *iptr);
changed = TRUE;
optr += 3;
}
else
@ -219,6 +224,7 @@ static void strcpy_url(char *output, const char *url, bool relative)
}
*optr = 0; /* null-terminate output buffer */
return changed;
}
/*
@ -1436,6 +1442,19 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
}
*part = decoded;
}
if(urlencode) {
/* worst case output length is 3x the original! */
char *newp = malloc(strlen(*part) * 3);
if(!newp)
return CURLUE_OUT_OF_MEMORY;
if(strcpy_url(newp, *part, TRUE)) { /* consider it relative */
free(*part);
*part = newp;
}
else
free(newp);
}
return CURLUE_OK;
}
else