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) 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 char *str = ptr;
const size_t cb = size * nmemb; const size_t cb = size * nmemb;
const char *end = (char*)ptr + cb; 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; return failure;
} }
#endif #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; const char *p = str + 20;
/* look for the 'filename=' parameter /* look for the 'filename=' parameter

View File

@ -23,6 +23,16 @@
***************************************************************************/ ***************************************************************************/
#include "tool_setup.h" #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 ** 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_default;
long retry_sleep; long retry_sleep;
char *this_url; char *this_url;
HeaderData hdrdata;
outfile = NULL; outfile = NULL;
infdopen = FALSE; infdopen = FALSE;
@ -1211,17 +1212,12 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
if(config->proto_redir_present) if(config->proto_redir_present)
my_setopt_flags(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir); my_setopt_flags(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir);
if((urlnode->flags & GETOUT_USEREMOTE) hdrdata.urlnode = urlnode;
&& config->content_disposition) { hdrdata.outs = &outs;
my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb); hdrdata.heads = &heads;
my_setopt(curl, CURLOPT_HEADERDATA, &outs);
} my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
else { my_setopt(curl, CURLOPT_HEADERDATA, &hdrdata);
/* 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);
}
if(config->resolve) if(config->resolve)
/* new in 7.21.3 */ /* new in 7.21.3 */

View File

@ -85,6 +85,8 @@ int main(int argc, char *argv[])
CURLOPT_STDERR set to a objectpointer CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer 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_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/ */