From: Daniel Stenberg Date: Wed, 11 Feb 2026 07:35:08 +0000 (+0100) Subject: tool_operate: split post_per_transfer into sub functions X-Git-Tag: rc-8_19_0-3~140 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=434e5312f45c8a3bc06f26ec0b2820131e60583a;p=thirdparty%2Fcurl.git tool_operate: split post_per_transfer into sub functions To make it easier to read and manage. Reduce complexity. Closes #20560 --- diff --git a/src/tool_operate.c b/src/tool_operate.c index 73be9a7360..618508aca4 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -589,43 +589,9 @@ static CURLcode retrycheck(struct OperationConfig *config, return result; } -/* - * Call this after a transfer has completed. - */ -static CURLcode post_per_transfer(struct per_transfer *per, - CURLcode result, - bool *retryp, - long *delay) /* milliseconds! */ +static CURLcode post_check_result(struct per_transfer *per, CURLcode result) { - struct OutStruct *outs = &per->outs; - CURL *curl = per->curl; struct OperationConfig *config = per->config; - int rc; - - *retryp = FALSE; - *delay = 0; /* for no retry, keep it zero */ - - if(!curl || !config) - return result; - -#ifdef _WIN32 - if(per->uploadfile) { - if(!strcmp(per->uploadfile, ".") && per->infd > 0) { -#ifndef CURL_WINDOWS_UWP - sclose(per->infd); -#else - warnf("Closing per->infd != 0: FD == %d. " - "This behavior is only supported on desktop Windows", per->infd); -#endif - } - } - else -#endif - if(per->infdopen) - curlx_close(per->infd); - - if(per->skip) - goto skip; #ifdef __VMS if(is_vms_shell()) { @@ -645,15 +611,31 @@ static CURLcode post_per_transfer(struct per_transfer *per, else if(config->fail == FAIL_WITH_BODY) { /* if HTTP response >= 400, return error */ long code = 0; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + curl_easy_getinfo(per->curl, CURLINFO_RESPONSE_CODE, &code); if(code >= 400) { if(!global->silent || global->showerror) curl_mfprintf(tool_stderr, "curl: (%d) The requested URL returned error: %ld\n", CURLE_HTTP_RETURNED_ERROR, code); - result = CURLE_HTTP_RETURNED_ERROR; + return CURLE_HTTP_RETURNED_ERROR; } } + return result; +} + +static CURLcode post_output_handling(struct per_transfer *per, + CURLcode result) +{ + struct OutStruct *outs = &per->outs; + struct OperationConfig *config = per->config; + CURL *curl = per->curl; + int rc; + +#ifdef _WIN32 + /* Discard incomplete UTF-8 sequence buffered from body */ + memset(outs->utf8seq, 0, sizeof(outs->utf8seq)); +#endif + /* Set file extended attributes */ if(!result && config->xattr && outs->fopened && outs->stream) { rc = fwrite_xattr(curl, per->url, fileno(outs->stream)); @@ -673,7 +655,7 @@ static CURLcode post_per_transfer(struct per_transfer *per, data because of unmet condition */ curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet); if(!cond_unmet && !tool_create_output_file(outs, config)) - result = CURLE_WRITE_ERROR; + return CURLE_WRITE_ERROR; } if(!outs->regular_file && outs->stream) { @@ -681,33 +663,20 @@ static CURLcode post_per_transfer(struct per_transfer *per, rc = fflush(outs->stream); if(!result && rc) { /* something went wrong in the writing process */ - result = CURLE_WRITE_ERROR; errorf("Failed writing body"); + return CURLE_WRITE_ERROR; } } -#ifdef _WIN32 - /* Discard incomplete UTF-8 sequence buffered from body */ - if(outs->utf8seq[0]) - memset(outs->utf8seq, 0, sizeof(outs->utf8seq)); -#endif - - /* if retry-max-time is non-zero, make sure we have not exceeded the - time */ - if(per->retry_remaining && - (!config->retry_maxtime_ms || - (curlx_timediff_ms(curlx_now(), per->retrystart) < - config->retry_maxtime_ms))) { - result = retrycheck(config, per, result, retryp, delay); - if(!result && *retryp) - return CURLE_OK; /* retry! */ - } + return result; +} - if((global->progressmode == CURL_PROGRESS_BAR) && - per->progressbar.calls) - /* if the custom progress bar has been displayed, we output a - newline here */ - fputs("\n", per->progressbar.out); +static CURLcode post_close_output(struct per_transfer *per, + CURLcode result) +{ + struct OutStruct *outs = &per->outs; + struct OperationConfig *config = per->config; + int rc; /* Close the outs file */ if(outs->fopened && outs->stream) { @@ -734,11 +703,68 @@ static CURLcode post_per_transfer(struct per_transfer *per, if(!result && config->remote_time && outs->regular_file && outs->filename) { /* Ask libcurl if we got a remote file time */ curl_off_t filetime = -1; - curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime); + curl_easy_getinfo(per->curl, CURLINFO_FILETIME_T, &filetime); if(filetime != -1) setfiletime(filetime, outs->filename); } -skip: + return result; +} +/* + * Call this after a transfer has completed. + */ +static CURLcode post_per_transfer(struct per_transfer *per, + CURLcode result, + bool *retryp, + long *delay) /* milliseconds! */ +{ + struct OutStruct *outs = &per->outs; + struct OperationConfig *config = per->config; + + *retryp = FALSE; + *delay = 0; /* for no retry, keep it zero */ + + if(!per->curl || !config) + return result; + +#ifdef _WIN32 + if(per->uploadfile) { + if(!strcmp(per->uploadfile, ".") && per->infd > 0) { +#ifndef CURL_WINDOWS_UWP + sclose(per->infd); +#else + warnf("Closing per->infd != 0: FD == %d. " + "This behavior is only supported on desktop Windows", per->infd); +#endif + } + } + else +#endif + if(per->infdopen) + curlx_close(per->infd); + + if(!per->skip) { + result = post_check_result(per, result); + result = post_output_handling(per, result); + + /* if retry-max-time is non-zero, make sure we have not exceeded the + time */ + if(per->retry_remaining && + (!config->retry_maxtime_ms || + (curlx_timediff_ms(curlx_now(), per->retrystart) < + config->retry_maxtime_ms))) { + result = retrycheck(config, per, result, retryp, delay); + if(!result && *retryp) + return CURLE_OK; /* retry! */ + } + + if((global->progressmode == CURL_PROGRESS_BAR) && + per->progressbar.calls) + /* if the custom progress bar has been displayed, we output a + newline here */ + fputs("\n", per->progressbar.out); + + result = post_close_output(per, result); + } /* Write the --write-out data before cleanup but after result is final */ if(config->writeout) ourWriteOut(config, per, result);