summaryrefslogtreecommitdiffstats
path: root/lib/transfer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/transfer.c')
-rw-r--r--lib/transfer.c35
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;
}