summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoranio <anio@users.noreply.github.com>2020-09-09 15:05:49 +0000
committerDaniel Stenberg <daniel@haxx.se>2020-09-15 00:37:08 +0200
commit0c1e767e83ec669d213868db8887e19386f717b2 (patch)
tree9f8031b570594919bc3c9ab888c64d4ade14534f /src
parent4e66207c580bbf2e05968aa1b99ce7388a3b55c1 (diff)
downloadcurl-0c1e767e83ec669d213868db8887e19386f717b2.tar.gz
tool_writeout: add new writeout variable, %{num_headers}
This variable gives the number of headers. Closes #5947
Diffstat (limited to 'src')
-rw-r--r--src/tool_cb_hdr.c12
-rw-r--r--src/tool_operate.c2
-rw-r--r--src/tool_operate.h2
-rw-r--r--src/tool_writeout.c19
-rw-r--r--src/tool_writeout.h4
-rw-r--r--src/tool_writeout_json.c22
-rw-r--r--src/tool_writeout_json.h4
7 files changed, 46 insertions, 19 deletions
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index ee3ef7390..6c6c095c7 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -179,7 +179,17 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
if(!outs->stream && !tool_create_output_file(outs, per->config))
return failure;
}
-
+ if(hdrcbdata->config->writeout) {
+ char *value = memchr(ptr, ':', cb);
+ if(value) {
+ if(per->was_last_header_empty)
+ per->num_headers = 0;
+ per->was_last_header_empty = FALSE;
+ per->num_headers++;
+ }
+ else if(ptr[0] == '\r' || ptr[0] == '\n')
+ per->was_last_header_empty = TRUE;
+ }
if(hdrcbdata->config->show_headers &&
(protocol &
(CURLPROTO_HTTP|CURLPROTO_HTTPS|CURLPROTO_RTSP|CURLPROTO_FILE))) {
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 991adfa2b..e03bbedb8 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -622,7 +622,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
fputs("\n", per->progressbar.out);
if(config->writeout)
- ourWriteOut(per->curl, &per->outs, config->writeout);
+ ourWriteOut(per->curl, per, config->writeout);
/* Close the outs file */
if(outs->fopened && outs->stream) {
diff --git a/src/tool_operate.h b/src/tool_operate.h
index 42b1861d0..6cb3bd036 100644
--- a/src/tool_operate.h
+++ b/src/tool_operate.h
@@ -51,6 +51,8 @@ struct per_transfer {
struct OutStruct etag_save;
struct InStruct input;
struct HdrCbData hdrcbdata;
+ long num_headers;
+ bool was_last_header_empty;
char errorbuffer[CURL_ERROR_SIZE];
bool added; /* set TRUE when added to the multi handle */
diff --git a/src/tool_writeout.c b/src/tool_writeout.c
index 41441ff30..63d2cd003 100644
--- a/src/tool_writeout.c
+++ b/src/tool_writeout.c
@@ -38,6 +38,8 @@ static const struct writeoutvar variables[] = {
CURLINFO_RESPONSE_CODE, JSON_LONG},
{"response_code", VAR_HTTP_CODE, 0,
CURLINFO_RESPONSE_CODE, JSON_LONG},
+ {"num_headers", VAR_NUM_HEADERS, 0,
+ 0, JSON_LONG},
{"http_connect", VAR_HTTP_CODE_PROXY, 0,
CURLINFO_HTTP_CONNECTCODE, JSON_LONG},
{"time_total", VAR_TOTAL_TIME, 0,
@@ -104,7 +106,7 @@ static const struct writeoutvar variables[] = {
0, JSON_NONE}
};
-void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
+void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo)
{
FILE *stream = stdout;
const char *ptr = writeinfo;
@@ -156,6 +158,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &longinfo))
fprintf(stream, "%03ld", longinfo);
break;
+ case VAR_NUM_HEADERS:
+ fprintf(stream, "%ld", per->num_headers);
+ break;
case VAR_HTTP_CODE_PROXY:
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE,
@@ -275,14 +280,14 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
fprintf(stream, "%ld", longinfo);
break;
case VAR_EFFECTIVE_FILENAME:
- if(outs->filename)
- fprintf(stream, "%s", outs->filename);
+ if(per->outs.filename)
+ fputs(per->outs.filename, stream);
break;
case VAR_PRIMARY_IP:
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP,
&stringp))
- fprintf(stream, "%s", stringp);
+ fputs(stringp, stream);
break;
case VAR_PRIMARY_PORT:
if(CURLE_OK ==
@@ -294,7 +299,7 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
&stringp))
- fprintf(stream, "%s", stringp);
+ fputs(stringp, stream);
break;
case VAR_LOCAL_PORT:
if(CURLE_OK ==
@@ -329,7 +334,7 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_SCHEME,
&stringp))
- fprintf(stream, "%s", stringp);
+ fputs(stringp, stream);
break;
case VAR_STDOUT:
stream = stdout;
@@ -338,7 +343,7 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
stream = stderr;
break;
case VAR_JSON:
- ourWriteOutJSON(variables, curl, outs, stream);
+ ourWriteOutJSON(variables, curl, per, stream);
default:
break;
}
diff --git a/src/tool_writeout.h b/src/tool_writeout.h
index 68bacb9d4..377f0b2b3 100644
--- a/src/tool_writeout.h
+++ b/src/tool_writeout.h
@@ -22,6 +22,7 @@
*
***************************************************************************/
#include "tool_setup.h"
+#include "tool_operate.h"
typedef enum {
VAR_NONE, /* must be the first */
@@ -38,6 +39,7 @@ typedef enum {
VAR_HTTP_CODE,
VAR_HTTP_CODE_PROXY,
VAR_HEADER_SIZE,
+ VAR_NUM_HEADERS,
VAR_REQUEST_SIZE,
VAR_EFFECTIVE_METHOD,
VAR_EFFECTIVE_URL,
@@ -80,6 +82,6 @@ struct writeoutvar {
jsontype jsontype;
};
-void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo);
+void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo);
#endif /* HEADER_CURL_TOOL_WRITEOUT_H */
diff --git a/src/tool_writeout_json.c b/src/tool_writeout_json.c
index dfe51b9ff..bae7f5c15 100644
--- a/src/tool_writeout_json.c
+++ b/src/tool_writeout_json.c
@@ -103,13 +103,20 @@ static int writeString(FILE *str, CURL *curl, const char *key, CURLINFO ci)
return 0;
}
-static int writeLong(FILE *str, CURL *curl, const char *key, CURLINFO ci)
+static int writeLong(FILE *str, CURL *curl, const char *key, CURLINFO ci,
+ struct per_transfer *per, const struct writeoutvar *wovar)
{
- long val = 0;
- if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
- fprintf(str, "\"%s\":%ld", key, val);
+ if(wovar->id == VAR_NUM_HEADERS) {
+ fprintf(str, "\"%s\":%ld", key, per->num_headers);
return 1;
}
+ else {
+ long val = 0;
+ if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
+ fprintf(str, "\"%s\":%ld", key, val);
+ return 1;
+ }
+ }
return 0;
}
@@ -149,12 +156,13 @@ static int writeVersion(FILE *str, CURL *curl, const char *key, CURLINFO ci)
}
void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
- struct OutStruct *outs, FILE *stream)
+ struct per_transfer *per, FILE *stream)
{
int i;
fputs("{", stream);
for(i = 0; mappings[i].name != NULL; i++) {
+ const struct writeoutvar *wovar = &mappings[i];
const char *name = mappings[i].name;
CURLINFO cinfo = mappings[i].cinfo;
int ok = 0;
@@ -168,7 +176,7 @@ void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
ok = writeString(stream, curl, name, cinfo);
break;
case JSON_LONG:
- ok = writeLong(stream, curl, name, cinfo);
+ ok = writeLong(stream, curl, name, cinfo, per, wovar);
break;
case JSON_OFFSET:
ok = writeOffset(stream, curl, name, cinfo);
@@ -177,7 +185,7 @@ void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
ok = writeTime(stream, curl, name, cinfo);
break;
case JSON_FILENAME:
- ok = writeFilename(stream, name, outs->filename);
+ ok = writeFilename(stream, name, per->outs.filename);
break;
case JSON_VERSION:
ok = writeVersion(stream, curl, name, cinfo);
diff --git a/src/tool_writeout_json.h b/src/tool_writeout_json.h
index d3988d521..0390ae5c8 100644
--- a/src/tool_writeout_json.h
+++ b/src/tool_writeout_json.h
@@ -24,7 +24,7 @@
#include "tool_setup.h"
#include "tool_writeout.h"
-void ourWriteOutJSON(const struct writeoutvar mappings[],
- CURL *curl, struct OutStruct *outs, FILE *stream);
+void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
+ struct per_transfer *per, FILE *stream);
#endif /* HEADER_CURL_TOOL_WRITEOUT_H */