Loading lib/formdata.c +72 −49 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * * In order to be useful for every potential user, curl and libcurl are * dual-licensed under the MPL and the MIT/X-derivate licenses. Loading Loading @@ -171,8 +171,8 @@ static void GetStr(char **string, static int FormParse(char *input, struct HttpPost **httppost, struct HttpPost **last_post) struct curl_httppost **httppost, struct curl_httppost **last_post) { /* nextarg MUST be a string in the format 'name=contents' and we'll build a linked list with the info */ Loading @@ -186,8 +186,8 @@ int FormParse(char *input, char *prevtype = NULL; char *sep; char *sep2; struct HttpPost *post; struct HttpPost *subpost; /* a sub-node */ struct curl_httppost *post; struct curl_httppost *subpost; /* a sub-node */ unsigned int i; /* Preallocate contents to the length of input to make sure we don't Loading Loading @@ -296,9 +296,9 @@ int FormParse(char *input, /* For the first file name, we allocate and initiate the main list node */ post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); post = (struct curl_httppost *)malloc(sizeof(struct curl_httppost)); if(post) { memset(post, 0, sizeof(struct HttpPost)); memset(post, 0, sizeof(struct curl_httppost)); GetStr(&post->name, name); /* get the name */ GetStr(&post->contents, contp); /* get the contents */ post->contentslength = 0; Loading @@ -320,9 +320,10 @@ int FormParse(char *input, else { /* we add a file name to the previously allocated node, known as 'post' now */ subpost =(struct HttpPost *)malloc(sizeof(struct HttpPost)); subpost =(struct curl_httppost *) malloc(sizeof(struct curl_httppost)); if(subpost) { memset(subpost, 0, sizeof(struct HttpPost)); memset(subpost, 0, sizeof(struct curl_httppost)); GetStr(&subpost->name, name); /* get the name */ GetStr(&subpost->contents, contp); /* get the contents */ subpost->contentslength = 0; Loading @@ -342,9 +343,9 @@ int FormParse(char *input, } while(sep && *sep); /* loop if there's another file name */ } else { post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); post = (struct curl_httppost *)malloc(sizeof(struct curl_httppost)); if(post) { memset(post, 0, sizeof(struct HttpPost)); memset(post, 0, sizeof(struct curl_httppost)); GetStr(&post->name, name); /* get the name */ if( contp[0]=='<' ) { GetStr(&post->contents, contp+1); /* get the contents */ Loading Loading @@ -378,8 +379,8 @@ int FormParse(char *input, } int curl_formparse(char *input, struct HttpPost **httppost, struct HttpPost **last_post) struct curl_httppost **httppost, struct curl_httppost **last_post) { return FormParse(input, httppost, last_post); } Loading @@ -394,27 +395,28 @@ int curl_formparse(char *input, * Returns newly allocated HttpPost on success and NULL if malloc failed. * ***************************************************************************/ static struct HttpPost * AddHttpPost(char * name, long namelength, char * value, long contentslength, static struct curl_httppost * AddHttpPost(char * name, long namelength, char * value, long contentslength, char *contenttype, long flags, struct curl_slist* contentHeader, struct HttpPost *parent_post, struct HttpPost **httppost, struct HttpPost **last_post) char *showfilename, struct curl_httppost *parent_post, struct curl_httppost **httppost, struct curl_httppost **last_post) { struct HttpPost *post; post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); struct curl_httppost *post; post = (struct curl_httppost *)malloc(sizeof(struct curl_httppost)); if(post) { memset(post, 0, sizeof(struct HttpPost)); memset(post, 0, sizeof(struct curl_httppost)); post->name = name; post->namelength = name?(namelength?namelength:(long)strlen(name)):0; post->contents = value; post->contentslength = contentslength; post->contenttype = contenttype; post->contentheader = contentHeader; post->showfilename = showfilename; post->flags = flags; } else Loading Loading @@ -627,14 +629,14 @@ typedef enum { } FORMcode; static FORMcode FormAdd(struct HttpPost **httppost, struct HttpPost **last_post, FORMcode FormAdd(struct curl_httppost **httppost, struct curl_httppost **last_post, va_list params) { FormInfo *first_form, *current_form, *form; FORMcode return_value = FORMADD_OK; const char *prevtype = NULL; struct HttpPost *post = NULL; struct curl_httppost *post = NULL; CURLformoption option; struct curl_forms *forms = NULL; const char *array_value; /* value read from an array */ Loading Loading @@ -677,9 +679,9 @@ FORMcode FormAdd(struct HttpPost **httppost, continue; } else { /* check that the option is OK in an array */ /* Check that the option is OK in an array. TODO: make ALL options work in arrays */ /* Daniel's note: do we really need to do this? */ if ( (option <= CURLFORM_ARRAY_START) || (option >= CURLFORM_ARRAY_END) ) { return_value = FORMADD_ILLEGAL_ARRAY; Loading Loading @@ -838,6 +840,16 @@ FORMcode FormAdd(struct HttpPost **httppost, break; } case CURLFORM_FILENAME: { char *filename = array_state?(char *)array_value: va_arg(params, char *); if( current_form->showfilename ) return_value = FORMADD_OPTION_TWICE; else current_form->showfilename = strdup(filename); break; } default: return_value = FORMADD_UNKNOWN_OPTION; } Loading Loading @@ -889,7 +901,7 @@ FORMcode FormAdd(struct HttpPost **httppost, post = AddHttpPost(form->name, form->namelength, form->value, form->contentslength, form->contenttype, form->flags, form->contentheader, form->contentheader, form->showfilename, post, httppost, last_post); Loading @@ -915,8 +927,8 @@ FORMcode FormAdd(struct HttpPost **httppost, return return_value; } int curl_formadd(struct HttpPost **httppost, struct HttpPost **last_post, int curl_formadd(struct curl_httppost **httppost, struct curl_httppost **last_post, ...) { va_list arg; Loading Loading @@ -1009,9 +1021,9 @@ void Curl_formclean(struct FormData *form) } /* external function to free up a whole form post chain */ void curl_formfree(struct HttpPost *form) void curl_formfree(struct curl_httppost *form) { struct HttpPost *next; struct curl_httppost *next; if(!form) /* no form to free, just get out of this */ Loading @@ -1030,18 +1042,20 @@ void curl_formfree(struct HttpPost *form) free(form->contents); /* free the contents */ if(form->contenttype) free(form->contenttype); /* free the content type */ if(form->showfilename) free(form->showfilename); /* free the faked file name */ free(form); /* free the struct */ } while((form=next)); /* continue */ } struct FormData *Curl_getFormData(struct HttpPost *post, struct FormData *Curl_getFormData(struct curl_httppost *post, int *sizep) { struct FormData *form = NULL; struct FormData *firstform; struct HttpPost *file; struct curl_httppost *file; int size =0; char *boundary; Loading Loading @@ -1093,16 +1107,25 @@ struct FormData *Curl_getFormData(struct HttpPost *post, file = post; do { /* If 'showfilename' is set, that is a faked name passed on to us to use to in the formpost. If that is not set, the actually used local file name should be added. */ if(post->more) { /* if multiple-file */ size += AddFormDataf(&form, "\r\n--%s\r\nContent-Disposition: attachment; filename=\"%s\"", fileboundary, file->contents); "\r\n--%s\r\nContent-Disposition: " "attachment; filename=\"%s\"", fileboundary, (file->showfilename?file->showfilename: file->contents)); } else if(post->flags & HTTPPOST_FILENAME) { size += AddFormDataf(&form, "; filename=\"%s\"", post->contents); (post->showfilename?post->showfilename: post->contents)); } if(file->contenttype) { Loading Loading @@ -1294,8 +1317,8 @@ int Curl_FormReadOneLine(char *buffer, #ifdef _FORM_DEBUG int FormAddTest(const char * errormsg, struct HttpPost **httppost, struct HttpPost **last_post, struct curl_httppost **httppost, struct curl_httppost **last_post, ...) { int result; Loading Loading @@ -1341,8 +1364,8 @@ int main() int size; int nread; char buffer[4096]; struct HttpPost *httppost=NULL; struct HttpPost *last_post=NULL; struct curl_httppost *httppost=NULL; struct curl_httppost *last_post=NULL; struct curl_forms forms[4]; struct FormData *form; Loading Loading @@ -1451,9 +1474,9 @@ int main(int argc, char **argv) #endif int i; char *nextarg; struct HttpPost *httppost=NULL; struct HttpPost *last_post=NULL; struct HttpPost *post; struct curl_httppost *httppost=NULL; struct curl_httppost *last_post=NULL; struct curl_httppost *post; int size; int nread; char buffer[4096]; Loading lib/formdata.h +4 −1 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * * In order to be useful for every potential user, curl and libcurl are * dual-licensed under the MPL and the MIT/X-derivate licenses. Loading Loading @@ -44,6 +44,9 @@ typedef struct FormInfo { long contentslength; char *contenttype; long flags; char *showfilename; /* The file name to show. If not set, the actual file name will be used */ struct curl_slist* contentheader; struct FormInfo *more; } FormInfo; Loading Loading
lib/formdata.c +72 −49 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * * In order to be useful for every potential user, curl and libcurl are * dual-licensed under the MPL and the MIT/X-derivate licenses. Loading Loading @@ -171,8 +171,8 @@ static void GetStr(char **string, static int FormParse(char *input, struct HttpPost **httppost, struct HttpPost **last_post) struct curl_httppost **httppost, struct curl_httppost **last_post) { /* nextarg MUST be a string in the format 'name=contents' and we'll build a linked list with the info */ Loading @@ -186,8 +186,8 @@ int FormParse(char *input, char *prevtype = NULL; char *sep; char *sep2; struct HttpPost *post; struct HttpPost *subpost; /* a sub-node */ struct curl_httppost *post; struct curl_httppost *subpost; /* a sub-node */ unsigned int i; /* Preallocate contents to the length of input to make sure we don't Loading Loading @@ -296,9 +296,9 @@ int FormParse(char *input, /* For the first file name, we allocate and initiate the main list node */ post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); post = (struct curl_httppost *)malloc(sizeof(struct curl_httppost)); if(post) { memset(post, 0, sizeof(struct HttpPost)); memset(post, 0, sizeof(struct curl_httppost)); GetStr(&post->name, name); /* get the name */ GetStr(&post->contents, contp); /* get the contents */ post->contentslength = 0; Loading @@ -320,9 +320,10 @@ int FormParse(char *input, else { /* we add a file name to the previously allocated node, known as 'post' now */ subpost =(struct HttpPost *)malloc(sizeof(struct HttpPost)); subpost =(struct curl_httppost *) malloc(sizeof(struct curl_httppost)); if(subpost) { memset(subpost, 0, sizeof(struct HttpPost)); memset(subpost, 0, sizeof(struct curl_httppost)); GetStr(&subpost->name, name); /* get the name */ GetStr(&subpost->contents, contp); /* get the contents */ subpost->contentslength = 0; Loading @@ -342,9 +343,9 @@ int FormParse(char *input, } while(sep && *sep); /* loop if there's another file name */ } else { post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); post = (struct curl_httppost *)malloc(sizeof(struct curl_httppost)); if(post) { memset(post, 0, sizeof(struct HttpPost)); memset(post, 0, sizeof(struct curl_httppost)); GetStr(&post->name, name); /* get the name */ if( contp[0]=='<' ) { GetStr(&post->contents, contp+1); /* get the contents */ Loading Loading @@ -378,8 +379,8 @@ int FormParse(char *input, } int curl_formparse(char *input, struct HttpPost **httppost, struct HttpPost **last_post) struct curl_httppost **httppost, struct curl_httppost **last_post) { return FormParse(input, httppost, last_post); } Loading @@ -394,27 +395,28 @@ int curl_formparse(char *input, * Returns newly allocated HttpPost on success and NULL if malloc failed. * ***************************************************************************/ static struct HttpPost * AddHttpPost(char * name, long namelength, char * value, long contentslength, static struct curl_httppost * AddHttpPost(char * name, long namelength, char * value, long contentslength, char *contenttype, long flags, struct curl_slist* contentHeader, struct HttpPost *parent_post, struct HttpPost **httppost, struct HttpPost **last_post) char *showfilename, struct curl_httppost *parent_post, struct curl_httppost **httppost, struct curl_httppost **last_post) { struct HttpPost *post; post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); struct curl_httppost *post; post = (struct curl_httppost *)malloc(sizeof(struct curl_httppost)); if(post) { memset(post, 0, sizeof(struct HttpPost)); memset(post, 0, sizeof(struct curl_httppost)); post->name = name; post->namelength = name?(namelength?namelength:(long)strlen(name)):0; post->contents = value; post->contentslength = contentslength; post->contenttype = contenttype; post->contentheader = contentHeader; post->showfilename = showfilename; post->flags = flags; } else Loading Loading @@ -627,14 +629,14 @@ typedef enum { } FORMcode; static FORMcode FormAdd(struct HttpPost **httppost, struct HttpPost **last_post, FORMcode FormAdd(struct curl_httppost **httppost, struct curl_httppost **last_post, va_list params) { FormInfo *first_form, *current_form, *form; FORMcode return_value = FORMADD_OK; const char *prevtype = NULL; struct HttpPost *post = NULL; struct curl_httppost *post = NULL; CURLformoption option; struct curl_forms *forms = NULL; const char *array_value; /* value read from an array */ Loading Loading @@ -677,9 +679,9 @@ FORMcode FormAdd(struct HttpPost **httppost, continue; } else { /* check that the option is OK in an array */ /* Check that the option is OK in an array. TODO: make ALL options work in arrays */ /* Daniel's note: do we really need to do this? */ if ( (option <= CURLFORM_ARRAY_START) || (option >= CURLFORM_ARRAY_END) ) { return_value = FORMADD_ILLEGAL_ARRAY; Loading Loading @@ -838,6 +840,16 @@ FORMcode FormAdd(struct HttpPost **httppost, break; } case CURLFORM_FILENAME: { char *filename = array_state?(char *)array_value: va_arg(params, char *); if( current_form->showfilename ) return_value = FORMADD_OPTION_TWICE; else current_form->showfilename = strdup(filename); break; } default: return_value = FORMADD_UNKNOWN_OPTION; } Loading Loading @@ -889,7 +901,7 @@ FORMcode FormAdd(struct HttpPost **httppost, post = AddHttpPost(form->name, form->namelength, form->value, form->contentslength, form->contenttype, form->flags, form->contentheader, form->contentheader, form->showfilename, post, httppost, last_post); Loading @@ -915,8 +927,8 @@ FORMcode FormAdd(struct HttpPost **httppost, return return_value; } int curl_formadd(struct HttpPost **httppost, struct HttpPost **last_post, int curl_formadd(struct curl_httppost **httppost, struct curl_httppost **last_post, ...) { va_list arg; Loading Loading @@ -1009,9 +1021,9 @@ void Curl_formclean(struct FormData *form) } /* external function to free up a whole form post chain */ void curl_formfree(struct HttpPost *form) void curl_formfree(struct curl_httppost *form) { struct HttpPost *next; struct curl_httppost *next; if(!form) /* no form to free, just get out of this */ Loading @@ -1030,18 +1042,20 @@ void curl_formfree(struct HttpPost *form) free(form->contents); /* free the contents */ if(form->contenttype) free(form->contenttype); /* free the content type */ if(form->showfilename) free(form->showfilename); /* free the faked file name */ free(form); /* free the struct */ } while((form=next)); /* continue */ } struct FormData *Curl_getFormData(struct HttpPost *post, struct FormData *Curl_getFormData(struct curl_httppost *post, int *sizep) { struct FormData *form = NULL; struct FormData *firstform; struct HttpPost *file; struct curl_httppost *file; int size =0; char *boundary; Loading Loading @@ -1093,16 +1107,25 @@ struct FormData *Curl_getFormData(struct HttpPost *post, file = post; do { /* If 'showfilename' is set, that is a faked name passed on to us to use to in the formpost. If that is not set, the actually used local file name should be added. */ if(post->more) { /* if multiple-file */ size += AddFormDataf(&form, "\r\n--%s\r\nContent-Disposition: attachment; filename=\"%s\"", fileboundary, file->contents); "\r\n--%s\r\nContent-Disposition: " "attachment; filename=\"%s\"", fileboundary, (file->showfilename?file->showfilename: file->contents)); } else if(post->flags & HTTPPOST_FILENAME) { size += AddFormDataf(&form, "; filename=\"%s\"", post->contents); (post->showfilename?post->showfilename: post->contents)); } if(file->contenttype) { Loading Loading @@ -1294,8 +1317,8 @@ int Curl_FormReadOneLine(char *buffer, #ifdef _FORM_DEBUG int FormAddTest(const char * errormsg, struct HttpPost **httppost, struct HttpPost **last_post, struct curl_httppost **httppost, struct curl_httppost **last_post, ...) { int result; Loading Loading @@ -1341,8 +1364,8 @@ int main() int size; int nread; char buffer[4096]; struct HttpPost *httppost=NULL; struct HttpPost *last_post=NULL; struct curl_httppost *httppost=NULL; struct curl_httppost *last_post=NULL; struct curl_forms forms[4]; struct FormData *form; Loading Loading @@ -1451,9 +1474,9 @@ int main(int argc, char **argv) #endif int i; char *nextarg; struct HttpPost *httppost=NULL; struct HttpPost *last_post=NULL; struct HttpPost *post; struct curl_httppost *httppost=NULL; struct curl_httppost *last_post=NULL; struct curl_httppost *post; int size; int nread; char buffer[4096]; Loading
lib/formdata.h +4 −1 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * * In order to be useful for every potential user, curl and libcurl are * dual-licensed under the MPL and the MIT/X-derivate licenses. Loading Loading @@ -44,6 +44,9 @@ typedef struct FormInfo { long contentslength; char *contenttype; long flags; char *showfilename; /* The file name to show. If not set, the actual file name will be used */ struct curl_slist* contentheader; struct FormInfo *more; } FormInfo; Loading