From: Daniel Stenberg Date: Sun, 11 Jan 2026 16:47:49 +0000 (+0100) Subject: tool_operate: split single_transfer into sub functions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=40fee505a03b357a7a9869317437fff9e16d8ba7;p=thirdparty%2Fcurl.git tool_operate: split single_transfer into sub functions To make it more manageable and less complex Closes #20258 --- diff --git a/src/tool_operate.c b/src/tool_operate.c index fda2226f60..554027734c 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -1147,48 +1147,32 @@ static void check_stdin_upload(struct OperationConfig *config, } } -/* create the next (singular) transfer */ -static CURLcode single_transfer(struct OperationConfig *config, - CURLSH *share, bool *added, bool *skipped) +static void setup_header_cb(struct OperationConfig *config, + struct HdrCbData *hdrcbdata, + struct getout *u, + struct OutStruct *outs, + struct OutStruct *heads, + struct OutStruct *etag) { - CURLcode result = CURLE_OK; - bool orig_noprogress = global->noprogress; - bool orig_isatty = global->isatty; - struct State *state = &global->state; - char *httpgetfields = state->httpgetfields; - - *skipped = *added = FALSE; /* not yet */ - - if(config->postfields) { - if(config->use_httpget) { - if(!httpgetfields) { - /* Use the postfields data for an HTTP get */ - httpgetfields = state->httpgetfields = config->postfields; - config->postfields = NULL; - if(SetHTTPrequest((config->no_body ? TOOL_HTTPREQ_HEAD : - TOOL_HTTPREQ_GET), &config->httpreq)) - return CURLE_FAILED_INIT; - } - } - else if(SetHTTPrequest(TOOL_HTTPREQ_SIMPLEPOST, &config->httpreq)) - return CURLE_FAILED_INIT; - } - - result = set_cert_types(config); - if(result) - return result; - - if(!state->urlnode) { - /* first time caller, setup things */ - state->urlnode = config->url_list; - state->upnum = 1; - } + hdrcbdata->honor_cd_filename = (config->content_disposition && u->useremote); + hdrcbdata->outs = outs; + hdrcbdata->heads = heads; + hdrcbdata->etag_save = etag; + hdrcbdata->config = config; +} +/* create a transfer */ +static CURLcode create_single(struct OperationConfig *config, + CURLSH *share, struct State *state, + bool *added, bool *skipped) +{ + const bool orig_isatty = global->isatty; + const bool orig_noprogress = global->noprogress; + CURLcode result = CURLE_OK; while(state->urlnode) { struct per_transfer *per = NULL; struct OutStruct *outs; struct OutStruct *heads; - struct HdrCbData *hdrcbdata = NULL; struct OutStruct etag_first; CURL *curl; struct getout *u = state->urlnode; @@ -1289,8 +1273,6 @@ static CURLcode single_transfer(struct OperationConfig *config, if(result) return result; } - hdrcbdata = &per->hdrcbdata; - outs = &per->outs; per->outfile = NULL; @@ -1357,9 +1339,8 @@ static CURLcode single_transfer(struct OperationConfig *config, global->isatty = orig_isatty; } - if(httpgetfields || config->query) { - result = append2query(config, per, - httpgetfields ? httpgetfields : config->query); + if(state->httpgetfields) { + result = append2query(config, per, state->httpgetfields); if(result) return result; } @@ -1374,12 +1355,7 @@ static CURLcode single_transfer(struct OperationConfig *config, /* explicitly passed to stdout means okaying binary gunk */ config->terminal_binary_ok = (per->outfile && !strcmp(per->outfile, "-")); - hdrcbdata->honor_cd_filename = - (config->content_disposition && u->useremote); - hdrcbdata->outs = outs; - hdrcbdata->heads = heads; - hdrcbdata->etag_save = &etag_first; - hdrcbdata->config = config; + setup_header_cb(config, &per->hdrcbdata, u, outs, heads, &etag_first); result = config2setopts(config, per, curl, share); if(result) @@ -1391,9 +1367,8 @@ static CURLcode single_transfer(struct OperationConfig *config, per->retry_sleep = per->retry_sleep_default; /* ms */ per->retrystart = curlx_now(); - state->urlidx++; /* Here's looping around each globbed URL */ - if(state->urlidx >= state->urlnum) { + if(++state->urlidx >= state->urlnum) { state->urlidx = state->urlnum = 0; glob_cleanup(&state->urlglob); state->upidx++; @@ -1405,6 +1380,46 @@ static CURLcode single_transfer(struct OperationConfig *config, return result; } +/* create the next (singular) transfer */ +static CURLcode single_transfer(struct OperationConfig *config, + CURLSH *share, bool *added, bool *skipped) +{ + CURLcode result = CURLE_OK; + struct State *state = &global->state; + char *httpgetfields = state->httpgetfields; + + *skipped = *added = FALSE; /* not yet */ + + if(config->postfields) { + if(config->use_httpget) { + if(!httpgetfields) { + /* Use the postfields data for an HTTP get */ + httpgetfields = state->httpgetfields = config->postfields; + config->postfields = NULL; + if(SetHTTPrequest((config->no_body ? TOOL_HTTPREQ_HEAD : + TOOL_HTTPREQ_GET), &config->httpreq)) + return CURLE_FAILED_INIT; + } + } + else if(SetHTTPrequest(TOOL_HTTPREQ_SIMPLEPOST, &config->httpreq)) + return CURLE_FAILED_INIT; + } + if(!httpgetfields) + state->httpgetfields = config->query; + + result = set_cert_types(config); + if(result) + return result; + + if(!state->urlnode) { + /* first time caller, setup things */ + state->urlnode = config->url_list; + state->upnum = 1; + } + + return create_single(config, share, state, added, skipped); +} + static long all_added; /* number of easy handles currently added */ /*