diff options
author | Patrick Monnerat <patrick@monnerat.net> | 2021-10-25 12:58:37 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2021-11-15 10:40:03 +0100 |
commit | b20b364764cca2d577640126494fe2b09ae22e5d (patch) | |
tree | 78846a017865e51309fa64bc9bed29c8c6a63b09 /src | |
parent | 6ec28eb68729240cd359803dd2f65cb3d5b03f42 (diff) | |
download | curl-b20b364764cca2d577640126494fe2b09ae22e5d.tar.gz |
mime: use percent-escaping for multipart form field and file names
Until now, form field and file names where escaped using the
backslash-escaping algorithm defined for multipart mails. This commit
replaces this with the percent-escaping method for URLs.
As this may introduce incompatibilities with server-side applications, a
new libcurl option CURLOPT_MIME_OPTIONS with bitmask
CURLMIMEOPT_FORMESCAPE is introduced to revert to legacy use of
backslash-escaping. This is controlled by new cli tool option
--form-escape.
New tests and documentation are provided for this feature.
Reported by: Ryan Sleevi
Fixes #7789
Closes #7805
Diffstat (limited to 'src')
-rw-r--r-- | src/tool_cfgable.h | 1 | ||||
-rw-r--r-- | src/tool_getparam.c | 7 | ||||
-rw-r--r-- | src/tool_listhelp.c | 3 | ||||
-rw-r--r-- | src/tool_operate.c | 4 |
4 files changed, 15 insertions, 0 deletions
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index eff55f95d..227b914e3 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -239,6 +239,7 @@ struct OperationConfig { char *ftp_account; /* for ACCT */ char *ftp_alternative_to_user; /* send command if USER/PASS fails */ int ftp_filemethod; + long mime_options; /* Mime option flags. */ long tftp_blksize; /* TFTP BLKSIZE option */ bool tftp_no_options; /* do not send TFTP options requests */ bool ignorecl; /* --ignore-content-length */ diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 1fe7d5d09..7abbcc639 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -138,6 +138,7 @@ static const struct LongShort aliases[]= { {"$h", "retry-delay", ARG_STRING}, {"$i", "retry-max-time", ARG_STRING}, {"$k", "proxy-negotiate", ARG_BOOL}, + {"$l", "form-escape", ARG_BOOL}, {"$m", "ftp-account", ARG_STRING}, {"$n", "proxy-anyauth", ARG_BOOL}, {"$o", "trace-time", ARG_BOOL}, @@ -988,6 +989,12 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ return PARAM_LIBCURL_DOESNT_SUPPORT; break; + case 'l': /* --form-escape */ + config->mime_options &= ~CURLMIMEOPT_FORMESCAPE; + if(toggle) + config->mime_options |= CURLMIMEOPT_FORMESCAPE; + break; + case 'm': /* --ftp-account */ GetStr(&config->ftp_account, nextarg); break; diff --git a/src/tool_listhelp.c b/src/tool_listhelp.c index ce92ec02c..4bb9fd4b5 100644 --- a/src/tool_listhelp.c +++ b/src/tool_listhelp.c @@ -193,6 +193,9 @@ const struct helptxt helptext[] = { {"-F, --form <name=content>", "Specify multipart MIME data", CURLHELP_HTTP | CURLHELP_UPLOAD}, + {" --form-escape", + "Escape multipart form field/file names using backslash", + CURLHELP_HTTP | CURLHELP_POST}, {" --form-string <name=string>", "Specify multipart MIME data", CURLHELP_HTTP | CURLHELP_UPLOAD}, diff --git a/src/tool_operate.c b/src/tool_operate.c index ed3b2f56a..bbf743dab 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -1325,6 +1325,10 @@ static CURLcode single_transfer(struct GlobalConfig *global, if(result) break; + /* new in libcurl 7.81.0 */ + if(config->mime_options) + my_setopt(curl, CURLOPT_MIME_OPTIONS, config->mime_options); + /* new in libcurl 7.10.6 (default is Basic) */ if(config->authtype) my_setopt_bitmask(curl, CURLOPT_HTTPAUTH, (long)config->authtype); |