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
This commit is contained in:
Patrick Monnerat 2020-03-06 09:46:39 +01:00 committed by Daniel Stenberg
parent 3dce9849be
commit 96972ec1c0
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
13 changed files with 628 additions and 13 deletions

View file

@ -1003,6 +1003,14 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
return CURLE_OK;
}
/* 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;