tool: New option --data-raw to HTTP POST data, '@' allowed.

Add new option --data-raw which is almost the same as --data but does
not have a special interpretation of the @ character.

Prior to this change there was no (easy) way to pass the @ character as
the first character in POST data without it being interpreted as a
special character.

Bug: https://github.com/bagder/curl/issues/198
Reported-by: Jens Rantil
This commit is contained in:
Anthony Avina 2015-04-25 14:49:39 -04:00 committed by Jay Satiro
parent f1e0a0aae7
commit 6a7261359b
3 changed files with 15 additions and 7 deletions

View File

@ -315,9 +315,10 @@ presses the submit button. This will cause curl to pass the data to the server
using the content-type application/x-www-form-urlencoded. Compare to using the content-type application/x-www-form-urlencoded. Compare to
\fI-F, --form\fP. \fI-F, --form\fP.
\fI-d, --data\fP is the same as \fI--data-ascii\fP. To post data purely binary, \fI-d, --data\fP is the same as \fI--data-ascii\fP. \fI--data-raw\fP is almost
you should instead use the \fI--data-binary\fP option. To URL-encode the value the same but does not have a special interpretation of the @ character. To
of a form field you may use \fI--data-urlencode\fP. post data purely binary, you should instead use the\fI--data-binary\fP option.
To URL-encode the value of a form field you may use \fI--data-urlencode\fP.
If any of these options is used more than once on the same command line, the If any of these options is used more than once on the same command line, the
data pieces specified will be merged together with a separating data pieces specified will be merged together with a separating
@ -329,7 +330,8 @@ read the data from, or - if you want curl to read the data from
stdin. Multiple files can also be specified. Posting data from a file stdin. Multiple files can also be specified. Posting data from a file
named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is
told to read from a file like that, carriage returns and newlines will be told to read from a file like that, carriage returns and newlines will be
stripped out. stripped out. If you don't want the @ character to have a special
interpretation use \fI--data-raw\fP instead.
.IP "-D, --dump-header <file>" .IP "-D, --dump-header <file>"
Write the protocol headers to the specified file. Write the protocol headers to the specified file.
@ -354,6 +356,10 @@ and carriage returns are preserved and conversions are never done.
If this option is used several times, the ones following the first will append If this option is used several times, the ones following the first will append
data as described in \fI-d, --data\fP. data as described in \fI-d, --data\fP.
.IP "--data-raw <data>"
(HTTP) This posts data similarly to \fI--data\fP but without the special
interpretation of the @ character. See \fI-d, --data\fP.
(Added in 7.43.0)
.IP "--data-urlencode <data>" .IP "--data-urlencode <data>"
(HTTP) This posts data, similar to the other --data options with the exception (HTTP) This posts data, similar to the other --data options with the exception
that this performs URL-encoding. (Added in 7.18.0) that this performs URL-encoding. (Added in 7.18.0)
@ -560,7 +566,7 @@ If this option is enabled and the server sends an invalid (e.g. expired)
response, if the response suggests that the server certificate has been revoked, response, if the response suggests that the server certificate has been revoked,
or no response at all is received, the verification fails. or no response at all is received, the verification fails.
This is currently only implemented in the OpenSSL, GnuTLS and NSS backends. This is currently only implemented in the OpenSSL, GnuTLS and NSS backends.
(Added in 7.41.0) (Added in 7.41.0)
.IP "--false-start" .IP "--false-start"

View File

@ -196,6 +196,7 @@ static const struct LongShort aliases[]= {
{"c", "cookie-jar", TRUE}, {"c", "cookie-jar", TRUE},
{"C", "continue-at", TRUE}, {"C", "continue-at", TRUE},
{"d", "data", TRUE}, {"d", "data", TRUE},
{"dr", "data-raw", TRUE},
{"da", "data-ascii", TRUE}, {"da", "data-ascii", TRUE},
{"db", "data-binary", TRUE}, {"db", "data-binary", TRUE},
{"de", "data-urlencode", TRUE}, {"de", "data-urlencode", TRUE},
@ -1099,6 +1100,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
char *postdata = NULL; char *postdata = NULL;
FILE *file; FILE *file;
size_t size = 0; size_t size = 0;
bool raw_mode = (subletter == 'r');
if(subletter == 'e') { /* --data-urlencode*/ if(subletter == 'e') { /* --data-urlencode*/
/* [name]=[content], we encode the content part only /* [name]=[content], we encode the content part only
@ -1124,7 +1126,6 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
} }
if('@' == is_file) { if('@' == is_file) {
/* a '@' letter, it means that a file name or - (stdin) follows */ /* a '@' letter, it means that a file name or - (stdin) follows */
if(curlx_strequal("-", p)) { if(curlx_strequal("-", p)) {
file = stdin; file = stdin;
set_binmode(stdin); set_binmode(stdin);
@ -1185,7 +1186,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
return PARAM_NO_MEM; return PARAM_NO_MEM;
} }
} }
else if('@' == *nextarg) { else if('@' == *nextarg && !raw_mode) {
/* the data begins with a '@' letter, it means that a file name /* the data begins with a '@' letter, it means that a file name
or - (stdin) follows */ or - (stdin) follows */
nextarg++; /* pass the @ */ nextarg++; /* pass the @ */

View File

@ -65,6 +65,7 @@ static const char *const helptext[] = {
" --crlf Convert LF to CRLF in upload", " --crlf Convert LF to CRLF in upload",
" --crlfile FILE Get a CRL list in PEM format from the given file", " --crlfile FILE Get a CRL list in PEM format from the given file",
" -d, --data DATA HTTP POST data (H)", " -d, --data DATA HTTP POST data (H)",
" --data-raw DATA HTTP POST data, '@' allowed (H)",
" --data-ascii DATA HTTP POST ASCII data (H)", " --data-ascii DATA HTTP POST ASCII data (H)",
" --data-binary DATA HTTP POST binary data (H)", " --data-binary DATA HTTP POST binary data (H)",
" --data-urlencode DATA HTTP POST data url encoded (H)", " --data-urlencode DATA HTTP POST data url encoded (H)",