]> granicus.if.org Git - curl/commitdiff
CURLFORM_BUFFER: insert filename as documented
authorDaniel Stenberg <daniel@haxx.se>
Mon, 8 Aug 2011 08:21:03 +0000 (10:21 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 8 Aug 2011 16:45:03 +0000 (18:45 +0200)
A regression where CURLFORM_BUFFER stopped to properly insert the file
name part in the formpart. Bug introduced in commit f851f768578dc096.

Added CURLFORM_BUFFER use to test 554 to verify this.

Bug: http://curl.haxx.se/mail/lib-2011-07/0176.html
Reported by: Henry Ludemann

TODO-RELEASE
lib/formdata.c
tests/data/test554
tests/libtest/lib554.c

index 5a3801534c7ba7fd84e06f966b97b6dfc10f6950..9ce86d78ff5414b97e57e539399fef85517a12e8 100644 (file)
@@ -36,9 +36,6 @@ To be addressed in 7.21.8 (or 7.22.0?)
 301 - "Forcing select on vista"
       http://curl.haxx.se/mail/lib-2011-07/0128.html
 
-302 - "Problem with file upload using CURLFORM_BUFFER" (Regression)
-      Henry Ludemann http://curl.haxx.se/mail/lib-2011-07/0176.html
-
 303 - "Added AUTH NTLM for SMTP" Steve Holme
       http://curl.haxx.se/mail/lib-2011-07/0186.html and
       http://curl.haxx.se/mail/lib-2011-08/0008.html
index 9e3ed08e5812567c64338ab6a5c9516421be79b8..757d9656166aa385701c8fc96e1e890dce3c70e8 100644 (file)
@@ -459,7 +459,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
           if(current_form->flags & HTTPPOST_FILENAME) {
             if(filename) {
               if((current_form = AddFormInfo(strdup(filename),
-                                              NULL, current_form)) == NULL)
+                                             NULL, current_form)) == NULL)
                 return_value = CURL_FORMADD_MEMORY;
             }
             else
@@ -484,46 +484,18 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
         break;
       }
 
-    case CURLFORM_BUFFER:
-      {
-        const char *filename = array_state?array_value:
-          va_arg(params, char *);
-
-        if(current_form->value) {
-          if(current_form->flags & HTTPPOST_BUFFER) {
-            if(filename) {
-              if((current_form = AddFormInfo(strdup(filename),
-                                              NULL, current_form)) == NULL)
-                return_value = CURL_FORMADD_MEMORY;
-            }
-            else
-              return_value = CURL_FORMADD_NULL;
-          }
-          else
-            return_value = CURL_FORMADD_OPTION_TWICE;
-        }
-        else {
-          if(filename) {
-            current_form->value = strdup(filename);
-            if(!current_form->value)
-              return_value = CURL_FORMADD_MEMORY;
-          }
-          else
-            return_value = CURL_FORMADD_NULL;
-          current_form->flags |= HTTPPOST_BUFFER;
-        }
-        break;
-      }
-
     case CURLFORM_BUFFERPTR:
-      current_form->flags |= HTTPPOST_PTRBUFFER;
+      current_form->flags |= HTTPPOST_PTRBUFFER|HTTPPOST_BUFFER;
       if(current_form->buffer)
         return_value = CURL_FORMADD_OPTION_TWICE;
       else {
         char *buffer =
           array_state?array_value:va_arg(params, char *);
-        if(buffer)
+        if(buffer) {
           current_form->buffer = buffer; /* store for the moment */
+          current_form->value = buffer; /* make it non-NULL to be accepted
+                                           as fine */
+        }
         else
           return_value = CURL_FORMADD_NULL;
       }
@@ -564,8 +536,8 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
           if(current_form->flags & HTTPPOST_FILENAME) {
             if(contenttype) {
               if((current_form = AddFormInfo(NULL,
-                                              strdup(contenttype),
-                                              current_form)) == NULL)
+                                             strdup(contenttype),
+                                             current_form)) == NULL)
                 return_value = CURL_FORMADD_MEMORY;
             }
             else
@@ -603,6 +575,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
         break;
       }
     case CURLFORM_FILENAME:
+    case CURLFORM_BUFFER:
       {
         const char *filename = array_state?array_value:
           va_arg(params, char *);
@@ -619,6 +592,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
       }
     default:
       return_value = CURL_FORMADD_UNKNOWN_OPTION;
+      break;
     }
   }
 
@@ -922,7 +896,8 @@ void curl_formfree(struct curl_httppost *form)
 
     if(!(form->flags & HTTPPOST_PTRNAME) && form->name)
       free(form->name); /* free the name */
-    if(!(form->flags & (HTTPPOST_PTRCONTENTS|HTTPPOST_CALLBACK)) &&
+    if(!(form->flags &
+         (HTTPPOST_PTRCONTENTS|HTTPPOST_BUFFER|HTTPPOST_CALLBACK)) &&
        form->contents)
       free(form->contents); /* free the contents */
     if(form->contenttype)
index 7fdc353fcc75c653d112a3b4659f79504207842e..9d9bbcca74b211ddc93a82bf86f1bc6dad2e94ba 100644 (file)
@@ -45,7 +45,7 @@ s/boundary=----------------------------[a-z0-9]*/boundary=----------------------
 POST /554 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
-Content-Length: 561\r
+Content-Length: 732\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------\r
 \r
@@ -67,6 +67,11 @@ postit2.c
 Content-Disposition: form-data; name="submit"\r
 \r
 send\r
+------------------------------\r
+Content-Disposition: form-data; name="somename"; filename="somefile.txt"\r
+Content-Type: application/octet-stream\r
+\r
+blah blah\r
 --------------------------------\r
 </protocol>
 </verify>
index ed8d13f0504fa4dbba10edfe4435de233d36ed5a..8e71c8899f168275d7bf7f4114cbf85e1e4049c4 100644 (file)
@@ -136,6 +136,16 @@ int test(char *URL)
   if(formrc)
     printf("curl_formadd(3) = %d\n", (int)formrc);
 
+  formrc = curl_formadd(&formpost, &lastptr,
+                        CURLFORM_COPYNAME, "somename",
+                        CURLFORM_BUFFER, "somefile.txt",
+                        CURLFORM_BUFFERPTR, "blah blah",
+                        CURLFORM_BUFFERLENGTH, 9,
+                        CURLFORM_END);
+
+  if(formrc)
+    printf("curl_formadd(4) = %d\n", (int)formrc);
+
   if ((curl = curl_easy_init()) == NULL) {
     fprintf(stderr, "curl_easy_init() failed\n");
     curl_formfree(formpost);