diff options
author | anio <anio@users.noreply.github.com> | 2020-09-09 15:05:49 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-09-15 00:37:08 +0200 |
commit | 0c1e767e83ec669d213868db8887e19386f717b2 (patch) | |
tree | 9f8031b570594919bc3c9ab888c64d4ade14534f /src | |
parent | 4e66207c580bbf2e05968aa1b99ce7388a3b55c1 (diff) | |
download | curl-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.c | 12 | ||||
-rw-r--r-- | src/tool_operate.c | 2 | ||||
-rw-r--r-- | src/tool_operate.h | 2 | ||||
-rw-r--r-- | src/tool_writeout.c | 19 | ||||
-rw-r--r-- | src/tool_writeout.h | 4 | ||||
-rw-r--r-- | src/tool_writeout_json.c | 22 | ||||
-rw-r--r-- | src/tool_writeout_json.h | 4 |
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 */ |