mime: keep "text/plain" content type if user-specified.

Include test cases in 554, 587, 650.

Fixes https://github.com/curl/curl/issues/1986
diff --git a/lib/formdata.c b/lib/formdata.c
index 3568ac5..d0579c5 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -907,7 +907,7 @@
         result = curl_mime_headers(part, file->contentheader, 0);
 
       /* Set the content type. */
-      if(!result &&file->contenttype)
+      if(!result && file->contenttype)
         result = curl_mime_type(part, file->contenttype);
 
       /* Set field name. */
diff --git a/lib/mime.c b/lib/mime.c
index cba95b9..1868336 100644
--- a/lib/mime.c
+++ b/lib/mime.c
@@ -1619,7 +1619,7 @@
 {
   curl_mime *mime = NULL;
   const char *boundary = NULL;
-  char *s;
+  char *customct;
   const char *cte = NULL;
   CURLcode ret = CURLE_OK;
 
@@ -1631,12 +1631,14 @@
   if(part->state.state == MIMESTATE_CURLHEADERS)
     mimesetstate(&part->state, MIMESTATE_CURLHEADERS, NULL);
 
-  /* Build the content-type header. */
-  s = search_header(part->userheaders, "Content-Type");
-  if(s)
-    contenttype = s;
-  if(part->mimetype)
-    contenttype = part->mimetype;
+  /* Check if content type is specified. */
+  customct = part->mimetype;
+  if(!customct)
+    customct = search_header(part->userheaders, "Content-Type");
+  if(customct)
+    contenttype = customct;
+
+  /* If content type is not specified, try to determine it. */
   if(!contenttype) {
     switch(part->kind) {
     case MIMEKIND_MULTIPART:
@@ -1660,7 +1662,8 @@
     if(mime)
       boundary = mime->boundary;
   }
-  else if(contenttype && strcasecompare(contenttype, "text/plain"))
+  else if(contenttype && !customct &&
+          strcasecompare(contenttype, "text/plain"))
     if(strategy == MIMESTRATEGY_MAIL || !part->filename)
       contenttype = NULL;
 
diff --git a/tests/data/test554 b/tests/data/test554
index ce4a14d..24d9c04 100644
--- a/tests/data/test554
+++ b/tests/data/test554
@@ -68,7 +68,7 @@
 POST /554 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 Accept: */*

-Content-Length: 718

+Content-Length: 744

 Content-Type: multipart/form-data; boundary=----------------------------

 

 ------------------------------

@@ -87,6 +87,7 @@
 postit2.c

 ------------------------------

 Content-Disposition: form-data; name="submit"

+Content-Type: text/plain

 

 send

 ------------------------------

@@ -98,7 +99,7 @@
 POST /554 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 Accept: */*

-Content-Length: 732

+Content-Length: 758

 Content-Type: multipart/form-data; boundary=----------------------------

 

 ------------------------------

@@ -117,6 +118,7 @@
 postit2.c

 ------------------------------

 Content-Disposition: form-data; name="submit"

+Content-Type: text/plain

 

 send

 ------------------------------

diff --git a/tests/data/test587 b/tests/data/test587
index 5a845d4..0d9530e 100644
--- a/tests/data/test587
+++ b/tests/data/test587
@@ -43,7 +43,7 @@
 POST /587 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 Accept: */*

-Content-Length: 718

+Content-Length: 744

 Content-Type: multipart/form-data; boundary=----------------------------

 

 ------------------------------

diff --git a/tests/data/test650 b/tests/data/test650
index e07d4c1..1a06064 100644
--- a/tests/data/test650
+++ b/tests/data/test650
@@ -63,9 +63,12 @@
 Content-Type: multipart/form-data; boundary=----------------------------

 Expect: 100-continue

 

-5f0

+60a

 ------------------------------

 Content-Disposition: form-data; name="fieldname"

+Content-Type: text/plain

+X-customheader-1: Header 1 data

+X-customheader-2: Header 2 data

 

 this is what we post to the silly web server

 ------------------------------

@@ -98,15 +101,13 @@
 

 ------------------------------

 Content-Disposition: form-data; name="filecontents"

-X-customheader-1: Header 1 data

-X-customheader-2: Header 2 data

 

 This is data from a file.
 

 ------------------------------

 Content-Disposition: form-data; name="formlength"

 

-1341

+1367

 ------------------------------

 Content-Disposition: form-data; name="standardinput"

 Content-Type: application/octet-stream

diff --git a/tests/libtest/lib554.c b/tests/libtest/lib554.c
index 936d0a1..cc21d24 100644
--- a/tests/libtest/lib554.c
+++ b/tests/libtest/lib554.c
@@ -117,7 +117,7 @@
                         CURLFORM_END);
 
   if(formrc)
-    printf("curl_formadd(1) = %d\n", (int)formrc);
+    printf("curl_formadd(2) = %d\n", (int)formrc);
 
   /* Fill in the filename field */
   formrc = curl_formadd(&formpost,
@@ -134,7 +134,7 @@
                         CURLFORM_END);
 
   if(formrc)
-    printf("curl_formadd(2) = %d\n", (int)formrc);
+    printf("curl_formadd(3) = %d\n", (int)formrc);
 
   /* Fill in a submit field too */
   formrc = curl_formadd(&formpost,
@@ -147,10 +147,11 @@
 #else
                         CURLFORM_COPYCONTENTS, "send",
 #endif
+                        CURLFORM_CONTENTTYPE, "text/plain",
                         CURLFORM_END);
 
   if(formrc)
-    printf("curl_formadd(3) = %d\n", (int)formrc);
+    printf("curl_formadd(4) = %d\n", (int)formrc);
 
   formrc = curl_formadd(&formpost, &lastptr,
                         CURLFORM_COPYNAME, "somename",
@@ -160,7 +161,7 @@
                         CURLFORM_END);
 
   if(formrc)
-    printf("curl_formadd(4) = %d\n", (int)formrc);
+    printf("curl_formadd(5) = %d\n", (int)formrc);
 
   curl = curl_easy_init();
   if(!curl) {
diff --git a/tests/libtest/lib650.c b/tests/libtest/lib650.c
index 130ef1e..60a2e9f 100644
--- a/tests/libtest/lib650.c
+++ b/tests/libtest/lib650.c
@@ -68,10 +68,14 @@
     return TEST_ERR_MAJOR_BAD;
   }
 
-  /* Check proper name and data copying. */
+  /* Check proper name and data copying, as well as headers. */
+  headers = curl_slist_append(headers, "X-customheader-1: Header 1 data");
+  headers = curl_slist_append(headers, "X-customheader-2: Header 2 data");
+  headers = curl_slist_append(headers, "Content-Type: text/plain");
   formrc = curl_formadd(&formpost, &lastptr,
                         CURLFORM_COPYNAME, &name,
                         CURLFORM_COPYCONTENTS, &data,
+                        CURLFORM_CONTENTHEADER, headers,
                         CURLFORM_END);
 
   if(formrc)
@@ -113,18 +117,15 @@
   if(formrc)
     printf("curl_formadd(3) = %d\n", (int) formrc);
 
-  /* Check data from file content and headers. */
-  headers = curl_slist_append(headers, "X-customheader-1: Header 1 data");
-  headers = curl_slist_append(headers, "X-customheader-2: Header 2 data");
+  /* Check data from file content. */
   formrc = curl_formadd(&formpost,
                         &lastptr,
                         CURLFORM_COPYNAME, "filecontents",
                         CURLFORM_FILECONTENT, libtest_arg2,
-                        CURLFORM_CONTENTHEADER, headers,
                         CURLFORM_END);
 
   if(formrc)
-    printf("curl_formadd(3) = %d\n", (int) formrc);
+    printf("curl_formadd(4) = %d\n", (int) formrc);
 
   /* Measure the current form length.
    * This is done before including stdin data because we want to reuse it
@@ -148,7 +149,7 @@
                         CURLFORM_END);
 
   if(formrc)
-    printf("curl_formadd(4) = %d\n", (int) formrc);
+    printf("curl_formadd(5) = %d\n", (int) formrc);
 
   curl = curl_easy_init();
   if(!curl) {