mirror of
https://github.com/curl/curl.git
synced 2026-08-06 14:06:15 +03:00
tool_writeout: add new writeout variable, %{num_headers}
This variable gives the number of headers. Closes #5947
This commit is contained in:
parent
4e66207c58
commit
0c1e767e83
14 changed files with 191 additions and 23 deletions
|
|
@ -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))) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue