summaryrefslogtreecommitdiff
path: root/lib/easy.c
diff options
context:
space:
mode:
authorPatrick Monnerat <patrick@monnerat.net>2020-01-21 01:33:04 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-03-02 00:00:50 +0100
commit87869e38d7afdec3ef1bb4965711458b088e254f (patch)
tree7da06feb40bf6ee89024a52f7f6a54fb33d44e8c /lib/easy.c
parentcf1466bd473e06812dce0c3880f7e4af169e9e72 (diff)
downloadcurl-87869e38d7afdec3ef1bb4965711458b088e254f.tar.gz
mime: latch last read callback status.
In case a read callback returns a status (pause, abort, eof, error) instead of a byte count, drain the bytes read so far but remember this status for further processing. Takes care of not losing data when pausing, and properly resume a paused mime structure when requested. New tests 670-673 check unpausing cases, with easy or multi interface and mime or form api. Fixes #4813 Reported-by: MrdUkk on github Closes #4833
Diffstat (limited to 'lib/easy.c')
-rw-r--r--lib/easy.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/easy.c b/lib/easy.c
index 1a6912748..85a882a97 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -983,6 +983,14 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
newstate |= ((action & CURLPAUSE_RECV)?KEEP_RECV_PAUSE:0) |
((action & CURLPAUSE_SEND)?KEEP_SEND_PAUSE:0);
+ /* Unpause parts in active mime tree. */
+ if((k->keepon & ~newstate & KEEP_SEND_PAUSE) &&
+ (data->mstate == CURLM_STATE_PERFORM ||
+ data->mstate == CURLM_STATE_TOOFAST) &&
+ data->state.fread_func == (curl_read_callback) Curl_mime_read) {
+ Curl_mime_unpause(data->state.in);
+ }
+
/* put it back in the keepon */
k->keepon = newstate;