diff options
Diffstat (limited to 'lib/transfer.c')
-rw-r--r-- | lib/transfer.c | 33 |
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; } |