1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-24 09:08:49 -05:00

urlapi: only skip encoding the first '=' with APPENDQUERY set

APPENDQUERY + URLENCODE would skip all equals signs but now it only skip
encoding the first to better allow "name=content" for any content.

Reported-by: Alexey Melnichuk
Fixes #3231
Closes #3231
This commit is contained in:
Daniel Stenberg 2018-11-06 23:48:35 +01:00
parent 9df8dc101b
commit 9aa8ff2895
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 13 additions and 7 deletions

View File

@ -71,12 +71,13 @@ automatically when this URL is read from the handle.
The query part will also get spaces converted to pluses when asked to URL The query part will also get spaces converted to pluses when asked to URL
encode on set with the CURLU_URLENCODE bit. encode on set with the CURLU_URLENCODE bit.
If used in with \fICURLU_APPENDQUERY\fP, the provided part will be appended on If used together with the \fICURLU_APPENDQUERY\fP bit, the provided part will
the end of the existing query - and if the previous part didn't end with an be appended on the end of the existing query - and if the previous part didn't
ampersand (&), an ampersand will be inserted before the new appended part. end with an ampersand (&), an ampersand will be inserted before the new
appended part.
When \fICURLU_APPENDQUERY\fP is used together with \fICURLU_URLENCODE\fP, When \fICURLU_APPENDQUERY\fP is used together with \fICURLU_URLENCODE\fP, the
the '=' symbols will not be URL encoded. first '=' symbol will not be URL encoded.
The question mark in the URL is not part of the actual query contents. The question mark in the URL is not part of the actual query contents.
.IP CURLUPART_FRAGMENT .IP CURLUPART_FRAGMENT

View File

@ -1103,6 +1103,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
bool plusencode = FALSE; bool plusencode = FALSE;
bool urlskipslash = FALSE; bool urlskipslash = FALSE;
bool appendquery = FALSE; bool appendquery = FALSE;
bool equalsencode = FALSE;
if(!u) if(!u)
return CURLUE_BAD_HANDLE; return CURLUE_BAD_HANDLE;
@ -1183,6 +1184,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
case CURLUPART_QUERY: case CURLUPART_QUERY:
plusencode = urlencode; plusencode = urlencode;
appendquery = (flags & CURLU_APPENDQUERY)?1:0; appendquery = (flags & CURLU_APPENDQUERY)?1:0;
equalsencode = appendquery;
storep = &u->query; storep = &u->query;
break; break;
case CURLUPART_FRAGMENT: case CURLUPART_FRAGMENT:
@ -1276,8 +1278,11 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
for(i = part, o = enc; *i; i++) { for(i = part, o = enc; *i; i++) {
if(Curl_isunreserved(*i) || if(Curl_isunreserved(*i) ||
((*i == '/') && urlskipslash) || ((*i == '/') && urlskipslash) ||
((*i == '=') && appendquery) || ((*i == '=') && equalsencode) ||
((*i == '+') && plusencode)) { ((*i == '+') && plusencode)) {
if((*i == '=') && equalsencode)
/* only skip the first equals sign */
equalsencode = FALSE;
*o = *i; *o = *i;
o++; o++;
} }

View File

@ -723,7 +723,7 @@ static int get_parts(void)
static struct querycase append_list[] = { static struct querycase append_list[] = {
{"HTTP://test/?s", "name=joe\x02", "http://test/?s&name=joe%02", {"HTTP://test/?s", "name=joe\x02", "http://test/?s&name=joe%02",
0, CURLU_URLENCODE, CURLUE_OK}, 0, CURLU_URLENCODE, CURLUE_OK},
{"HTTP://test/?size=2#f", "name=joe=", "http://test/?size=2&name=joe=#f", {"HTTP://test/?size=2#f", "name=joe=", "http://test/?size=2&name=joe%3d#f",
0, CURLU_URLENCODE, CURLUE_OK}, 0, CURLU_URLENCODE, CURLUE_OK},
{"HTTP://test/?size=2#f", "name=joe doe", {"HTTP://test/?size=2#f", "name=joe doe",
"http://test/?size=2&name=joe+doe#f", "http://test/?size=2&name=joe+doe#f",