* clean up in the end.
*/
curl_easy_cleanup(curl);
+
+ /* Free multipart message. */
+ curl_mime_free(mime);
}
return (int)res;
\fIpart\fP is the part's to assign contents to.
\fIfilename\fP points to the nul-terminated file's path name. The pointer can
be NULL to detach previous part contents settings.
-If \fIfilename\fP is "-", part contents data will be read from stdin.
Filename storage can be safely be reused after this call.
As a side effect, the part's remote file name is set to the base name of the
clen = -1;
if(post->flags & (HTTPPOST_FILENAME | HTTPPOST_READFILE)) {
- result = curl_mime_filedata(part, file->contents);
+ if(!strcmp(file->contents, "-"))
+ result = Curl_mime_file(part, stdin, 0);
+ else
+ result = curl_mime_filedata(part, file->contents);
if(!result && (post->flags & HTTPPOST_READFILE))
result = curl_mime_filename(part, NULL);
}
targetstate = MIMESTATE_BODY;
if(part->state.state > targetstate) {
res = CURL_SEEKFUNC_CANTSEEK;
- if(part->seekfunc)
+ if(part->seekfunc) {
res = part->seekfunc(part->arg, part->origin, SEEK_SET);
+ switch(res) {
+ case CURL_SEEKFUNC_OK:
+ case CURL_SEEKFUNC_FAIL:
+ case CURL_SEEKFUNC_CANTSEEK:
+ break;
+ default:
+ res = CURL_SEEKFUNC_FAIL;
+ break;
+ }
+ }
}
if(res == CURL_SEEKFUNC_OK)
if(!part || !filename)
return CURLE_BAD_FUNCTION_ARGUMENT;
- if(!strcmp(filename, "-"))
- return Curl_mime_file(part, stdin, 0);
-
if(stat(filename, &sbuf) || access(filename, R_OK))
result = CURLE_READ_ERROR;
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()
}
/* 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);
}
/* 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;
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
User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6\r
Host: %HOSTIP:%HTTPPORT\r
Accept: */*\r
-Content-Length: 360\r
+Transfer-Encoding: chunked\r
+Expect: 100-continue\r
Content-Type: multipart/form-data; boundary=----------------------------5dbea401cd8c\r
\r
+168\r
------------------------------5dbea401cd8c\r
Content-Disposition: form-data; name="field1"\r
\r
line8
\r
------------------------------5dbea401cd8c--\r
+\r
+0\r
+\r
</protocol>
</verify>
</testcase>