diff options
author | Daniel Stenberg <daniel@haxx.se> | 2006-06-22 21:36:53 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2006-06-22 21:36:53 +0000 |
commit | dfe1884c2529d728750d0824f73055627673cd72 (patch) | |
tree | 4f6d30648e54d10f10401408f0f819ff344ce318 /lib/transfer.c | |
parent | 3e5dcc8bcd4aaa7b6d7f8432327cbdd5487113e4 (diff) |
Peter Silva introduced CURLOPT_MAX_SEND_SPEED_LARGE and
CURLOPT_MAX_RECV_SPEED_LARGE that limit tha maximum rate libcurl is allowed
to send or receive data. This kind of adds the the command line tool's
option --limit-rate to the library.
The rate limiting logic in the curl app is now removed and is instead
provided by libcurl itself. Transfer rate limiting will now also work for -d
and -F, which it didn't before.
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; } |