aboutsummaryrefslogtreecommitdiff
path: root/src/tool_operate.c
diff options
context:
space:
mode:
authorJohn Schroeder <john@schroederspace.com>2019-11-26 09:16:19 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-11-26 09:17:52 +0100
commit9a2cbf30b81a2b57149bb20e78e2e4cb5c2ff389 (patch)
tree5c31ee04911407d843f17c31db412988f3154769 /src/tool_operate.c
parent7cf18b05e04bbb0f08c74d2567b0648f6c31a952 (diff)
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
Diffstat (limited to 'src/tool_operate.c')
-rw-r--r--src/tool_operate.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 0de81cd49..4b2ffb55b 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -1080,11 +1080,11 @@ static CURLcode single_transfer(struct GlobalConfig *global,
isatty(fileno(outs->stream)))
/* we send the output to a tty, therefore we switch off the progress
meter */
- global->noprogress = global->isatty = TRUE;
+ per->noprogress = global->noprogress = global->isatty = TRUE;
else {
/* progress meter is per download, so restore config
values */
- global->noprogress = orig_noprogress;
+ per->noprogress = global->noprogress = orig_noprogress;
global->isatty = orig_isatty;
}
@@ -1573,7 +1573,14 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* we want the alternative style, then we have to implement it
ourselves! */
my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb);
- my_setopt(curl, CURLOPT_XFERINFODATA, &per->progressbar);
+ my_setopt(curl, CURLOPT_XFERINFODATA, per);
+ }
+ else if(per->uploadfile && !strcmp(per->uploadfile, ".")) {
+ /* when reading from stdin in non-blocking mode, we use the progress
+ function to unpause a busy read */
+ my_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+ my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_readbusy_cb);
+ my_setopt(curl, CURLOPT_XFERINFODATA, per);
}
/* new in libcurl 7.24.0: */