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:
parent
9df8dc101b
commit
9aa8ff2895
@ -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
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
@ -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",
|
||||||
|
Loading…
Reference in New Issue
Block a user