diff options
author | Maxim Yurchuk <maxim-yurchuk@ydb.tech> | 2024-10-18 20:31:38 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 20:31:38 +0300 |
commit | 2a74bac2d2d3bccb4e10120f1ead805640ec9dd0 (patch) | |
tree | 047e4818ced5aaf73f58517629e5260b5291f9f0 /contrib/libs/curl/src/tool_writeout.c | |
parent | 2d9656823e9521d8c29ea4c9a1d0eab78391abfc (diff) | |
parent | 3d834a1923bbf9403cd4a448e7f32b670aa4124f (diff) | |
download | ydb-2a74bac2d2d3bccb4e10120f1ead805640ec9dd0.tar.gz |
Merge pull request #10502 from ydb-platform/mergelibs-241016-1210
Library import 241016-1210
Diffstat (limited to 'contrib/libs/curl/src/tool_writeout.c')
-rw-r--r-- | contrib/libs/curl/src/tool_writeout.c | 156 |
1 files changed, 63 insertions, 93 deletions
diff --git a/contrib/libs/curl/src/tool_writeout.c b/contrib/libs/curl/src/tool_writeout.c index 141178c332..981065c9ef 100644 --- a/contrib/libs/curl/src/tool_writeout.c +++ b/contrib/libs/curl/src/tool_writeout.c @@ -22,7 +22,8 @@ * ***************************************************************************/ #include "tool_setup.h" - +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ #include "curlx.h" #include "tool_cfgable.h" #include "tool_writeout.h" @@ -69,12 +70,12 @@ static const struct httpmap http_version[] = { Yes: "http_version": "1.1" No: "http_version": 1.1 - Variable names MUST be in alphabetical order. + Variable names should be in alphabetical order. */ static const struct writeoutvar variables[] = { {"certs", VAR_CERT, CURLINFO_NONE, writeString}, - {"conn_id", VAR_CONN_ID, CURLINFO_CONN_ID, writeOffset}, {"content_type", VAR_CONTENT_TYPE, CURLINFO_CONTENT_TYPE, writeString}, + {"conn_id", VAR_CONN_ID, CURLINFO_CONN_ID, writeOffset}, {"errormsg", VAR_ERRORMSG, CURLINFO_NONE, writeString}, {"exitcode", VAR_EXITCODE, CURLINFO_NONE, writeLong}, {"filename_effective", VAR_EFFECTIVE_FILENAME, CURLINFO_NONE, writeString}, @@ -91,11 +92,9 @@ static const struct writeoutvar variables[] = { {"num_connects", VAR_NUM_CONNECTS, CURLINFO_NUM_CONNECTS, writeLong}, {"num_headers", VAR_NUM_HEADERS, CURLINFO_NONE, writeLong}, {"num_redirects", VAR_REDIRECT_COUNT, CURLINFO_REDIRECT_COUNT, writeLong}, - {"num_retries", VAR_NUM_RETRY, CURLINFO_NONE, writeLong}, {"onerror", VAR_ONERROR, CURLINFO_NONE, NULL}, {"proxy_ssl_verify_result", VAR_PROXY_SSL_VERIFY_RESULT, CURLINFO_PROXY_SSL_VERIFYRESULT, writeLong}, - {"proxy_used", VAR_PROXY_USED, CURLINFO_USED_PROXY, writeLong}, {"redirect_url", VAR_REDIRECT_URL, CURLINFO_REDIRECT_URL, writeString}, {"referer", VAR_REFERER, CURLINFO_REFERER, writeString}, {"remote_ip", VAR_PRIMARY_IP, CURLINFO_PRIMARY_IP, writeString}, @@ -118,8 +117,6 @@ static const struct writeoutvar variables[] = { {"time_connect", VAR_CONNECT_TIME, CURLINFO_CONNECT_TIME_T, writeTime}, {"time_namelookup", VAR_NAMELOOKUP_TIME, CURLINFO_NAMELOOKUP_TIME_T, writeTime}, - {"time_posttransfer", VAR_POSTTRANSFER_TIME, CURLINFO_POSTTRANSFER_TIME_T, - writeTime}, {"time_pretransfer", VAR_PRETRANSFER_TIME, CURLINFO_PRETRANSFER_TIME_T, writeTime}, {"time_redirect", VAR_REDIRECT_TIME, CURLINFO_REDIRECT_TIME_T, writeTime}, @@ -127,29 +124,30 @@ static const struct writeoutvar variables[] = { writeTime}, {"time_total", VAR_TOTAL_TIME, CURLINFO_TOTAL_TIME_T, writeTime}, {"url", VAR_INPUT_URL, CURLINFO_NONE, writeString}, - {"url.fragment", VAR_INPUT_URLFRAGMENT, CURLINFO_NONE, writeString}, - {"url.host", VAR_INPUT_URLHOST, CURLINFO_NONE, writeString}, - {"url.options", VAR_INPUT_URLOPTIONS, CURLINFO_NONE, writeString}, + {"url.scheme", VAR_INPUT_URLSCHEME, CURLINFO_NONE, writeString}, + {"url.user", VAR_INPUT_URLUSER, CURLINFO_NONE, writeString}, {"url.password", VAR_INPUT_URLPASSWORD, CURLINFO_NONE, writeString}, - {"url.path", VAR_INPUT_URLPATH, CURLINFO_NONE, writeString}, + {"url.options", VAR_INPUT_URLOPTIONS, CURLINFO_NONE, writeString}, + {"url.host", VAR_INPUT_URLHOST, CURLINFO_NONE, writeString}, {"url.port", VAR_INPUT_URLPORT, CURLINFO_NONE, writeString}, + {"url.path", VAR_INPUT_URLPATH, CURLINFO_NONE, writeString}, {"url.query", VAR_INPUT_URLQUERY, CURLINFO_NONE, writeString}, - {"url.scheme", VAR_INPUT_URLSCHEME, CURLINFO_NONE, writeString}, - {"url.user", VAR_INPUT_URLUSER, CURLINFO_NONE, writeString}, + {"url.fragment", VAR_INPUT_URLFRAGMENT, CURLINFO_NONE, writeString}, {"url.zoneid", VAR_INPUT_URLZONEID, CURLINFO_NONE, writeString}, - {"url_effective", VAR_EFFECTIVE_URL, CURLINFO_EFFECTIVE_URL, writeString}, - {"urle.fragment", VAR_INPUT_URLEFRAGMENT, CURLINFO_NONE, writeString}, - {"urle.host", VAR_INPUT_URLEHOST, CURLINFO_NONE, writeString}, - {"urle.options", VAR_INPUT_URLEOPTIONS, CURLINFO_NONE, writeString}, + {"urle.scheme", VAR_INPUT_URLESCHEME, CURLINFO_NONE, writeString}, + {"urle.user", VAR_INPUT_URLEUSER, CURLINFO_NONE, writeString}, {"urle.password", VAR_INPUT_URLEPASSWORD, CURLINFO_NONE, writeString}, - {"urle.path", VAR_INPUT_URLEPATH, CURLINFO_NONE, writeString}, + {"urle.options", VAR_INPUT_URLEOPTIONS, CURLINFO_NONE, writeString}, + {"urle.host", VAR_INPUT_URLEHOST, CURLINFO_NONE, writeString}, {"urle.port", VAR_INPUT_URLEPORT, CURLINFO_NONE, writeString}, + {"urle.path", VAR_INPUT_URLEPATH, CURLINFO_NONE, writeString}, {"urle.query", VAR_INPUT_URLEQUERY, CURLINFO_NONE, writeString}, - {"urle.scheme", VAR_INPUT_URLESCHEME, CURLINFO_NONE, writeString}, - {"urle.user", VAR_INPUT_URLEUSER, CURLINFO_NONE, writeString}, + {"urle.fragment", VAR_INPUT_URLEFRAGMENT, CURLINFO_NONE, writeString}, {"urle.zoneid", VAR_INPUT_URLEZONEID, CURLINFO_NONE, writeString}, + {"url_effective", VAR_EFFECTIVE_URL, CURLINFO_EFFECTIVE_URL, writeString}, {"urlnum", VAR_URLNUM, CURLINFO_NONE, writeLong}, - {"xfer_id", VAR_EASY_ID, CURLINFO_XFER_ID, writeOffset} + {"xfer_id", VAR_EASY_ID, CURLINFO_XFER_ID, writeOffset}, + {NULL, VAR_NONE, CURLINFO_NONE, NULL} }; static int writeTime(FILE *stream, const struct writeoutvar *wovar, @@ -199,7 +197,7 @@ static int urlpart(struct per_transfer *per, writeoutid vid, char *part = NULL; const char *url = NULL; - if(vid >= VAR_INPUT_URLESCHEME) { + if(vid >= VAR_INPUT_URLEHOST) { if(curl_easy_getinfo(per->curl, CURLINFO_EFFECTIVE_URL, &url)) rc = 5; } @@ -270,15 +268,6 @@ static int urlpart(struct per_transfer *per, writeoutid vid, return rc; } -static void certinfo(struct per_transfer *per) -{ - if(!per->certinfo) { - struct curl_certinfo *certinfo; - CURLcode res = curl_easy_getinfo(per->curl, CURLINFO_CERTINFO, &certinfo); - per->certinfo = (!res && certinfo) ? certinfo : NULL; - } -} - static int writeString(FILE *stream, const struct writeoutvar *wovar, struct per_transfer *per, CURLcode per_result, bool use_json) @@ -314,7 +303,6 @@ static int writeString(FILE *stream, const struct writeoutvar *wovar, else { switch(wovar->id) { case VAR_CERT: - certinfo(per); if(per->certinfo) { int i; bool error = FALSE; @@ -445,12 +433,7 @@ static int writeLong(FILE *stream, const struct writeoutvar *wovar, } else { switch(wovar->id) { - case VAR_NUM_RETRY: - longinfo = per->num_retries; - valid = true; - break; case VAR_NUM_CERTS: - certinfo(per); longinfo = per->certinfo ? per->certinfo->num_of_certs : 0; valid = true; break; @@ -459,7 +442,7 @@ static int writeLong(FILE *stream, const struct writeoutvar *wovar, valid = true; break; case VAR_EXITCODE: - longinfo = (long)per_result; + longinfo = per_result; valid = true; break; case VAR_URLNUM: @@ -525,17 +508,6 @@ static int writeOffset(FILE *stream, const struct writeoutvar *wovar, return 1; /* return 1 if anything was written */ } -static int -matchvar(const void *m1, const void *m2) -{ - const struct writeoutvar *v1 = m1; - const struct writeoutvar *v2 = m2; - - return strcmp(v1->name, v2->name); -} - -#define MAX_WRITEOUT_NAME_LENGTH 24 - void ourWriteOut(struct OperationConfig *config, struct per_transfer *per, CURLcode per_result) { @@ -543,13 +515,16 @@ void ourWriteOut(struct OperationConfig *config, struct per_transfer *per, const char *writeinfo = config->writeout; const char *ptr = writeinfo; bool done = FALSE; + struct curl_certinfo *certinfo; + CURLcode res = curl_easy_getinfo(per->curl, CURLINFO_CERTINFO, &certinfo); bool fclose_stream = FALSE; - struct dynbuf name; if(!writeinfo) return; - curlx_dyn_init(&name, MAX_WRITEOUT_NAME_LENGTH); + if(!res && certinfo) + per->certinfo = certinfo; + while(ptr && *ptr && !done) { if('%' == *ptr && ptr[1]) { if('%' == ptr[1]) { @@ -562,8 +537,8 @@ void ourWriteOut(struct OperationConfig *config, struct per_transfer *per, char *end; size_t vlen; if('{' == ptr[1]) { - struct writeoutvar *wv = NULL; - struct writeoutvar find = { 0 }; + int i; + bool match = FALSE; end = strchr(ptr, '}'); ptr += 2; /* pass the % and the { */ if(!end) { @@ -571,47 +546,43 @@ void ourWriteOut(struct OperationConfig *config, struct per_transfer *per, continue; } vlen = end - ptr; - - curlx_dyn_reset(&name); - if(!curlx_dyn_addn(&name, ptr, vlen)) { - find.name = curlx_dyn_ptr(&name); - wv = bsearch(&find, - variables, sizeof(variables)/sizeof(variables[0]), - sizeof(variables[0]), matchvar); - } - if(wv) { - switch(wv->id) { - case VAR_ONERROR: - if(per_result == CURLE_OK) - /* this is not error so skip the rest */ - done = TRUE; - break; - case VAR_STDOUT: - if(fclose_stream) - fclose(stream); - fclose_stream = FALSE; - stream = stdout; - break; - case VAR_STDERR: - if(fclose_stream) - fclose(stream); - fclose_stream = FALSE; - stream = tool_stderr; - break; - case VAR_JSON: - ourWriteOutJSON(stream, variables, - sizeof(variables)/sizeof(variables[0]), - per, per_result); - break; - case VAR_HEADER_JSON: - headerJSON(stream, per); - break; - default: - (void)wv->writefunc(stream, wv, per, per_result, false); + for(i = 0; variables[i].name; i++) { + if((strlen(variables[i].name) == vlen) && + curl_strnequal(ptr, variables[i].name, vlen)) { + match = TRUE; + switch(variables[i].id) { + case VAR_ONERROR: + if(per_result == CURLE_OK) + /* this isn't error so skip the rest */ + done = TRUE; + break; + case VAR_STDOUT: + if(fclose_stream) + fclose(stream); + fclose_stream = FALSE; + stream = stdout; + break; + case VAR_STDERR: + if(fclose_stream) + fclose(stream); + fclose_stream = FALSE; + stream = tool_stderr; + break; + case VAR_JSON: + ourWriteOutJSON(stream, variables, per, per_result); + break; + case VAR_HEADER_JSON: + headerJSON(stream, per); + break; + default: + (void)variables[i].writefunc(stream, &variables[i], + per, per_result, false); + break; + } break; } } - else { + if(!match) { fprintf(tool_stderr, "curl: unknown --write-out variable: '%.*s'\n", (int)vlen, ptr); @@ -646,7 +617,7 @@ void ourWriteOut(struct OperationConfig *config, struct per_transfer *per, } end = strchr(ptr, '}'); if(end) { - char fname[512]; /* holds the longest filename */ + char fname[512]; /* holds the longest file name */ size_t flen = end - ptr; if(flen < sizeof(fname)) { FILE *stream2; @@ -701,5 +672,4 @@ void ourWriteOut(struct OperationConfig *config, struct per_transfer *per, } if(fclose_stream) fclose(stream); - curlx_dyn_free(&name); } |