diff options
Diffstat (limited to 'lib/transfer.c')
-rw-r--r-- | lib/transfer.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/lib/transfer.c b/lib/transfer.c index e31d1d6..744227e 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -198,7 +198,6 @@ static ssize_t Curl_xfer_recv_resp(struct Curl_easy *data, if(*err) return -1; DEBUGASSERT(nread >= 0); - *err = CURLE_OK; return nread; } @@ -272,10 +271,9 @@ static CURLcode readwrite_data(struct Curl_easy *data, DEBUGF(infof(data, "nread == 0, stream closed, bailing")); else DEBUGF(infof(data, "nread <= 0, server closed connection, bailing")); - if(k->eos_written) { /* already did write this to client, leave */ - k->keepon = 0; /* stop sending as well */ + k->keepon &= ~(KEEP_RECV|KEEP_SEND); /* stop sending as well */ + if(k->eos_written) /* already did write this to client, leave */ break; - } } total_received += blen; @@ -410,6 +408,14 @@ CURLcode Curl_readwrite(struct Curl_easy *data) int didwhat = 0; int select_bits; + /* Check if client writes had been paused and can resume now. */ + if(!(k->keepon & KEEP_RECV_PAUSE) && Curl_cwriter_is_paused(data)) { + Curl_conn_ev_data_pause(data, FALSE); + result = Curl_cwriter_unpause(data); + if(result) + goto out; + } + if(data->state.select_bits) { if(select_bits_paused(data, data->state.select_bits)) { /* leave the bits unchanged, so they'll tell us what to do when @@ -706,12 +712,14 @@ CURLcode Curl_pretransfer(struct Curl_easy *data) if(!result) result = Curl_setstropt(&data->state.aptr.passwd, data->set.str[STRING_PASSWORD]); +#ifndef CURL_DISABLE_PROXY if(!result) result = Curl_setstropt(&data->state.aptr.proxyuser, data->set.str[STRING_PROXYUSERNAME]); if(!result) result = Curl_setstropt(&data->state.aptr.proxypasswd, data->set.str[STRING_PROXYPASSWORD]); +#endif data->req.headerbytecount = 0; Curl_headers_cleanup(data); @@ -1155,7 +1163,7 @@ void Curl_xfer_setup( } CURLcode Curl_xfer_write_resp(struct Curl_easy *data, - char *buf, size_t blen, + const char *buf, size_t blen, bool is_eos) { CURLcode result = CURLE_OK; @@ -1189,9 +1197,23 @@ CURLcode Curl_xfer_write_resp(struct Curl_easy *data, data->req.eos_written = TRUE; data->req.download_done = TRUE; } + CURL_TRC_WRITE(data, "xfer_write_resp(len=%zu, eos=%d) -> %d", + blen, is_eos, result); return result; } +CURLcode Curl_xfer_write_resp_hd(struct Curl_easy *data, + const char *hd0, size_t hdlen, bool is_eos) +{ + if(data->conn->handler->write_resp_hd) { + /* protocol handlers offering this function take full responsibility + * for writing all received download data to the client. */ + return data->conn->handler->write_resp_hd(data, hd0, hdlen, is_eos); + } + /* No special handling by protocol handler, write as response bytes */ + return Curl_xfer_write_resp(data, hd0, hdlen, is_eos); +} + CURLcode Curl_xfer_write_done(struct Curl_easy *data, bool premature) { (void)premature; @@ -1221,6 +1243,9 @@ CURLcode Curl_xfer_send(struct Curl_easy *data, result = CURLE_OK; *pnwritten = 0; } + else if(!result && *pnwritten) + data->info.request_size += *pnwritten; + return result; } |