]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool_operate: split single_transfer into sub functions
authorDaniel Stenberg <daniel@haxx.se>
Sun, 11 Jan 2026 16:47:49 +0000 (17:47 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 12 Jan 2026 07:42:23 +0000 (08:42 +0100)
To make it more manageable and less complex

Closes #20258

src/tool_operate.c

index fda2226f60dc2906fe19e30978da6f899ee088f2..554027734c44917bd1eb261478f1df0734a33969 100644 (file)
@@ -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 */
 
 /*