diff options
author | Patrick Monnerat <patrick@monnerat.net> | 2017-09-03 14:45:43 +0100 |
---|---|---|
committer | Patrick Monnerat <patrick@monnerat.net> | 2017-09-03 14:45:43 +0100 |
commit | 1a3f4c19919b09ff0fd0ba228b06a217d85d4265 (patch) | |
tree | 12c70f11b95ded1acfac5b28eeb7499d0ec99e59 /src | |
parent | 045b076ae8362006f6977a80e6a5e3ef0eb903eb (diff) | |
download | curl-1a3f4c19919b09ff0fd0ba228b06a217d85d4265.tar.gz |
mime: remove support "-" stdin pseudo-file name in curl_mime_filedata().
This feature is badly supported in Windows: as a replacement, a caller has
to use curl_mime_data_cb() with fread, fseek and possibly fclose
callbacks to process opened files.
The cli tool and documentation are updated accordingly.
The feature is however kept internally for form API compatibility, with
the known caveats it always had.
As a side effect, stdin size is not determined by the cli tool even if
possible and this results in a chunked transfer encoding. Test 173 is
updated accordingly.
Diffstat (limited to 'src')
-rw-r--r-- | src/tool_formparse.c | 23 | ||||
-rw-r--r-- | src/tool_setopt.c | 8 |
2 files changed, 24 insertions, 7 deletions
diff --git a/src/tool_formparse.c b/src/tool_formparse.c index cf19c0508..fc5162eed 100644 --- a/src/tool_formparse.c +++ b/src/tool_formparse.c @@ -347,6 +347,21 @@ static int get_param_part(struct OperationConfig *config, char **str, return sep & 0xFF; } +/* Check if file is "-". If so, use a callback to read OUR stdin (to + * workaround Windows DLL file handle caveat). + * Else use curl_mime_filedata(). */ +static CURLcode file_or_stdin(curl_mimepart *part, const char *file) +{ + CURLcode ret = CURLE_OK; + + if(strcmp(file, "-")) + return curl_mime_filedata(part, file); + + return curl_mime_data_cb(part, -1, (curl_read_callback) fread, + (curl_seek_callback) fseek, NULL, stdin); +} + + /*************************************************************************** * * formparse() @@ -547,9 +562,9 @@ int formparse(struct OperationConfig *config, } /* Setup file in part. */ - res = curl_mime_filedata(part, data); + res = file_or_stdin(part, data); if(res) { - warnf(config->global, "curl_mime_filedata failed!\n"); + warnf(config->global, "setting file %s failed!\n", data); if(res != CURLE_READ_ERROR) { if(subparts != *mimecurrent) curl_mime_free(subparts); @@ -619,9 +634,9 @@ int formparse(struct OperationConfig *config, } /* Setup file in part. */ - res = curl_mime_filedata(part, data); + res = file_or_stdin(part, data); if(res) { - warnf(config->global, "curl_mime_filedata failed!\n"); + warnf(config->global, "setting file %s failed!\n", data); if(res != CURLE_READ_ERROR) { Curl_safefree(contents); return 22; diff --git a/src/tool_setopt.c b/src/tool_setopt.c index 4e25e9e12..19646ea69 100644 --- a/src/tool_setopt.c +++ b/src/tool_setopt.c @@ -450,9 +450,11 @@ static CURLcode libcurl_generate_mime(curl_mime *mime, int *mimeno) filename = part->filename; } break; - case MIMEKIND_FILE: - /* Can only be stdin in the current context. */ - CODE1("curl_mime_file(part%d, \"-\");", *mimeno); + case MIMEKIND_CALLBACK: + /* Can only be reading stdin in the current context. */ + CODE1("curl_mime_data_cb(part%d, -1, (curl_read_callback) fread, \\", + *mimeno); + CODE0(" (curl_seek_callback) fseek, NULL, stdin);"); break; case MIMEKIND_DATA: #ifdef CURL_DOES_CONVERSIONS |