Abort curl transfers if they drop below 1000B/s for more than 60s.
[monky] / src / ccurl_thread.c
index d69e860..fa1efcb 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Please see COPYING for details
  *
- * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
+ * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al.
  *     (see AUTHORS)
  * All rights reserved.
  *
@@ -130,12 +130,32 @@ void ccurl_fetch_data(ccurl_location_t *curloc)
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ccurl_write_memory_callback);
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk);
                curl_easy_setopt(curl, CURLOPT_USERAGENT, "conky-curl/1.0");
+               curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
+               curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1000);
+               curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 60);
 
                res = curl_easy_perform(curl);
                if (res == CURLE_OK && chunk.size) {
-                       timed_thread_lock(curloc->p_timed_thread);
-                       (*curloc->process_function)(curloc->result, chunk.memory);
-                       timed_thread_unlock(curloc->p_timed_thread);
+                       long http_status_code;
+
+                       if (curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE,
+                                               &http_status_code) == CURLE_OK) {
+                               switch (http_status_code) {
+                                       case 200:
+                                               timed_thread_lock(curloc->p_timed_thread);
+                                               (*curloc->process_function)(curloc->result, chunk.memory);
+                                               timed_thread_unlock(curloc->p_timed_thread);
+                                               break;
+                                       case 304:
+                                               break;
+                                       default:
+                                               NORM_ERR("curl: no data from server, got HTTP status %d %s",
+                                                               http_status_code);
+                                               break;
+                               }
+                       } else {
+                               NORM_ERR("curl: no HTTP status from server");
+                       }
                        free(chunk.memory);
                } else {
                        NORM_ERR("curl: no data from server");