diff options
-rw-r--r-- | include/curl/curl.h | 1 | ||||
-rw-r--r-- | lib/formdata.c | 36 |
2 files changed, 20 insertions, 17 deletions
diff --git a/include/curl/curl.h b/include/curl/curl.h index b49d66df9..b2292e45d 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -76,6 +76,7 @@ struct HttpPost { link should link to following files */ long flags; /* as defined below */ #define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */ +#define HTTPPOST_READFILE (1<<1) /* specified content is a file name */ }; typedef int (*curl_progress_callback)(void *clientp, diff --git a/lib/formdata.c b/lib/formdata.c index bcdb71c11..989ea1e7a 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -119,7 +119,7 @@ int FormParse(char *input, /* nextarg MUST be a string in the format 'name=contents' and we'll build a linked list with the info */ char name[256]; - char contents[1024]=""; + char contents[4096]=""; char major[128]; char minor[128]; long flags = 0; @@ -132,7 +132,7 @@ int FormParse(char *input, struct HttpPost *subpost; /* a sub-node */ unsigned int i; - if(1 <= sscanf(input, "%255[^ =] = %1023[^\n]", name, contents)) { + if(1 <= sscanf(input, "%255[^ =] = %4095[^\n]", name, contents)) { /* the input was using the correct format */ contp = contents; @@ -281,8 +281,14 @@ int FormParse(char *input, if(post) { memset(post, 0, sizeof(struct HttpPost)); GetStr(&post->name, name); /* get the name */ - GetStr(&post->contents, contp); /* get the contents */ - post->flags = 0; + if( contp[0]=='<' ) { + GetStr(&post->contents, contp+1); /* get the contents */ + post->flags = HTTPPOST_READFILE; + } + else { + GetStr(&post->contents, contp); /* get the contents */ + post->flags = 0; + } /* make the previous point to this */ if(*last_post) @@ -334,7 +340,7 @@ static int AddFormData(struct FormData **formp, static int AddFormDataf(struct FormData **formp, char *fmt, ...) { - char s[1024]; + char s[4096]; va_list ap; va_start(ap, fmt); vsprintf(s, fmt, ap); @@ -454,15 +460,14 @@ struct FormData *getFormData(struct HttpPost *post, if(file->contenttype && !strnequal("text/", file->contenttype, 5)) { /* this is not a text content, mention our binary encoding */ - size += AddFormDataf(&form, - "\r\nContent-Transfer-Encoding: binary"); + size += AddFormData(&form, "\r\nContent-Transfer-Encoding: binary", 0); } - size += AddFormDataf(&form, - "\r\n\r\n"); + size += AddFormData(&form, "\r\n\r\n", 0); - if(post->flags & HTTPPOST_FILENAME) { + if((post->flags & HTTPPOST_FILENAME) || + (post->flags & HTTPPOST_READFILE)) { /* we should include the contents from the specified file */ FILE *fileread; char buffer[1024]; @@ -479,15 +484,12 @@ struct FormData *getFormData(struct HttpPost *post, } if(fileread != stdin) fclose(fileread); + } else { + size += AddFormData(&form, "[File wasn't found by client]", 0); } - else { - size += AddFormDataf(&form, "[File wasn't found by client]"); - } - } - else { + } else { /* include the contents we got */ - size += AddFormDataf(&form, - post->contents); + size += AddFormData(&form, post->contents, 0); } } while((file = file->more)); /* for each specified file for this field */ |