lib: move client writer into own source

Refactoring of the client writer that passes the data to the
client/application's callback functions.

- split out into own source cw-out.[ch] from sendf.c

- move tempwrite and tempcount from data->state into the context of the
  client writer

- redesign the 3 tempwrite dynbufs as a linked list of dynbufs. On
  paused transfers, this allows to "record" interleaved HEADER/BODY
  chunks to be "played back" in the same order on unpausing.

- keep the overall size limit of all buffered data to DYN_PAUSE_BUFFER.
  On exceeding that, return CURLE_TOO_LARGE instead of
  CURLE_OUT_OF_MEMORY as before.

- add method to be called when a transfer is DONE to allow writing of
  any data still buffered

- when paused, record HEADER writes exactly as they come for later
  playback. HEADERs are documented to be written one-by-one.

Closes #12898
This commit is contained in:
Stefan Eissing 2024-02-07 12:05:05 +01:00 committed by Daniel Stenberg
parent 2254551403
commit 463472a2d6
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
10 changed files with 538 additions and 227 deletions

View file

@ -645,7 +645,7 @@ static CURLcode multi_done(struct Curl_easy *data,
after an error was detected */
bool premature)
{
CURLcode result;
CURLcode result, r2;
struct connectdata *conn = data->conn;
#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
@ -696,6 +696,11 @@ static CURLcode multi_done(struct Curl_easy *data,
result = CURLE_ABORTED_BY_CALLBACK;
}
/* Make sure that transfer client writes are really done now. */
r2 = Curl_xfer_write_done(data, premature);
if(r2 && !result)
result = r2;
/* Inform connection filters that this transfer is done */
Curl_conn_ev_data_done(data, premature);