Made -D option work with -O and -J.

To achieve this, first new structure HeaderData is defined to hold
necessary data to perform header-related work.  Then tool_header_cb now
receives HeaderData pointer as userdata.  All header-related work
(currently, dumping header and Content-Disposition inspection) are done
in this callback function.  HeaderData.outs->config is used to determine
whether each work is done.

Unit tests were also updated because after this change, curl code always
sets CURLOPT_HEADERFUNCTION and CURLOPT_HEADERDATA.

Tested with -O -J -D, -O -J -i and -O -J -D -i and all worked fine.
This commit is contained in:
Tatsuhiro Tsujikawa 2012-05-25 17:33:28 +09:00 committed by Daniel Stenberg
parent 9c480490f7
commit b061fed981
11 changed files with 43 additions and 13 deletions

View File

@ -41,7 +41,10 @@ static char *parse_filename(const char *ptr, size_t len);
size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
{
struct OutStruct *outs = userdata;
HeaderData *hdrdata = userdata;
struct getout *urlnode = hdrdata->urlnode;
struct OutStruct *outs = hdrdata->outs;
struct OutStruct *heads = hdrdata->heads;
const char *str = ptr;
const size_t cb = size * nmemb;
const char *end = (char*)ptr + cb;
@ -63,8 +66,13 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
return failure;
}
#endif
/* --dump-header option */
if(outs->config->headerfile) {
fwrite(ptr, size, nmemb, heads->stream);
}
if((cb > 20) && checkprefix("Content-disposition:", str)) {
if((urlnode->flags & GETOUT_USEREMOTE) && outs->config->content_disposition
&& (cb > 20) && checkprefix("Content-disposition:", str)) {
const char *p = str + 20;
/* look for the 'filename=' parameter

View File

@ -23,6 +23,16 @@
***************************************************************************/
#include "tool_setup.h"
/* Structure to pass as userdata in tool_header_cb */
typedef struct {
/* getout object pointer currently processing */
struct getout *urlnode;
/* output stream */
struct OutStruct *outs;
/* header output stream */
struct OutStruct *heads;
} HeaderData;
/*
** callback for CURLOPT_HEADERFUNCTION
*/

View File

@ -504,6 +504,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
long retry_sleep_default;
long retry_sleep;
char *this_url;
HeaderData hdrdata;
outfile = NULL;
infdopen = FALSE;
@ -1211,17 +1212,12 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
if(config->proto_redir_present)
my_setopt_flags(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir);
if((urlnode->flags & GETOUT_USEREMOTE)
&& config->content_disposition) {
my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
my_setopt(curl, CURLOPT_HEADERDATA, &outs);
}
else {
/* if HEADERFUNCTION was set to something in the previous loop, it
is important that we set it (back) to NULL now */
my_setopt(curl, CURLOPT_HEADERFUNCTION, NULL);
my_setopt(curl, CURLOPT_HEADERDATA, config->headerfile?&heads:NULL);
}
hdrdata.urlnode = urlnode;
hdrdata.outs = &outs;
hdrdata.heads = &heads;
my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
my_setopt(curl, CURLOPT_HEADERDATA, &hdrdata);
if(config->resolve)
/* new in 7.21.3 */

View File

@ -85,6 +85,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -104,6 +104,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -92,6 +92,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -87,6 +87,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -141,6 +141,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -103,6 +103,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -95,6 +95,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/

View File

@ -75,6 +75,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/