Yves Lejeune fixed so that replacing Content-Type: when doing multipart

formposts work exactly the way you want it (and the way you'd assume it
works)
This commit is contained in:
Daniel Stenberg 2006-07-27 22:35:09 +00:00
Родитель e6ea8f1199
Коммит a88deadd6f
5 изменённых файлов: 31 добавлений и 12 удалений

Просмотреть файл

@ -6,6 +6,11 @@
Changelog
Daniel (28 July 2006)
- Yves Lejeune fixed so that replacing Content-Type: when doing multipart
formposts work exactly the way you want it (and the way you'd assume it
works).
Daniel (27 July 2006)
- David McCreedy added --ftp-ssl-reqd which makes curl *require* SSL for both
control and data connection, as the existing --ftp-ssl option only requests

Просмотреть файл

@ -24,6 +24,7 @@ This release includes the following changes:
This release includes the following bugfixes:
o changing Content-Type when doing formposts
o added CURL_EXTERN to a few recent multi functions that lacked them
o splay-tree related problems for internal expire time handling
o FTP ASCII CRLF counter reset
@ -48,6 +49,6 @@ advice from friends like these:
Dan Fandrich, Peter Silva, Arve Knudsen, Michael Wallner, Toshiyuki Maezawa,
Ingmar Runge, Ates Goral, David McCreedy, Jari Sundell, Georg Horn,
Gisle Vanem, Yang Tse, Michael Jerris, Dan Nelson
Gisle Vanem, Yang Tse, Michael Jerris, Dan Nelson, Yves Lejeune
Thanks! (and sorry if I forgot to mention someone)

Просмотреть файл

@ -899,9 +899,9 @@ int curl_formget(struct curl_httppost *form, void *arg,
curl_off_t size;
struct FormData *data, *ptr;
if ((rc = Curl_getFormData(&data, form, &size)) != CURLE_OK) {
rc = Curl_getFormData(&data, form, NULL, &size);
if (rc != CURLE_OK)
return (int)rc;
}
for (ptr = data; ptr; ptr = ptr->next) {
if (ptr->type == FORM_FILE) {
@ -1031,10 +1031,13 @@ static char *strippath(char *fullfile)
* (possibly huge) multipart formdata. The input list is in 'post', while the
* output resulting linked lists gets stored in '*finalform'. *sizep will get
* the total size of the whole POST.
* A multipart/form_data content-type is built, unless a custom content-type
* is passed in 'custom_content_type'.
*/
CURLcode Curl_getFormData(struct FormData **finalform,
struct curl_httppost *post,
const char *custom_content_type,
curl_off_t *sizep)
{
struct FormData *form = NULL;
@ -1058,9 +1061,11 @@ CURLcode Curl_getFormData(struct FormData **finalform,
/* Make the first line of the output */
result = AddFormDataf(&form, NULL,
"Content-Type: multipart/form-data;"
" boundary=%s\r\n",
"%s; boundary=%s\r\n",
custom_content_type?custom_content_type:
"Content-Type: multipart/form-data",
boundary);
if (result) {
free(boundary);
return result;
@ -1083,6 +1088,10 @@ CURLcode Curl_getFormData(struct FormData **finalform,
if (result)
break;
/* Maybe later this should be disabled when a custom_content_type is
passed, since Content-Disposition is not meaningful for all multipart
types.
*/
result = AddFormDataf(&form, &size,
"Content-Disposition: form-data; name=\"");
if (result)

Просмотреть файл

@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@ -69,6 +69,7 @@ int Curl_FormInit(struct Form *form, struct FormData *formdata );
CURLcode
Curl_getFormData(struct FormData **,
struct curl_httppost *post,
const char *custom_contenttype,
curl_off_t *size);
/* fread() emulation */

Просмотреть файл

@ -1554,8 +1554,12 @@ static CURLcode add_custom_headers(struct connectdata *conn,
header as that will produce *two* in the same request! */
curl_strnequal("Host:", headers->data, 5))
;
else if(conn->data->set.httpreq == HTTPREQ_POST_FORM &&
/* this header (extended by formdata.c) is sent later */
curl_strnequal("Content-Type:", headers->data,
strlen("Content-Type:")))
;
else {
result = add_bufferf(req_buffer, "%s\r\n", headers->data);
if(result)
return result;
@ -1809,6 +1813,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* we must build the whole darned post sequence first, so that we have
a size of the whole shebang before we start to send it */
result = Curl_getFormData(&http->sendit, data->set.httppost,
checkheaders(data, "Content-Type:"),
&http->postsize);
if(CURLE_OK != result) {
/* Curl_getFormData() doesn't use failf() */
@ -2134,12 +2139,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result)
return result;
if(!checkheaders(data, "Content-Type:")) {
/* Get Content-Type: line from Curl_formpostheader.
{
The Content-Type header line also contains the MIME boundary
string etc why disabling this header is likely to not make things
work, but we support disabling it anyway.
/* Get Content-Type: line from Curl_formpostheader.
*/
char *contentType;
size_t linelength=0;
@ -2149,6 +2151,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Could not get Content-Type header line!");
return CURLE_HTTP_POST_ERROR;
}
result = add_buffer(req_buffer, contentType, linelength);
if(result)
return result;