cmdline: make -F type= accept ;charset=

The -F option allows some custom parameters within the given string, and
those strings are separated with semicolons. You can for example specify
"name=daniel;type=text/plain" to set content-type for the
field. However, the use of semicolons like that made it not work fine if
you specified one within the content-type, like for:
"name=daniel;type=text/plain;charset=UTF-8"
... as the second one would be seen as a separator and "charset" is no
parameter curl knows anything about so it was just silently discarded.

The new logic now checks if the semicolon and following keyword looks
like a parameter it knows about and if it isn't it is assumed to be
meant to be used within the content-type string itself.

I modified test case 186 to verify that this works as intended.

Reported by: Larry Stone
Bug: http://curl.haxx.se/bug/view.cgi?id=3048988
This commit is contained in:
Daniel Stenberg 2010-08-21 00:21:24 +02:00
parent daa96f9928
commit eeb2cb05a1
2 changed files with 11 additions and 3 deletions

View File

@ -1202,9 +1202,17 @@ static int formparse(struct Configurable *config,
FreeMultiInfo (multi_start);
return 2; /* illegal content-type syntax! */
}
/* now point beyond the content-type specifier */
sep = (char *)type + strlen(major)+strlen(minor)+1;
/* there's a semicolon following - we check if it is a filename
specified and if not we simply assume that it is text that
the user wants included in the type and include that too up
to the next zero or semicolon. */
if((*sep==';') && !curlx_strnequal(";filname=", sep, 9))
sep = strchr(sep+1, ';');
if(*sep) {
*sep=0; /* zero terminate type string */

View File

@ -21,7 +21,7 @@ http
HTTP RFC1867-type formposting with types on text fields
</name>
<command>
http://%HOSTIP:%HTTPPORT/we/want/186 -F "name=daniel;type=moo/foo" -F "html= <body>hello</body>;type=text/html"
http://%HOSTIP:%HTTPPORT/we/want/186 -F "name=daniel;type=moo/foo" -F "html= <body>hello</body>;type=text/html;charset=verymoo"
</command>
# We create this file before the command is invoked!
</client>
@ -36,7 +36,7 @@ POST /we/want/186 HTTP/1.1
User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.1 c-ares/1.2.0 libidn/0.5.2
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 305
Content-Length: 321
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------212d9006ceb5
@ -47,7 +47,7 @@ Content-Type: moo/foo
daniel
------------------------------212d9006ceb5
Content-Disposition: form-data; name="html"
Content-Type: text/html
Content-Type: text/html;charset=verymoo
<body>hello</body>
------------------------------212d9006ceb5--