Unverified Commit 9aa8ff28 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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
parent 9df8dc10
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -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
+6 −1
Original line number Original line Diff line number Diff line
@@ -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++;
        }
        }
+1 −1
Original line number Original line Diff line number Diff line
@@ -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",