From 9a2cbf30b81a2b57149bb20e78e2e4cb5c2ff389 Mon Sep 17 00:00:00 2001 From: John Schroeder Date: Tue, 26 Nov 2019 09:16:19 +0100 Subject: curl: fix --upload-file . hangs if delay in STDIN Attempt to unpause a busy read in the CURLOPT_XFERINFOFUNCTION. When uploading from stdin in non-blocking mode, a delay in reading the stream (EAGAIN) causes curl to pause sending data (CURL_READFUNC_PAUSE). Prior to this change, a busy read was detected and unpaused only in the CURLOPT_WRITEFUNCTION handler. This change performs the same busy read handling in a CURLOPT_XFERINFOFUNCTION handler. Fixes #2051 Closes #4599 Reported-by: bdry on github --- src/tool_cb_prg.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/tool_cb_prg.c') diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c index a18827c8b..505ae751f 100644 --- a/src/tool_cb_prg.c +++ b/src/tool_cb_prg.c @@ -32,6 +32,7 @@ #include "tool_cfgable.h" #include "tool_cb_prg.h" #include "tool_util.h" +#include "tool_operate.h" #include "memdebug.h" /* keep this as LAST include */ @@ -121,7 +122,10 @@ int tool_progress_cb(void *clientp, and this new edition inherits some of his concepts. */ struct timeval now = tvnow(); - struct ProgressData *bar = (struct ProgressData *)clientp; + struct per_transfer *per = clientp; + struct OutStruct *outs = &per->outs; + struct OperationConfig *config = outs->config; + struct ProgressData *bar = &per->progressbar; curl_off_t total; curl_off_t point; @@ -191,6 +195,11 @@ int tool_progress_cb(void *clientp, bar->prev = point; bar->prevtime = now; + if(config->readbusy) { + config->readbusy = FALSE; + curl_easy_pause(per->curl, CURLPAUSE_CONT); + } + return 0; } -- cgit v1.2.3