|
@@ -29,77 +29,288 @@
|
|
|
|
|
|
#include "memdebug.h" /* keep this as LAST include */
|
|
|
|
|
|
+static int writeTime(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json);
|
|
|
+
|
|
|
+static int writeString(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json);
|
|
|
+
|
|
|
+static int writeLong(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json);
|
|
|
+
|
|
|
+static int writeOffset(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json);
|
|
|
+
|
|
|
+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 */
|
|
|
+};
|
|
|
+
|
|
|
+/* The designated write function should be the same as the CURLINFO return type
|
|
|
+ with exceptions special cased in the respective function. For example,
|
|
|
+ http_version uses CURLINFO_HTTP_VERSION which returns the version as a long,
|
|
|
+ however it is output as a string and therefore is handled in writeString.
|
|
|
+
|
|
|
+ Yes: "http_version": "1.1"
|
|
|
+ No: "http_version": 1.1
|
|
|
+
|
|
|
+ Variable names should be in alphabetical order.
|
|
|
+ */
|
|
|
static const struct writeoutvar variables[] = {
|
|
|
- {"content_type", VAR_CONTENT_TYPE, 0, CURLINFO_CONTENT_TYPE, JSON_STRING},
|
|
|
- {"filename_effective", VAR_EFFECTIVE_FILENAME, 0, 0, JSON_FILENAME},
|
|
|
- {"exitcode", VAR_EXITCODE, 0, 0, JSON_LONG},
|
|
|
- {"errormsg", VAR_ERRORMSG, 0, 0, JSON_STRING},
|
|
|
- {"ftp_entry_path", VAR_FTP_ENTRY_PATH, 0, CURLINFO_FTP_ENTRY_PATH,
|
|
|
- JSON_STRING},
|
|
|
- {"http_code", VAR_HTTP_CODE, 0, CURLINFO_RESPONSE_CODE, JSON_LONG},
|
|
|
- {"http_connect", VAR_HTTP_CODE_PROXY, 0, CURLINFO_HTTP_CONNECTCODE,
|
|
|
- JSON_LONG},
|
|
|
- {"http_version", VAR_HTTP_VERSION, 0, CURLINFO_HTTP_VERSION, JSON_VERSION},
|
|
|
- {"json", VAR_JSON, 1, 0, JSON_NONE},
|
|
|
- {"local_ip", VAR_LOCAL_IP, 0, CURLINFO_LOCAL_IP, JSON_STRING},
|
|
|
- {"local_port", VAR_LOCAL_PORT, 0, CURLINFO_LOCAL_PORT, JSON_LONG},
|
|
|
- {"method", VAR_EFFECTIVE_METHOD, 0, CURLINFO_EFFECTIVE_METHOD, JSON_STRING},
|
|
|
- {"num_connects", VAR_NUM_CONNECTS, 0, CURLINFO_NUM_CONNECTS, JSON_LONG},
|
|
|
- {"num_headers", VAR_NUM_HEADERS, 0, 0, JSON_LONG},
|
|
|
- {"num_redirects", VAR_REDIRECT_COUNT, 0, CURLINFO_REDIRECT_COUNT, JSON_LONG},
|
|
|
- {"onerror", VAR_ONERROR, 1, 0, JSON_NONE},
|
|
|
- {"proxy_ssl_verify_result", VAR_PROXY_SSL_VERIFY_RESULT, 0,
|
|
|
- CURLINFO_PROXY_SSL_VERIFYRESULT, JSON_LONG},
|
|
|
- {"redirect_url", VAR_REDIRECT_URL, 0, CURLINFO_REDIRECT_URL, JSON_STRING},
|
|
|
- {"remote_ip", VAR_PRIMARY_IP, 0, CURLINFO_PRIMARY_IP, JSON_STRING},
|
|
|
- {"remote_port", VAR_PRIMARY_PORT, 0, CURLINFO_PRIMARY_PORT, JSON_LONG},
|
|
|
- {"response_code", VAR_HTTP_CODE, 0, CURLINFO_RESPONSE_CODE, JSON_LONG},
|
|
|
- {"scheme", VAR_SCHEME, 0, CURLINFO_SCHEME, JSON_STRING},
|
|
|
- {"size_download", VAR_SIZE_DOWNLOAD, 0, CURLINFO_SIZE_DOWNLOAD_T,
|
|
|
- JSON_OFFSET},
|
|
|
- {"size_header", VAR_HEADER_SIZE, 0, CURLINFO_HEADER_SIZE, JSON_LONG},
|
|
|
- {"size_request", VAR_REQUEST_SIZE, 0, CURLINFO_REQUEST_SIZE, JSON_LONG},
|
|
|
- {"size_upload", VAR_SIZE_UPLOAD, 0, CURLINFO_SIZE_UPLOAD_T, JSON_OFFSET},
|
|
|
- {"speed_download", VAR_SPEED_DOWNLOAD, 0, CURLINFO_SPEED_DOWNLOAD_T,
|
|
|
- JSON_OFFSET},
|
|
|
- {"speed_upload", VAR_SPEED_UPLOAD, 0, CURLINFO_SPEED_UPLOAD_T, JSON_OFFSET},
|
|
|
- {"ssl_verify_result", VAR_SSL_VERIFY_RESULT, 0, CURLINFO_SSL_VERIFYRESULT,
|
|
|
- JSON_LONG},
|
|
|
- {"stderr", VAR_STDERR, 1, 0, JSON_NONE},
|
|
|
- {"stdout", VAR_STDOUT, 1, 0, JSON_NONE},
|
|
|
- {"time_appconnect", VAR_APPCONNECT_TIME, 0, CURLINFO_APPCONNECT_TIME_T,
|
|
|
- JSON_TIME},
|
|
|
- {"time_connect", VAR_CONNECT_TIME, 0, CURLINFO_CONNECT_TIME_T, JSON_TIME},
|
|
|
- {"time_namelookup", VAR_NAMELOOKUP_TIME, 0, CURLINFO_NAMELOOKUP_TIME_T,
|
|
|
- JSON_TIME},
|
|
|
- {"time_pretransfer", VAR_PRETRANSFER_TIME, 0, CURLINFO_PRETRANSFER_TIME_T,
|
|
|
- JSON_TIME},
|
|
|
- {"time_redirect", VAR_REDIRECT_TIME, 0, CURLINFO_REDIRECT_TIME_T, JSON_TIME},
|
|
|
- {"time_starttransfer", VAR_STARTTRANSFER_TIME, 0,
|
|
|
- CURLINFO_STARTTRANSFER_TIME_T, JSON_TIME},
|
|
|
- {"time_total", VAR_TOTAL_TIME, 0, CURLINFO_TOTAL_TIME_T, JSON_TIME},
|
|
|
- {"url", VAR_INPUT_URL, 0, 0, JSON_STRING},
|
|
|
- {"url_effective", VAR_EFFECTIVE_URL, 0, CURLINFO_EFFECTIVE_URL, JSON_STRING},
|
|
|
- {"urlnum", VAR_URLNUM, 0, 0, JSON_LONG},
|
|
|
- {NULL, VAR_NONE, 1, 0, JSON_NONE}
|
|
|
+ {"content_type", VAR_CONTENT_TYPE, CURLINFO_CONTENT_TYPE, writeString},
|
|
|
+ {"errormsg", VAR_ERRORMSG, 0, writeString},
|
|
|
+ {"exitcode", VAR_EXITCODE, 0, writeLong},
|
|
|
+ {"filename_effective", VAR_EFFECTIVE_FILENAME, 0, writeString},
|
|
|
+ {"ftp_entry_path", VAR_FTP_ENTRY_PATH, CURLINFO_FTP_ENTRY_PATH, writeString},
|
|
|
+ {"http_code", VAR_HTTP_CODE, CURLINFO_RESPONSE_CODE, writeLong},
|
|
|
+ {"http_connect", VAR_HTTP_CODE_PROXY, CURLINFO_HTTP_CONNECTCODE, writeLong},
|
|
|
+ {"http_version", VAR_HTTP_VERSION, CURLINFO_HTTP_VERSION, writeString},
|
|
|
+ {"json", VAR_JSON, 0, NULL},
|
|
|
+ {"local_ip", VAR_LOCAL_IP, CURLINFO_LOCAL_IP, writeString},
|
|
|
+ {"local_port", VAR_LOCAL_PORT, CURLINFO_LOCAL_PORT, writeLong},
|
|
|
+ {"method", VAR_EFFECTIVE_METHOD, CURLINFO_EFFECTIVE_METHOD, writeString},
|
|
|
+ {"num_connects", VAR_NUM_CONNECTS, CURLINFO_NUM_CONNECTS, writeLong},
|
|
|
+ {"num_headers", VAR_NUM_HEADERS, 0, writeLong},
|
|
|
+ {"num_redirects", VAR_REDIRECT_COUNT, CURLINFO_REDIRECT_COUNT, writeLong},
|
|
|
+ {"onerror", VAR_ONERROR, 0, NULL},
|
|
|
+ {"proxy_ssl_verify_result", VAR_PROXY_SSL_VERIFY_RESULT,
|
|
|
+ CURLINFO_PROXY_SSL_VERIFYRESULT, writeLong},
|
|
|
+ {"redirect_url", VAR_REDIRECT_URL, CURLINFO_REDIRECT_URL, writeString},
|
|
|
+ {"remote_ip", VAR_PRIMARY_IP, CURLINFO_PRIMARY_IP, writeString},
|
|
|
+ {"remote_port", VAR_PRIMARY_PORT, CURLINFO_PRIMARY_PORT, writeLong},
|
|
|
+ {"response_code", VAR_HTTP_CODE, CURLINFO_RESPONSE_CODE, writeLong},
|
|
|
+ {"scheme", VAR_SCHEME, CURLINFO_SCHEME, writeString},
|
|
|
+ {"size_download", VAR_SIZE_DOWNLOAD, CURLINFO_SIZE_DOWNLOAD_T, writeOffset},
|
|
|
+ {"size_header", VAR_HEADER_SIZE, CURLINFO_HEADER_SIZE, writeLong},
|
|
|
+ {"size_request", VAR_REQUEST_SIZE, CURLINFO_REQUEST_SIZE, writeLong},
|
|
|
+ {"size_upload", VAR_SIZE_UPLOAD, CURLINFO_SIZE_UPLOAD_T, writeOffset},
|
|
|
+ {"speed_download", VAR_SPEED_DOWNLOAD, CURLINFO_SPEED_DOWNLOAD_T,
|
|
|
+ writeOffset},
|
|
|
+ {"speed_upload", VAR_SPEED_UPLOAD, CURLINFO_SPEED_UPLOAD_T, writeOffset},
|
|
|
+ {"ssl_verify_result", VAR_SSL_VERIFY_RESULT, CURLINFO_SSL_VERIFYRESULT,
|
|
|
+ writeLong},
|
|
|
+ {"stderr", VAR_STDERR, 0, NULL},
|
|
|
+ {"stdout", VAR_STDOUT, 0, NULL},
|
|
|
+ {"time_appconnect", VAR_APPCONNECT_TIME, CURLINFO_APPCONNECT_TIME_T,
|
|
|
+ writeTime},
|
|
|
+ {"time_connect", VAR_CONNECT_TIME, CURLINFO_CONNECT_TIME_T, writeTime},
|
|
|
+ {"time_namelookup", VAR_NAMELOOKUP_TIME, CURLINFO_NAMELOOKUP_TIME_T,
|
|
|
+ writeTime},
|
|
|
+ {"time_pretransfer", VAR_PRETRANSFER_TIME, CURLINFO_PRETRANSFER_TIME_T,
|
|
|
+ writeTime},
|
|
|
+ {"time_redirect", VAR_REDIRECT_TIME, CURLINFO_REDIRECT_TIME_T, writeTime},
|
|
|
+ {"time_starttransfer", VAR_STARTTRANSFER_TIME, CURLINFO_STARTTRANSFER_TIME_T,
|
|
|
+ writeTime},
|
|
|
+ {"time_total", VAR_TOTAL_TIME, CURLINFO_TOTAL_TIME_T, writeTime},
|
|
|
+ {"url", VAR_INPUT_URL, 0, writeString},
|
|
|
+ {"url_effective", VAR_EFFECTIVE_URL, CURLINFO_EFFECTIVE_URL, writeString},
|
|
|
+ {"urlnum", VAR_URLNUM, 0, writeLong},
|
|
|
+ {NULL, VAR_NONE, 0, NULL}
|
|
|
};
|
|
|
|
|
|
-static void us2sec(FILE *stream, curl_off_t us)
|
|
|
+static int writeTime(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json)
|
|
|
{
|
|
|
- curl_off_t secs = us / 1000000;
|
|
|
- us %= 1000000;
|
|
|
- fprintf(stream, "%" CURL_FORMAT_CURL_OFF_TU ".%06" CURL_FORMAT_CURL_OFF_TU,
|
|
|
- secs, us);
|
|
|
+ bool valid = false;
|
|
|
+ curl_off_t us = 0;
|
|
|
+
|
|
|
+ (void)per;
|
|
|
+ (void)per_result;
|
|
|
+ DEBUGASSERT(wovar->writefunc == writeTime);
|
|
|
+
|
|
|
+ if(wovar->ci) {
|
|
|
+ if(!curl_easy_getinfo(per->curl, wovar->ci, &us))
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DEBUGASSERT(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(valid) {
|
|
|
+ curl_off_t secs = us / 1000000;
|
|
|
+ us %= 1000000;
|
|
|
+
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":", wovar->name);
|
|
|
+
|
|
|
+ fprintf(stream, "%" CURL_FORMAT_CURL_OFF_TU
|
|
|
+ ".%06" CURL_FORMAT_CURL_OFF_TU, secs, us);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":null", wovar->name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1; /* return 1 if anything was written */
|
|
|
}
|
|
|
|
|
|
-void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo,
|
|
|
- CURLcode result)
|
|
|
+static int writeString(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json)
|
|
|
+{
|
|
|
+ bool valid = false;
|
|
|
+ const char *strinfo = NULL;
|
|
|
+
|
|
|
+ DEBUGASSERT(wovar->writefunc == writeString);
|
|
|
+
|
|
|
+ if(wovar->ci) {
|
|
|
+ if(wovar->ci == CURLINFO_HTTP_VERSION) {
|
|
|
+ long version = 0;
|
|
|
+ if(!curl_easy_getinfo(per->curl, CURLINFO_HTTP_VERSION, &version) &&
|
|
|
+ (version >= 0) &&
|
|
|
+ (version < (long)(sizeof(http_version)/sizeof(http_version[0])))) {
|
|
|
+ strinfo = http_version[version];
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if(!curl_easy_getinfo(per->curl, wovar->ci, &strinfo) && strinfo)
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ switch(wovar->id) {
|
|
|
+ case VAR_ERRORMSG:
|
|
|
+ if(per_result) {
|
|
|
+ strinfo = per->errorbuffer[0] ? per->errorbuffer :
|
|
|
+ curl_easy_strerror(per_result);
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case VAR_EFFECTIVE_FILENAME:
|
|
|
+ if(per->outs.filename) {
|
|
|
+ strinfo = per->outs.filename;
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case VAR_INPUT_URL:
|
|
|
+ if(per->this_url) {
|
|
|
+ strinfo = per->this_url;
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ DEBUGASSERT(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(valid) {
|
|
|
+ DEBUGASSERT(strinfo);
|
|
|
+ if(use_json) {
|
|
|
+ fprintf(stream, "\"%s\":\"", wovar->name);
|
|
|
+ jsonWriteString(stream, strinfo);
|
|
|
+ fputs("\"", stream);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ fputs(strinfo, stream);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":null", wovar->name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1; /* return 1 if anything was written */
|
|
|
+}
|
|
|
+
|
|
|
+static int writeLong(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json)
|
|
|
+{
|
|
|
+ bool valid = false;
|
|
|
+ long longinfo = 0;
|
|
|
+
|
|
|
+ DEBUGASSERT(wovar->writefunc == writeLong);
|
|
|
+
|
|
|
+ if(wovar->ci) {
|
|
|
+ if(!curl_easy_getinfo(per->curl, wovar->ci, &longinfo))
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ switch(wovar->id) {
|
|
|
+ case VAR_NUM_HEADERS:
|
|
|
+ longinfo = per->num_headers;
|
|
|
+ valid = true;
|
|
|
+ break;
|
|
|
+ case VAR_EXITCODE:
|
|
|
+ longinfo = per_result;
|
|
|
+ valid = true;
|
|
|
+ break;
|
|
|
+ case VAR_URLNUM:
|
|
|
+ if(per->urlnum <= INT_MAX) {
|
|
|
+ longinfo = (long)per->urlnum;
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ DEBUGASSERT(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(valid) {
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":", wovar->name);
|
|
|
+
|
|
|
+ if(wovar->id == VAR_HTTP_CODE || wovar->id == VAR_HTTP_CODE_PROXY)
|
|
|
+ fprintf(stream, "%03ld", longinfo);
|
|
|
+ else
|
|
|
+ fprintf(stream, "%ld", longinfo);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":null", wovar->name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1; /* return 1 if anything was written */
|
|
|
+}
|
|
|
+
|
|
|
+static int writeOffset(FILE *stream, const struct writeoutvar *wovar,
|
|
|
+ struct per_transfer *per, CURLcode per_result,
|
|
|
+ bool use_json)
|
|
|
+{
|
|
|
+ bool valid = false;
|
|
|
+ curl_off_t offinfo = 0;
|
|
|
+
|
|
|
+ (void)per;
|
|
|
+ (void)per_result;
|
|
|
+ DEBUGASSERT(wovar->writefunc == writeOffset);
|
|
|
+
|
|
|
+ if(wovar->ci) {
|
|
|
+ if(!curl_easy_getinfo(per->curl, wovar->ci, &offinfo))
|
|
|
+ valid = true;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DEBUGASSERT(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(valid) {
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":", wovar->name);
|
|
|
+
|
|
|
+ fprintf(stream, "%" CURL_FORMAT_CURL_OFF_T, offinfo);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if(use_json)
|
|
|
+ fprintf(stream, "\"%s\":null", wovar->name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1; /* return 1 if anything was written */
|
|
|
+}
|
|
|
+
|
|
|
+void ourWriteOut(const char *writeinfo, struct per_transfer *per,
|
|
|
+ CURLcode per_result)
|
|
|
{
|
|
|
FILE *stream = stdout;
|
|
|
const char *ptr = writeinfo;
|
|
|
- char *stringp = NULL;
|
|
|
- long longinfo;
|
|
|
- curl_off_t offinfo;
|
|
|
bool done = FALSE;
|
|
|
|
|
|
while(ptr && *ptr && !done) {
|
|
@@ -129,217 +340,10 @@ void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo,
|
|
|
match = TRUE;
|
|
|
switch(variables[i].id) {
|
|
|
case VAR_ONERROR:
|
|
|
- if(result == CURLE_OK)
|
|
|
+ if(per_result == CURLE_OK)
|
|
|
/* this isn't error so skip the rest */
|
|
|
done = TRUE;
|
|
|
break;
|
|
|
- case VAR_EXITCODE:
|
|
|
- fprintf(stream, "%d", (int)result);
|
|
|
- break;
|
|
|
- case VAR_ERRORMSG:
|
|
|
- if(result)
|
|
|
- fputs(per->errorbuffer[0] ? per->errorbuffer :
|
|
|
- curl_easy_strerror(result), stream);
|
|
|
- break;
|
|
|
- case VAR_INPUT_URL:
|
|
|
- if(per->this_url)
|
|
|
- fputs(per->this_url, stream);
|
|
|
- break;
|
|
|
- case VAR_URLNUM:
|
|
|
- fprintf(stream, "%u", per->urlnum);
|
|
|
- break;
|
|
|
- case VAR_EFFECTIVE_URL:
|
|
|
- if((CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &stringp))
|
|
|
- && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_EFFECTIVE_METHOD:
|
|
|
- if((CURLE_OK == curl_easy_getinfo(curl,
|
|
|
- CURLINFO_EFFECTIVE_METHOD,
|
|
|
- &stringp))
|
|
|
- && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_HTTP_CODE:
|
|
|
- if(CURLE_OK ==
|
|
|
- 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,
|
|
|
- &longinfo))
|
|
|
- fprintf(stream, "%03ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_HEADER_SIZE:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_HEADER_SIZE, &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_REQUEST_SIZE:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_NUM_CONNECTS:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_NUM_CONNECTS, &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_REDIRECT_COUNT:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_REDIRECT_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME_T, &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_TOTAL_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_NAMELOOKUP_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME_T,
|
|
|
- &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_CONNECT_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME_T, &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_APPCONNECT_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_APPCONNECT_TIME_T,
|
|
|
- &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_PRETRANSFER_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME_T,
|
|
|
- &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_STARTTRANSFER_TIME:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME_T,
|
|
|
- &offinfo))
|
|
|
- us2sec(stream, offinfo);
|
|
|
- break;
|
|
|
- case VAR_SIZE_UPLOAD:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD_T, &offinfo))
|
|
|
- fprintf(stream, "%" CURL_FORMAT_CURL_OFF_TU, offinfo);
|
|
|
- break;
|
|
|
- case VAR_SIZE_DOWNLOAD:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T,
|
|
|
- &offinfo))
|
|
|
- fprintf(stream, "%" CURL_FORMAT_CURL_OFF_TU, offinfo);
|
|
|
- break;
|
|
|
- case VAR_SPEED_DOWNLOAD:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD_T,
|
|
|
- &offinfo))
|
|
|
- fprintf(stream, "%" CURL_FORMAT_CURL_OFF_TU, offinfo);
|
|
|
- break;
|
|
|
- case VAR_SPEED_UPLOAD:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD_T, &offinfo))
|
|
|
- fprintf(stream, "%" CURL_FORMAT_CURL_OFF_TU, offinfo);
|
|
|
- break;
|
|
|
- case VAR_CONTENT_TYPE:
|
|
|
- if((CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &stringp))
|
|
|
- && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_FTP_ENTRY_PATH:
|
|
|
- if((CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_FTP_ENTRY_PATH, &stringp))
|
|
|
- && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_REDIRECT_URL:
|
|
|
- if((CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &stringp))
|
|
|
- && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_SSL_VERIFY_RESULT:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT,
|
|
|
- &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_PROXY_SSL_VERIFY_RESULT:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_PROXY_SSL_VERIFYRESULT,
|
|
|
- &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_EFFECTIVE_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)) && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_PRIMARY_PORT:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT,
|
|
|
- &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_LOCAL_IP:
|
|
|
- if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
|
|
|
- &stringp)) && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
- case VAR_LOCAL_PORT:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT,
|
|
|
- &longinfo))
|
|
|
- fprintf(stream, "%ld", longinfo);
|
|
|
- break;
|
|
|
- case VAR_HTTP_VERSION:
|
|
|
- if(CURLE_OK ==
|
|
|
- curl_easy_getinfo(curl, CURLINFO_HTTP_VERSION,
|
|
|
- &longinfo)) {
|
|
|
- const char *version = "0";
|
|
|
- switch(longinfo) {
|
|
|
- case CURL_HTTP_VERSION_1_0:
|
|
|
- version = "1.0";
|
|
|
- break;
|
|
|
- case CURL_HTTP_VERSION_1_1:
|
|
|
- version = "1.1";
|
|
|
- break;
|
|
|
- case CURL_HTTP_VERSION_2_0:
|
|
|
- version = "2";
|
|
|
- break;
|
|
|
- case CURL_HTTP_VERSION_3:
|
|
|
- version = "3";
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- fprintf(stream, version);
|
|
|
- }
|
|
|
- break;
|
|
|
- case VAR_SCHEME:
|
|
|
- if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_SCHEME,
|
|
|
- &stringp)) && stringp)
|
|
|
- fputs(stringp, stream);
|
|
|
- break;
|
|
|
case VAR_STDOUT:
|
|
|
stream = stdout;
|
|
|
break;
|
|
@@ -347,8 +351,11 @@ void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo,
|
|
|
stream = stderr;
|
|
|
break;
|
|
|
case VAR_JSON:
|
|
|
- ourWriteOutJSON(variables, curl, per, stream);
|
|
|
+ ourWriteOutJSON(stream, variables, per, per_result);
|
|
|
+ break;
|
|
|
default:
|
|
|
+ (void)variables[i].writefunc(stream, &variables[i],
|
|
|
+ per, per_result, false);
|
|
|
break;
|
|
|
}
|
|
|
break;
|