aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2012-10-02 00:16:20 +0200
committerDaniel Stenberg <daniel@haxx.se>2012-10-02 00:16:20 +0200
commit971f5bcedd41889dc9652aa0c583477c0b1d49c9 (patch)
treee4b76e5e18b731c2b61af3770c202f9afff1a3df
parent42bbc5ce108e273a9890d2007ff55dd73c8d646c (diff)
multi_runsingle: CURLOPT_LOW_SPEED_* fix for rate limitation
During the periods of rate limitation, the speedcheck function wasn't called and thus the values weren't updated accordingly and it would then easily trigger wrongly once data got transferred again. Also, the progress callback's return code was not acknowledged in this state so it could make an "abort" return code to get ignored and not have the documented effect of aborting an ongoing transfer. Bug: http://curl.haxx.se/mail/lib-2012-09/0081.html Reported by: Jie He
-rw-r--r--lib/multi.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/multi.c b/lib/multi.c
index b6c327b77..6506b5ee4 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -43,6 +43,7 @@
#include "http.h"
#include "select.h"
#include "warnless.h"
+#include "speedcheck.h"
#define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h>
@@ -1518,7 +1519,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_TOOFAST: /* limit-rate exceeded in either direction */
/* if both rates are within spec, resume transfer */
- Curl_pgrsUpdate(easy->easy_conn);
+ if(Curl_pgrsUpdate(easy->easy_conn))
+ easy->result = CURLE_ABORTED_BY_CALLBACK;
+ else
+ easy->result = Curl_speedcheck(data, now);
+
if(( (data->set.max_send_speed == 0) ||
(data->progress.ulspeed < data->set.max_send_speed )) &&
( (data->set.max_recv_speed == 0) ||