From 6a7261359b4c7ebddff0c096468047077e7d06ef Mon Sep 17 00:00:00 2001 From: Anthony Avina Date: Sat, 25 Apr 2015 14:49:39 -0400 Subject: 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 --- docs/curl.1 | 16 +++++++++++----- src/tool_getparam.c | 5 +++-- src/tool_help.c | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/curl.1 b/docs/curl.1 index 21d85c931..7b988d043 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -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 \fI-F, --form\fP. -\fI-d, --data\fP is the same as \fI--data-ascii\fP. To 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. +\fI-d, --data\fP is the same as \fI--data-ascii\fP. \fI--data-raw\fP is almost +the same but does not have a special interpretation of the @ character. To +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 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 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 -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 " 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 data as described in \fI-d, --data\fP. +.IP "--data-raw " +(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 " (HTTP) This posts data, similar to the other --data options with the exception 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, 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) .IP "--false-start" diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 121afc44d..1b5d6d2b0 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -196,6 +196,7 @@ static const struct LongShort aliases[]= { {"c", "cookie-jar", TRUE}, {"C", "continue-at", TRUE}, {"d", "data", TRUE}, + {"dr", "data-raw", TRUE}, {"da", "data-ascii", TRUE}, {"db", "data-binary", TRUE}, {"de", "data-urlencode", TRUE}, @@ -1099,6 +1100,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ char *postdata = NULL; FILE *file; size_t size = 0; + bool raw_mode = (subletter == 'r'); if(subletter == 'e') { /* --data-urlencode*/ /* [name]=[content], we encode the content part only @@ -1124,7 +1126,6 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ } if('@' == is_file) { /* a '@' letter, it means that a file name or - (stdin) follows */ - if(curlx_strequal("-", p)) { file = stdin; set_binmode(stdin); @@ -1185,7 +1186,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ return PARAM_NO_MEM; } } - else if('@' == *nextarg) { + else if('@' == *nextarg && !raw_mode) { /* the data begins with a '@' letter, it means that a file name or - (stdin) follows */ nextarg++; /* pass the @ */ diff --git a/src/tool_help.c b/src/tool_help.c index 2f7fefd97..ef26ded0a 100644 --- a/src/tool_help.c +++ b/src/tool_help.c @@ -65,6 +65,7 @@ static const char *const helptext[] = { " --crlf Convert LF to CRLF in upload", " --crlfile FILE Get a CRL list in PEM format from the given file", " -d, --data DATA HTTP POST data (H)", + " --data-raw DATA HTTP POST data, '@' allowed (H)", " --data-ascii DATA HTTP POST ASCII data (H)", " --data-binary DATA HTTP POST binary data (H)", " --data-urlencode DATA HTTP POST data url encoded (H)", -- cgit v1.2.3