1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 15:48:49 -05:00

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

Include test cases in 554, 587, 650.

Fixes https://github.com/curl/curl/issues/1986
This commit is contained in:
Patrick Monnerat 2017-10-12 19:36:16 +01:00
parent 56509055d2
commit 0401734dfd
7 changed files with 35 additions and 27 deletions

View File

@ -1619,7 +1619,7 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
{ {
curl_mime *mime = NULL; curl_mime *mime = NULL;
const char *boundary = NULL; const char *boundary = NULL;
char *s; char *customct;
const char *cte = NULL; const char *cte = NULL;
CURLcode ret = CURLE_OK; CURLcode ret = CURLE_OK;
@ -1631,12 +1631,14 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
if(part->state.state == MIMESTATE_CURLHEADERS) if(part->state.state == MIMESTATE_CURLHEADERS)
mimesetstate(&part->state, MIMESTATE_CURLHEADERS, NULL); mimesetstate(&part->state, MIMESTATE_CURLHEADERS, NULL);
/* Build the content-type header. */ /* Check if content type is specified. */
s = search_header(part->userheaders, "Content-Type"); customct = part->mimetype;
if(s) if(!customct)
contenttype = s; customct = search_header(part->userheaders, "Content-Type");
if(part->mimetype) if(customct)
contenttype = part->mimetype; contenttype = customct;
/* If content type is not specified, try to determine it. */
if(!contenttype) { if(!contenttype) {
switch(part->kind) { switch(part->kind) {
case MIMEKIND_MULTIPART: case MIMEKIND_MULTIPART:
@ -1660,7 +1662,8 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
if(mime) if(mime)
boundary = mime->boundary; boundary = mime->boundary;
} }
else if(contenttype && strcasecompare(contenttype, "text/plain")) else if(contenttype && !customct &&
strcasecompare(contenttype, "text/plain"))
if(strategy == MIMESTRATEGY_MAIL || !part->filename) if(strategy == MIMESTRATEGY_MAIL || !part->filename)
contenttype = NULL; contenttype = NULL;

View File

@ -68,7 +68,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
POST /554 HTTP/1.1 POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT Host: %HOSTIP:%HTTPPORT
Accept: */* Accept: */*
Content-Length: 718 Content-Length: 744
Content-Type: multipart/form-data; boundary=---------------------------- Content-Type: multipart/form-data; boundary=----------------------------
------------------------------ ------------------------------
@ -87,6 +87,7 @@ Content-Disposition: form-data; name="filename"
postit2.c postit2.c
------------------------------ ------------------------------
Content-Disposition: form-data; name="submit" Content-Disposition: form-data; name="submit"
Content-Type: text/plain
send send
------------------------------ ------------------------------
@ -98,7 +99,7 @@ blah blah
POST /554 HTTP/1.1 POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT Host: %HOSTIP:%HTTPPORT
Accept: */* Accept: */*
Content-Length: 732 Content-Length: 758
Content-Type: multipart/form-data; boundary=---------------------------- Content-Type: multipart/form-data; boundary=----------------------------
------------------------------ ------------------------------
@ -117,6 +118,7 @@ Content-Disposition: form-data; name="filename"
postit2.c postit2.c
------------------------------ ------------------------------
Content-Disposition: form-data; name="submit" Content-Disposition: form-data; name="submit"
Content-Type: text/plain
send send
------------------------------ ------------------------------

View File

@ -43,7 +43,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
POST /587 HTTP/1.1 POST /587 HTTP/1.1
Host: %HOSTIP:%HTTPPORT Host: %HOSTIP:%HTTPPORT
Accept: */* Accept: */*
Content-Length: 718 Content-Length: 744
Content-Type: multipart/form-data; boundary=---------------------------- Content-Type: multipart/form-data; boundary=----------------------------
------------------------------ ------------------------------

View File

@ -63,9 +63,12 @@ Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=---------------------------- Content-Type: multipart/form-data; boundary=----------------------------
Expect: 100-continue Expect: 100-continue
5f0 60a
------------------------------ ------------------------------
Content-Disposition: form-data; name="fieldname" 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 this is what we post to the silly web server
------------------------------ ------------------------------
@ -98,15 +101,13 @@ This is data from a file.
------------------------------ ------------------------------
Content-Disposition: form-data; name="filecontents" Content-Disposition: form-data; name="filecontents"
X-customheader-1: Header 1 data
X-customheader-2: Header 2 data
This is data from a file. This is data from a file.
------------------------------ ------------------------------
Content-Disposition: form-data; name="formlength" Content-Disposition: form-data; name="formlength"
1341 1367
------------------------------ ------------------------------
Content-Disposition: form-data; name="standardinput" Content-Disposition: form-data; name="standardinput"
Content-Type: application/octet-stream Content-Type: application/octet-stream

View File

@ -117,7 +117,7 @@ static int once(char *URL, bool oldstyle)
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
printf("curl_formadd(1) = %d\n", (int)formrc); printf("curl_formadd(2) = %d\n", (int)formrc);
/* Fill in the filename field */ /* Fill in the filename field */
formrc = curl_formadd(&formpost, formrc = curl_formadd(&formpost,
@ -134,7 +134,7 @@ static int once(char *URL, bool oldstyle)
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
printf("curl_formadd(2) = %d\n", (int)formrc); printf("curl_formadd(3) = %d\n", (int)formrc);
/* Fill in a submit field too */ /* Fill in a submit field too */
formrc = curl_formadd(&formpost, formrc = curl_formadd(&formpost,
@ -147,10 +147,11 @@ static int once(char *URL, bool oldstyle)
#else #else
CURLFORM_COPYCONTENTS, "send", CURLFORM_COPYCONTENTS, "send",
#endif #endif
CURLFORM_CONTENTTYPE, "text/plain",
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
printf("curl_formadd(3) = %d\n", (int)formrc); printf("curl_formadd(4) = %d\n", (int)formrc);
formrc = curl_formadd(&formpost, &lastptr, formrc = curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "somename", CURLFORM_COPYNAME, "somename",
@ -160,7 +161,7 @@ static int once(char *URL, bool oldstyle)
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
printf("curl_formadd(4) = %d\n", (int)formrc); printf("curl_formadd(5) = %d\n", (int)formrc);
curl = curl_easy_init(); curl = curl_easy_init();
if(!curl) { if(!curl) {

View File

@ -68,10 +68,14 @@ int test(char *URL)
return TEST_ERR_MAJOR_BAD; 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, formrc = curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, &name, CURLFORM_COPYNAME, &name,
CURLFORM_COPYCONTENTS, &data, CURLFORM_COPYCONTENTS, &data,
CURLFORM_CONTENTHEADER, headers,
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
@ -113,18 +117,15 @@ int test(char *URL)
if(formrc) if(formrc)
printf("curl_formadd(3) = %d\n", (int) formrc); printf("curl_formadd(3) = %d\n", (int) formrc);
/* Check data from file content and headers. */ /* Check data from file content. */
headers = curl_slist_append(headers, "X-customheader-1: Header 1 data");
headers = curl_slist_append(headers, "X-customheader-2: Header 2 data");
formrc = curl_formadd(&formpost, formrc = curl_formadd(&formpost,
&lastptr, &lastptr,
CURLFORM_COPYNAME, "filecontents", CURLFORM_COPYNAME, "filecontents",
CURLFORM_FILECONTENT, libtest_arg2, CURLFORM_FILECONTENT, libtest_arg2,
CURLFORM_CONTENTHEADER, headers,
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
printf("curl_formadd(3) = %d\n", (int) formrc); printf("curl_formadd(4) = %d\n", (int) formrc);
/* Measure the current form length. /* Measure the current form length.
* This is done before including stdin data because we want to reuse it * This is done before including stdin data because we want to reuse it
@ -148,7 +149,7 @@ int test(char *URL)
CURLFORM_END); CURLFORM_END);
if(formrc) if(formrc)
printf("curl_formadd(4) = %d\n", (int) formrc); printf("curl_formadd(5) = %d\n", (int) formrc);
curl = curl_easy_init(); curl = curl_easy_init();
if(!curl) { if(!curl) {