X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flp_ws.c;h=5eca19ab4c47ef30be8dd6dd4536a64ba2514892;hb=04e8520815632d17a6705219ad8301c1352058f6;hp=4b51be80b31acd9f86710c86bb7529c45651cdea;hpb=4f673b9c3df300c81d8bf73635688dbc249c7a53;p=ppastats.git diff --git a/src/lp_ws.c b/src/lp_ws.c index 4b51be8..5eca19a 100644 --- a/src/lp_ws.c +++ b/src/lp_ws.c @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -29,11 +30,12 @@ #include "lp_json.h" #include "ppastats.h" -#define QUERY_GET_PUBLISHED_BINARIES \ - "?ws.op=getPublishedBinaries" -#define QUERY_GET_DOWNLOAD_COUNT "?ws.op=getDownloadCount" -#define QUERY_GET_DAILY_DOWNLOAD_TOTALS \ - "?ws.op=getDailyDownloadTotals" +static const char *QUERY_GET_PUBLISHED_BINARIES = "?ws.op=getPublishedBinaries"; +static const char *QUERY_GET_DOWNLOAD_COUNT = "?ws.op=getDownloadCount"; +static const char * +QUERY_GET_DAILY_DOWNLOAD_TOTALS = "?ws.op=getDailyDownloadTotals"; + +static const int DEFAULT_FETCH_RETRIES = 3; static CURL *curl; @@ -59,13 +61,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 +78,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 +94,34 @@ 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: with code %ld " + "for URL= %s\n", + code, + url); + + 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)