mirror of
https://github.com/curl/curl.git
synced 2025-01-30 14:22:33 +08:00
urlapi: support CURLU_URLENCODE for curl_url_get()
This commit is contained in:
parent
db8cfdc8f7
commit
c3fc406ebb
21
lib/urlapi.c
21
lib/urlapi.c
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user