diff options
-rw-r--r-- | lib/formdata.c | 20 | ||||
-rw-r--r-- | tests/data/test554 | 11 | ||||
-rw-r--r-- | tests/libtest/lib554.c | 18 |
3 files changed, 37 insertions, 12 deletions
diff --git a/lib/formdata.c b/lib/formdata.c index 5419371de..aa5a79ac1 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -1134,15 +1134,17 @@ CURLcode Curl_getformdata(struct SessionHandle *data, /* it should be noted that for the HTTPPOST_FILENAME and HTTPPOST_CALLBACK cases the ->showfilename struct member is always assigned at this point */ - char *filebasename= - (!post->showfilename)?strippath(post->contents):NULL; - - result = AddFormDataf(&form, &size, - "; filename=\"%s\"", - (post->showfilename?post->showfilename: - filebasename)); - if(filebasename) - free(filebasename); + if(post->showfilename || (post->flags & HTTPPOST_FILENAME)) { + char *filebasename= + (!post->showfilename)?strippath(post->contents):NULL; + + result = AddFormDataf(&form, &size, + "; filename=\"%s\"", + (post->showfilename?post->showfilename: + filebasename)); + if(filebasename) + free(filebasename); + } if(result) break; diff --git a/tests/data/test554 b/tests/data/test554 index 134f7ef97..7fdc353fc 100644 --- a/tests/data/test554 +++ b/tests/data/test554 @@ -39,13 +39,13 @@ s/^------------------------------[a-z0-9]*/------------------------------/ s/boundary=----------------------------[a-z0-9]*/boundary=----------------------------/ </strippart> # Note that the stripping above removes 12 bytes from every occurance of the -# boundary string and since 4 of them are in the body contents, we see -# 415 - (4*12) here == 367 bytes. +# boundary string and since 5 of them are in the body contents, we see +# (5*12) == 60 bytes less <protocol> POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 415
+Content-Length: 561
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------
@@ -55,6 +55,11 @@ Content-Disposition: form-data; name="sendfile"; filename="postit2.c" this is what we post to the silly web server ------------------------------
+Content-Disposition: form-data; name="callbackdata"
+
+this is what we post to the silly web server +
+------------------------------
Content-Disposition: form-data; name="filename"
postit2.c
diff --git a/tests/libtest/lib554.c b/tests/libtest/lib554.c index d510268e7..ed8d13f05 100644 --- a/tests/libtest/lib554.c +++ b/tests/libtest/lib554.c @@ -64,6 +64,7 @@ int test(char *URL) struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; struct WriteThis pooh; + struct WriteThis pooh2; if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { fprintf(stderr, "curl_global_init() failed\n"); @@ -85,6 +86,23 @@ int test(char *URL) if(formrc) printf("curl_formadd(1) = %d\n", (int)formrc); + /* Now add the same data with another name and make it not look like + a file upload but still using the callback */ + + pooh2.readptr = data; + pooh2.sizeleft = strlen(data); + + /* Fill in the file upload field */ + formrc = curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "callbackdata", + CURLFORM_STREAM, &pooh2, + CURLFORM_CONTENTSLENGTH, pooh2.sizeleft, + CURLFORM_END); + + if(formrc) + printf("curl_formadd(1) = %d\n", (int)formrc); + /* Fill in the filename field */ formrc = curl_formadd(&formpost, &lastptr, |