diff options
Diffstat (limited to 'src/tool_writeout_json.c')
-rw-r--r-- | src/tool_writeout_json.c | 134 |
1 files changed, 11 insertions, 123 deletions
diff --git a/src/tool_writeout_json.c b/src/tool_writeout_json.c index 186ed6851..ca1e70868 100644 --- a/src/tool_writeout_json.c +++ b/src/tool_writeout_json.c @@ -30,15 +30,7 @@ #include "tool_writeout.h" -static const char *http_version[] = { - "0", /* CURL_HTTP_VERSION_NONE */ - "1", /* CURL_HTTP_VERSION_1_0 */ - "1.1", /* CURL_HTTP_VERSION_1_1 */ - "2", /* CURL_HTTP_VERSION_2 */ - "3" /* CURL_HTTP_VERSION_3 */ -}; - -static void jsonEscape(FILE *stream, const char *in) +void jsonWriteString(FILE *stream, const char *in) { const char *i = in; const char *in_end = in + strlen(in); @@ -78,126 +70,22 @@ static void jsonEscape(FILE *stream, const char *in) } } -static int writeTime(FILE *str, CURL *curl, const char *key, CURLINFO ci) -{ - curl_off_t val = 0; - if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) { - curl_off_t s = val / 1000000l; - curl_off_t ms = val % 1000000l; - fprintf(str, "\"%s\":%" CURL_FORMAT_CURL_OFF_T - ".%06" CURL_FORMAT_CURL_OFF_T, key, s, ms); - return 1; - } - return 0; -} - -static int writeString(FILE *str, CURL *curl, const char *key, CURLINFO ci) -{ - char *valp = NULL; - if((CURLE_OK == curl_easy_getinfo(curl, ci, &valp)) && valp) { - fprintf(str, "\"%s\":\"", key); - jsonEscape(str, valp); - fprintf(str, "\""); - return 1; - } - return 0; -} - -static int writeLong(FILE *str, CURL *curl, const char *key, CURLINFO ci, - struct per_transfer *per, const struct writeoutvar *wovar) -{ - 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; -} - -static int writeOffset(FILE *str, CURL *curl, const char *key, CURLINFO ci) -{ - curl_off_t val = 0; - if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) { - fprintf(str, "\"%s\":%" CURL_FORMAT_CURL_OFF_T, key, val); - return 1; - } - return 0; -} - -static int writeFilename(FILE *str, const char *key, const char *filename) -{ - if(filename) { - fprintf(str, "\"%s\":\"", key); - jsonEscape(str, filename); - fprintf(str, "\""); - } - else { - fprintf(str, "\"%s\":null", key); - } - return 1; -} - -static int writeVersion(FILE *str, CURL *curl, const char *key, CURLINFO ci) -{ - long version = 0; - if(CURLE_OK == curl_easy_getinfo(curl, ci, &version) && - (version >= 0) && - (version < (long)(sizeof(http_version)/sizeof(char *)))) { - fprintf(str, "\"%s\":\"%s\"", key, http_version[version]); - return 1; - } - return 0; -} - -void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl, - struct per_transfer *per, FILE *stream) +void ourWriteOutJSON(FILE *stream, const struct writeoutvar mappings[], + struct per_transfer *per, CURLcode per_result) { 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; - - if(mappings[i].is_ctrl == 1) { - continue; - } - switch(mappings[i].jsontype) { - case JSON_STRING: - ok = writeString(stream, curl, name, cinfo); - break; - case JSON_LONG: - ok = writeLong(stream, curl, name, cinfo, per, wovar); - break; - case JSON_OFFSET: - ok = writeOffset(stream, curl, name, cinfo); - break; - case JSON_TIME: - ok = writeTime(stream, curl, name, cinfo); - break; - case JSON_FILENAME: - ok = writeFilename(stream, name, per->outs.filename); - break; - case JSON_VERSION: - ok = writeVersion(stream, curl, name, cinfo); - break; - default: - break; - } - - if(ok) { + for(i = 0; mappings[i].name != NULL; i++) { + if(mappings[i].writefunc && + mappings[i].writefunc(stream, &mappings[i], per, per_result, true)) fputs(",", stream); - } } - fprintf(stream, "\"curl_version\":\"%s\"}", curl_version()); + /* The variables are sorted in alphabetical order but as a special case + curl_version (which is not actually a --write-out variable) is last. */ + fprintf(stream, "\"curl_version\":\""); + jsonWriteString(stream, curl_version()); + fprintf(stream, "\"}"); } |