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:
parent
9c480490f7
commit
b061fed981
@ -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
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
||||
*/
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user