diff options
author | Patrick Monnerat <patrick@monnerat.net> | 2017-09-05 17:11:59 +0100 |
---|---|---|
committer | Patrick Monnerat <patrick@monnerat.net> | 2017-09-05 17:55:51 +0100 |
commit | 63ef436ea15dd93343a2040ffb7c3bb2c9681b87 (patch) | |
tree | 3d60cf99bb9f54b2511a711b7f2fb4dad15136fd /src | |
parent | 3bbe894fd26114e6835c697008b61beeffd084bf (diff) |
mime: implement encoders.
curl_mime_encoder() is operational and documented.
curl tool -F option is extended with ";encoder=".
curl tool --libcurl option generates calls to curl_mime_encoder().
New encoder tests 648 & 649.
Test 1404 extended with an encoder specification.
Diffstat (limited to 'src')
-rw-r--r-- | src/tool_formparse.c | 84 | ||||
-rw-r--r-- | src/tool_setopt.c | 8 |
2 files changed, 69 insertions, 23 deletions
diff --git a/src/tool_formparse.c b/src/tool_formparse.c index de83d6e05..95e0980d1 100644 --- a/src/tool_formparse.c +++ b/src/tool_formparse.c @@ -172,11 +172,12 @@ static int read_field_headers(struct OperationConfig *config, static int get_param_part(struct OperationConfig *config, char **str, char **pdata, char **ptype, char **pfilename, - struct curl_slist **pheaders) + char **pencoder, struct curl_slist **pheaders) { char *p = *str; char *type = NULL; char *filename = NULL; + char *encoder = NULL; char *endpos; char *tp; char sep; @@ -191,6 +192,8 @@ static int get_param_part(struct OperationConfig *config, char **str, *pfilename = NULL; if(pheaders) *pheaders = NULL; + if(pencoder) + *pencoder = NULL; while(ISSPACE(*p)) p++; tp = p; @@ -300,6 +303,22 @@ static int get_param_part(struct OperationConfig *config, char **str, } } } + else if(checkprefix("encoder=", p)) { + if(endct) { + *endct = '\0'; + endct = NULL; + } + for(p += 8; ISSPACE(*p); p++) + ; + tp = p; + encoder = get_param_word(&p, &endpos); + /* If not quoted, strip trailing spaces. */ + if(encoder == tp) + while(endpos > encoder && ISSPACE(endpos[-1])) + endpos--; + sep = *p; + *endpos = '\0'; + } else { /* unknown prefix, skip to next block */ char *unknown = get_param_word(&p, &endpos); @@ -335,6 +354,12 @@ static int get_param_part(struct OperationConfig *config, char **str, warnf(config->global, "Field file name not allowed here: %s\n", filename); + if(pencoder) + *pencoder = encoder; + else if(encoder) + warnf(config->global, + "Field encoder not allowed here: %s\n", encoder); + if(pheaders) *pheaders = headers; else if(headers) { @@ -421,6 +446,7 @@ int formparse(struct OperationConfig *config, char *data; char *type = NULL; char *filename = NULL; + char *encoder = NULL; struct curl_slist *headers = NULL; curl_mimepart *part = NULL; CURLcode res; @@ -454,7 +480,7 @@ int formparse(struct OperationConfig *config, curl_mime *subparts; /* Starting a multipart. */ - sep = get_param_part(config, &contp, &data, &type, NULL, &headers); + sep = get_param_part(config, &contp, &data, &type, NULL, NULL, &headers); if(sep < 0) { Curl_safefree(contents); return 3; @@ -513,8 +539,8 @@ int formparse(struct OperationConfig *config, /* since this was a file, it may have a content-type specifier at the end too, or a filename. Or both. */ ++contp; - sep = get_param_part(config, - &contp, &data, &type, &filename, &headers); + sep = get_param_part(config, &contp, + &data, &type, &filename, &encoder, &headers); if(sep < 0) { if(subparts != *mimecurrent) curl_mime_free(subparts); @@ -577,13 +603,20 @@ int formparse(struct OperationConfig *config, Curl_safefree(contents); return 15; } - if(type && curl_mime_type(part, type)) { + if(curl_mime_type(part, type)) { warnf(config->global, "curl_mime_type failed!\n"); if(subparts != *mimecurrent) curl_mime_free(subparts); Curl_safefree(contents); return 16; } + if(curl_mime_encoder(part, encoder)) { + warnf(config->global, "curl_mime_encoder failed!\n"); + if(subparts != *mimecurrent) + curl_mime_free(subparts); + Curl_safefree(contents); + return 17; + } /* *contp could be '\0', so we just check with the delimiter */ } while(sep); /* loop if there's another file name */ @@ -595,13 +628,13 @@ int formparse(struct OperationConfig *config, warnf(config->global, "curl_mime_addpart failed!\n"); curl_mime_free(subparts); Curl_safefree(contents); - return 17; + return 18; } if(curl_mime_subparts(part, subparts)) { warnf(config->global, "curl_mime_subparts failed!\n"); curl_mime_free(subparts); Curl_safefree(contents); - return 18; + return 19; } } } @@ -611,16 +644,16 @@ int formparse(struct OperationConfig *config, if(!part) { warnf(config->global, "curl_mime_addpart failed!\n"); Curl_safefree(contents); - return 19; + return 20; } if(*contp == '<' && !literal_value) { ++contp; - sep = get_param_part(config, - &contp, &data, &type, &filename, &headers); + sep = get_param_part(config, &contp, + &data, &type, &filename, &encoder, &headers); if(sep < 0) { Curl_safefree(contents); - return 20; + return 21; } /* Set part headers. */ @@ -628,7 +661,7 @@ int formparse(struct OperationConfig *config, warnf(config->global, "curl_mime_headers failed!\n"); curl_slist_free_all(headers); Curl_safefree(contents); - return 21; + return 22; } /* Setup file in part. */ @@ -637,7 +670,7 @@ int formparse(struct OperationConfig *config, warnf(config->global, "setting file %s failed!\n", data); if(res != CURLE_READ_ERROR) { Curl_safefree(contents); - return 22; + return 23; } } } @@ -645,11 +678,11 @@ int formparse(struct OperationConfig *config, if(literal_value) data = contp; else { - sep = get_param_part(config, - &contp, &data, &type, &filename, &headers); + sep = get_param_part(config, &contp, + &data, &type, &filename, &encoder, &headers); if(sep < 0) { Curl_safefree(contents); - return 23; + return 24; } } @@ -658,33 +691,38 @@ int formparse(struct OperationConfig *config, warnf(config->global, "curl_mime_headers failed!\n"); curl_slist_free_all(headers); Curl_safefree(contents); - return 24; + return 25; } #ifdef CURL_DOES_CONVERSIONS if(convert_to_network(data, strlen(data))) { warnf(config->global, "curl_formadd failed!\n"); Curl_safefree(contents); - return 25; + return 26; } #endif if(curl_mime_data(part, data, CURL_ZERO_TERMINATED)) { warnf(config->global, "curl_mime_data failed!\n"); Curl_safefree(contents); - return 26; + return 27; } } if(curl_mime_filename(part, filename)) { warnf(config->global, "curl_mime_filename failed!\n"); Curl_safefree(contents); - return 27; + return 28; } if(curl_mime_type(part, type)) { warnf(config->global, "curl_mime_type failed!\n"); Curl_safefree(contents); - return 28; + return 29; + } + if(curl_mime_encoder(part, encoder)) { + warnf(config->global, "curl_mime_encoder failed!\n"); + Curl_safefree(contents); + return 30; } if(sep) { @@ -698,13 +736,13 @@ int formparse(struct OperationConfig *config, if(name && curl_mime_name(part, name, CURL_ZERO_TERMINATED)) { warnf(config->global, "curl_mime_name failed!\n"); Curl_safefree(contents); - return 29; + return 31; } } else { warnf(config->global, "Illegally formatted input field!\n"); Curl_safefree(contents); - return 30; + return 32; } Curl_safefree(contents); return 0; diff --git a/src/tool_setopt.c b/src/tool_setopt.c index b0f319814..635304a8f 100644 --- a/src/tool_setopt.c +++ b/src/tool_setopt.c @@ -506,6 +506,14 @@ static CURLcode libcurl_generate_mime(curl_mime *mime, int *mimeno) break; } + if(part->encoder) { + Curl_safefree(escaped); + escaped = c_escape(part->encoder->name, CURL_ZERO_TERMINATED); + if(!escaped) + return CURLE_OUT_OF_MEMORY; + CODE2("curl_mime_encoder(part%d, \"%s\");", *mimeno, escaped); + } + if(filename) { Curl_safefree(escaped); escaped = c_escape(filename, CURL_ZERO_TERMINATED); |