This option adds a piece of data, usually a name + value pair, to the
end of the URL query part. The syntax is identical to that used for
--data-urlencode with one extension:

If the argument starts with a '+' (plus), the rest of the string is
provided as-is unencoded.

This allows users to "build" query parts with options and URL encoding
even when not doing GET requests, which the already provided option -G
(--get) is limited to.

This idea was born in a Twitter thread.

Closes #9691
This commit is contained in:
Daniel Stenberg 2022-11-05 00:10:24 +01:00
Родитель 43232b5992
Коммит b6e1afd069
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
8 изменённых файлов: 70 добавлений и 4 удалений

Просмотреть файл

@ -265,6 +265,7 @@ DPAGES = \
unix-socket.d \
upload-file.d \
url.d \
url-query.d \
use-ascii.d \
user-agent.d \
user.d \

Просмотреть файл

@ -0,0 +1,25 @@
c: Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
SPDX-License-Identifier: curl
Long: url-query
Arg: <data>
Help: Add a URL query part
Protocols: all
See-also: data-urlencode get
Added: 7.87.0
Category: http post upload
Example: --url-query name=val $URL
Example: --url-query =encodethis http://example.net/foo
Example: --url-query name@file $URL
Example: --url-query @fileonly $URL
Example: --url-query "+name=%20foo" $URL
Multi: append
---
This option adds a piece of data, usually a name + value pair, to the end of
the URL query part. The syntax is identical to that used for --data-urlencode
with one extension:
If the argument starts with a '+' (plus), the rest of the string is provided
as-is unencoded.
The query part of a URL is the one following the question mark on the right
end.

Просмотреть файл

@ -251,6 +251,7 @@
--unix-socket 7.40.0
--upload-file (-T) 4.0
--url 7.5
--url-query 7.87.0
--use-ascii (-B) 5.0
--user (-u) 4.0
--user-agent (-A) 4.5.1

Просмотреть файл

@ -58,6 +58,7 @@ static void free_config_fields(struct OperationConfig *config)
curl_slist_free_all(config->cookiefiles);
Curl_safefree(config->postfields);
Curl_safefree(config->query);
Curl_safefree(config->referer);
Curl_safefree(config->headerfile);

Просмотреть файл

@ -70,6 +70,7 @@ struct OperationConfig {
char *postfields;
curl_off_t postfieldsize;
char *referer;
char *query;
long timeout_ms;
long connecttimeout_ms;
long maxredirs;

Просмотреть файл

@ -41,6 +41,7 @@
#include "tool_paramhlp.h"
#include "tool_parsecfg.h"
#include "tool_main.h"
#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
@ -233,6 +234,7 @@ static const struct LongShort aliases[]= {
{"db", "data-binary", ARG_STRING},
{"de", "data-urlencode", ARG_STRING},
{"df", "json", ARG_STRING},
{"dg", "url-query", ARG_STRING},
{"D", "dump-header", ARG_FILENAME},
{"e", "referer", ARG_STRING},
{"E", "cert", ARG_FILENAME},
@ -1567,7 +1569,39 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
size_t size = 0;
bool raw_mode = (subletter == 'r');
if(subletter == 'e') { /* --data-urlencode */
if(subletter == 'g') { /* --url-query */
#define MAX_QUERY_LEN 100000 /* larger is not likely to ever work */
char *query;
struct curlx_dynbuf dyn;
curlx_dyn_init(&dyn, MAX_QUERY_LEN);
if(*nextarg == '+') {
/* use without encoding */
query = strdup(&nextarg[1]);
if(!query)
return PARAM_NO_MEM;
}
else {
err = data_urlencode(global, nextarg, &query, &size);
if(err)
return err;
}
if(config->query) {
CURLcode result =
curlx_dyn_addf(&dyn, "%s&%s", config->query, query);
free(query);
if(result)
return PARAM_NO_MEM;
free(config->query);
config->query = curlx_dyn_ptr(&dyn);
}
else
config->query = query;
break; /* this is not a POST argument at all */
}
else if(subletter == 'e') { /* --data-urlencode */
err = data_urlencode(global, nextarg, &postdata, &size);
if(err)
return err;

Просмотреть файл

@ -756,6 +756,9 @@ const struct helptxt helptext[] = {
{" --url <url>",
"URL to work with",
CURLHELP_CURL},
{" --url-query <data>",
"Add a URL query part",
CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{"-B, --use-ascii",
"Use ASCII/text transfer",
CURLHELP_MISC},

Просмотреть файл

@ -1189,14 +1189,14 @@ static CURLcode single_transfer(struct GlobalConfig *global,
global->isatty = orig_isatty;
}
if(httpgetfields) {
if(httpgetfields || config->query) {
char *q = httpgetfields ? httpgetfields : config->query;
CURLU *uh = curl_url();
if(uh) {
char *updated;
if(curl_url_set(uh, CURLUPART_URL, per->this_url,
CURLU_GUESS_SCHEME) ||
curl_url_set(uh, CURLUPART_QUERY, httpgetfields,
CURLU_APPENDQUERY) ||
curl_url_set(uh, CURLUPART_QUERY, q, CURLU_APPENDQUERY) ||
curl_url_get(uh, CURLUPART_URL, &updated, CURLU_GUESS_SCHEME)) {
curl_url_cleanup(uh);
result = CURLE_OUT_OF_MEMORY;