aboutsummaryrefslogtreecommitdiff
path: root/lib/transfer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/transfer.c')
-rw-r--r--lib/transfer.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/lib/transfer.c b/lib/transfer.c
index 370734a13..0af351042 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -1628,15 +1628,31 @@ Transfer(struct connectdata *conn)
interval_ms = 1 * 1000;
- if(k->keepon & KEEP_READ)
- fd_read = conn->sockfd;
- else
- fd_read = CURL_SOCKET_BAD;
-
- if(k->keepon & KEEP_WRITE)
- fd_write = conn->writesockfd;
- else
+ /* limit-rate logic: if speed exceeds threshold, then do not include fd in
+ select set */
+ if ( (conn->data->set.max_send_speed > 0) &&
+ (conn->data->progress.ulspeed > conn->data->set.max_send_speed) ) {
fd_write = CURL_SOCKET_BAD;
+ Curl_pgrsUpdate(conn);
+ }
+ else {
+ if(k->keepon & KEEP_WRITE)
+ fd_write = conn->writesockfd;
+ else
+ fd_write = CURL_SOCKET_BAD;
+ }
+
+ if ( (conn->data->set.max_recv_speed > 0) &&
+ (conn->data->progress.dlspeed > conn->data->set.max_recv_speed) ) {
+ fd_read = CURL_SOCKET_BAD;
+ Curl_pgrsUpdate(conn);
+ }
+ else {
+ if(k->keepon & KEEP_READ)
+ fd_read = conn->sockfd;
+ else
+ fd_read = CURL_SOCKET_BAD;
+ }
switch (Curl_select(fd_read, fd_write, interval_ms)) {
case -1: /* select() error, stop reading */
@@ -1651,6 +1667,7 @@ Transfer(struct connectdata *conn)
continue;
case 0: /* timeout */
default: /* readable descriptors */
+
result = Curl_readwrite(conn, &done);
break;
}