mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58: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:
parent
56509055d2
commit
0401734dfd
@ -907,7 +907,7 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
|
|||||||
result = curl_mime_headers(part, file->contentheader, 0);
|
result = curl_mime_headers(part, file->contentheader, 0);
|
||||||
|
|
||||||
/* Set the content type. */
|
/* Set the content type. */
|
||||||
if(!result &&file->contenttype)
|
if(!result && file->contenttype)
|
||||||
result = curl_mime_type(part, file->contenttype);
|
result = curl_mime_type(part, file->contenttype);
|
||||||
|
|
||||||
/* Set field name. */
|
/* Set field name. */
|
||||||
|
19
lib/mime.c
19
lib/mime.c
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
------------------------------
|
------------------------------
|
||||||
|
@ -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=----------------------------
|
||||||
|
|
||||||
------------------------------
|
------------------------------
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user