aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/curl/src/tool_writeout.c
diff options
context:
space:
mode:
authorMaxim Yurchuk <maxim-yurchuk@ydb.tech>2024-10-18 20:31:38 +0300
committerGitHub <noreply@github.com>2024-10-18 20:31:38 +0300
commit2a74bac2d2d3bccb4e10120f1ead805640ec9dd0 (patch)
tree047e4818ced5aaf73f58517629e5260b5291f9f0 /contrib/libs/curl/src/tool_writeout.c
parent2d9656823e9521d8c29ea4c9a1d0eab78391abfc (diff)
parent3d834a1923bbf9403cd4a448e7f32b670aa4124f (diff)
downloadydb-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.c156
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);
}