mime: simplify Curl_mime_prepare_headers

Make add_content_disposition() a sub function for that single purpose.

Closes #21490
This commit is contained in:
Daniel Stenberg 2026-05-04 10:50:50 +02:00
parent 6f26ecb734
commit f69ba0408e
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2

View file

@ -1692,6 +1692,52 @@ static bool content_type_match(const char *contenttype,
return FALSE;
}
static CURLcode add_content_disposition(struct Curl_easy *data,
curl_mimepart *part,
const char *disposition,
const char *contenttype,
enum mimestrategy strategy)
{
if(!disposition)
if(part->filename || part->name ||
(contenttype && !curl_strnequal(contenttype, "multipart/", 10)))
disposition = DISPOSITION_DEFAULT;
if(disposition && curl_strequal(disposition, "attachment") &&
!part->name && !part->filename)
disposition = NULL;
if(disposition) {
CURLcode result = CURLE_OK;
char *name = NULL;
char *filename = NULL;
if(part->name) {
name = escape_string(data, part->name, strategy);
if(!name)
return CURLE_OUT_OF_MEMORY;
}
if(part->filename) {
filename = escape_string(data, part->filename, strategy);
if(!filename)
result = CURLE_OUT_OF_MEMORY;
}
if(!result)
result = Curl_mime_add_header(&part->curlheaders,
"Content-Disposition: %s%s%s%s%s%s%s",
disposition,
name ? "; name=\"" : "",
name ? name : "",
name ? "\"" : "",
filename ? "; filename=\"" : "",
filename ? filename : "",
filename ? "\"" : "");
curlx_safefree(name);
curlx_safefree(filename);
if(result)
return result;
}
return CURLE_OK;
}
CURLcode Curl_mime_prepare_headers(struct Curl_easy *data,
curl_mimepart *part,
const char *contenttype,
@ -1750,42 +1796,10 @@ CURLcode Curl_mime_prepare_headers(struct Curl_easy *data,
/* Issue content-disposition header only if not already set by caller. */
if(!search_header(part->userheaders, STRCONST("Content-Disposition"))) {
if(!disposition)
if(part->filename || part->name ||
(contenttype && !curl_strnequal(contenttype, "multipart/", 10)))
disposition = DISPOSITION_DEFAULT;
if(disposition && curl_strequal(disposition, "attachment") &&
!part->name && !part->filename)
disposition = NULL;
if(disposition) {
char *name = NULL;
char *filename = NULL;
if(part->name) {
name = escape_string(data, part->name, strategy);
if(!name)
result = CURLE_OUT_OF_MEMORY;
}
if(!result && part->filename) {
filename = escape_string(data, part->filename, strategy);
if(!filename)
result = CURLE_OUT_OF_MEMORY;
}
if(!result)
result = Curl_mime_add_header(&part->curlheaders,
"Content-Disposition: %s%s%s%s%s%s%s",
disposition,
name ? "; name=\"" : "",
name ? name : "",
name ? "\"" : "",
filename ? "; filename=\"" : "",
filename ? filename : "",
filename ? "\"" : "");
curlx_safefree(name);
curlx_safefree(filename);
if(result)
return result;
}
result = add_content_disposition(data, part, disposition,
contenttype, strategy);
if(result)
return result;
}
/* Issue Content-Type header. */