X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flp_ws.c;h=b6957eb83314a62ffb6d07b67be9c831a7473944;hb=717b36dbe3f5b51e1079815b92f74feed9366015;hp=4b51be80b31acd9f86710c86bb7529c45651cdea;hpb=1e793571973294c4fcf4a09180802a45a0d5ab95;p=ppastats.git diff --git a/src/lp_ws.c b/src/lp_ws.c index 4b51be8..b6957eb 100644 --- a/src/lp_ws.c +++ b/src/lp_ws.c @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -35,6 +36,8 @@ #define QUERY_GET_DAILY_DOWNLOAD_TOTALS \ "?ws.op=getDailyDownloadTotals" +static int DEFAULT_FETCH_RETRIES = 3; + static CURL *curl; struct ucontent { @@ -59,13 +62,16 @@ static size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp) static char *fetch_url(const char *url) { struct ucontent *content = malloc(sizeof(struct ucontent)); - char *result = NULL; + char *result; long code; + int retries; if (debug) printf("DEBUG: fetch_url %s\n", url); if (!curl) { + if (debug) + printf("DEBUG: initializing CURL\n"); curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); } @@ -73,6 +79,11 @@ static char *fetch_url(const char *url) if (!curl) exit(EXIT_FAILURE); + result = NULL; + + retries = DEFAULT_FETCH_RETRIES; + + retrieve: content->data = malloc(1); content->data[0] = '\0'; content->len = 0; @@ -84,10 +95,30 @@ static char *fetch_url(const char *url) curl_easy_setopt(curl, CURLOPT_USERAGENT, "ppastats/0.0"); if (curl_easy_perform(curl) == CURLE_OK) { - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); - if (code == 200) + + switch (code) { + case 200: result = content->data; + break; + case 500: + case 502: + case 503: + case 504: + if (retries) { + fprintf(stderr, "Fetch failed: %ld\n", code); + + if (debug) + printf("Wait 5s before retry.\n"); + sleep(5); + + free(content->data); + retries--; + goto retrieve; + } + default: + fprintf(stderr, "Fetch failed: %ld\n", code); + } } if (!result)