Revert "Update to 7.44.0"
[platform/upstream/curl.git] / src / tool_cb_hdr.c
index 738cd5d..ef340f7 100644 (file)
@@ -41,10 +41,9 @@ 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)
 {
-  HeaderData *hdrdata = userdata;
-  struct getout *urlnode = hdrdata->urlnode;
-  struct OutStruct *outs = hdrdata->outs;
-  struct OutStruct *heads = hdrdata->heads;
+  struct HdrCbData *hdrcbdata = userdata;
+  struct OutStruct *outs = hdrcbdata->outs;
+  struct OutStruct *heads = hdrcbdata->heads;
   const char *str = ptr;
   const size_t cb = size * nmemb;
   const char *end = (char*)ptr + cb;
@@ -57,22 +56,35 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
    */
   size_t failure = (size * nmemb) ? 0 : 1;
 
-  if(!outs->config)
+  if(!heads->config)
     return failure;
 
 #ifdef DEBUGBUILD
   if(size * nmemb > (size_t)CURL_MAX_HTTP_HEADER) {
-    warnf(outs->config, "Header data exceeds single call write limit!\n");
+    warnf(heads->config, "Header data exceeds single call write limit!\n");
     return failure;
   }
 #endif
-  /* --dump-header option */
-  if(outs->config->headerfile) {
-    fwrite(ptr, size, nmemb, heads->stream);
+
+  /*
+   * Write header data when curl option --dump-header (-D) is given.
+   */
+
+  if(heads->config->headerfile && heads->stream) {
+    size_t rc = fwrite(ptr, size, nmemb, heads->stream);
+    if(rc != cb)
+      return rc;
   }
 
-  if((urlnode->flags & GETOUT_USEREMOTE) && outs->config->content_disposition
-     && (cb > 20) && checkprefix("Content-disposition:", str)) {
+  /*
+   * This callback sets the filename where output shall be written when
+   * curl options --remote-name (-O) and --remote-header-name (-J) have
+   * been simultaneously given and additionally server returns an HTTP
+   * Content-Disposition header specifying a filename property.
+   */
+
+  if(hdrcbdata->honor_cd_filename &&
+     (cb > 20) && checkprefix("Content-disposition:", str)) {
     const char *p = str + 20;
 
     /* look for the 'filename=' parameter
@@ -102,9 +114,11 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
       if(filename) {
         outs->filename = filename;
         outs->alloc_filename = TRUE;
+        outs->is_cd_filename = TRUE;
         outs->s_isreg = TRUE;
         outs->fopened = FALSE;
         outs->stream = NULL;
+        hdrcbdata->honor_cd_filename = FALSE;
         break;
       }
       else