aboutsummaryrefslogtreecommitdiff
path: root/src/tool_cb_hdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tool_cb_hdr.c')
-rw-r--r--src/tool_cb_hdr.c63
1 files changed, 52 insertions, 11 deletions
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index 7f2181f40..4e9e49a6d 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,11 +31,20 @@
#include "tool_doswin.h"
#include "tool_msgs.h"
#include "tool_cb_hdr.h"
+#include "tool_cb_wrt.h"
#include "memdebug.h" /* keep this as LAST include */
static char *parse_filename(const char *ptr, size_t len);
+#ifdef WIN32
+#define BOLD
+#define BOLDOFF
+#else
+#define BOLD "\x1b[1m"
+#define BOLDOFF "\x1b[21m"
+#endif
+
/*
** callback for CURLOPT_HEADERFUNCTION
*/
@@ -48,7 +57,7 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
const char *str = ptr;
const size_t cb = size * nmemb;
const char *end = (char *)ptr + cb;
- char *url = NULL;
+ long protocol = 0;
/*
* Once that libcurl has called back tool_header_cb() the returned value
@@ -88,12 +97,15 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
* Content-Disposition header specifying a filename property.
*/
+ curl_easy_getinfo(outs->config->easy, CURLINFO_PROTOCOL, &protocol);
if(hdrcbdata->honor_cd_filename &&
(cb > 20) && checkprefix("Content-disposition:", str) &&
- !curl_easy_getinfo(outs->config->easy, CURLINFO_EFFECTIVE_URL, &url) &&
- url && (checkprefix("http://", url) || checkprefix("https://", url))) {
+ (protocol & (CURLPROTO_HTTPS|CURLPROTO_HTTP))) {
const char *p = str + 20;
+ if(!outs->stream && !tool_create_output_file(outs, FALSE))
+ return failure;
+
/* look for the 'filename=' parameter
(encoded filenames (*=) are not supported) */
for(;;) {
@@ -119,19 +131,49 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
len = (ssize_t)cb - (p - str);
filename = parse_filename(p, len);
if(filename) {
- outs->filename = filename;
- outs->alloc_filename = TRUE;
+ if(outs->stream) {
+ /* already opened and possibly written to */
+ if(outs->fopened)
+ fclose(outs->stream);
+ outs->stream = NULL;
+
+ /* rename the initial file name to the new file name */
+ rename(outs->filename, filename);
+ if(outs->alloc_filename)
+ free(outs->filename);
+ }
outs->is_cd_filename = TRUE;
outs->s_isreg = TRUE;
outs->fopened = FALSE;
- outs->stream = NULL;
- hdrcbdata->honor_cd_filename = FALSE;
- break;
+ outs->filename = filename;
+ outs->alloc_filename = TRUE;
+ hdrcbdata->honor_cd_filename = FALSE; /* done now! */
+ if(!tool_create_output_file(outs, TRUE))
+ return failure;
}
- return failure;
+ break;
}
}
+ if(hdrcbdata->config->show_headers &&
+ (protocol & (CURLPROTO_HTTP|CURLPROTO_HTTPS|CURLPROTO_RTSP))) {
+ /* bold headers only happen for HTTP(S) and RTSP */
+ char *value = NULL;
+
+ if(!outs->stream && !tool_create_output_file(outs, FALSE))
+ return failure;
+
+ if(hdrcbdata->global->isatty)
+ value = memchr(ptr, ':', cb);
+ if(value) {
+ size_t namelen = value - ptr;
+ fprintf(outs->stream, BOLD "%.*s" BOLDOFF ":", namelen, ptr);
+ fwrite(&value[1], cb - namelen - 1, 1, outs->stream);
+ }
+ else
+ /* not "handled", just show it */
+ fwrite(ptr, cb, 1, outs->stream);
+ }
return cb;
}
@@ -233,4 +275,3 @@ static char *parse_filename(const char *ptr, size_t len)
return copy;
}
-