Commit b061fed9 authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa Committed by Daniel Stenberg
Browse files

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.
parent 9c480490
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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
*/
+7 −11
Original line number Diff line number Diff line
@@ -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) {
        hdrdata.urlnode = urlnode;
        hdrdata.outs = &outs;
        hdrdata.heads = &heads;

        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);
        }
        my_setopt(curl, CURLOPT_HEADERDATA, &hdrdata);

        if(config->resolve)
          /* new in 7.21.3 */
+2 −0
Original line number Diff line number Diff line
@@ -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

  */

+2 −0
Original line number Diff line number Diff line
@@ -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

  */

Loading