From 04c0499fae94aedb6146a20f47bbeebe93007d6d Mon Sep 17 00:00:00 2001 From: Fufu Fang Date: Fri, 26 Apr 2019 14:14:42 +0100 Subject: [PATCH] added HTTP 429 handling for file stat query --- src/link.c | 9 +-------- src/link.h | 5 +++++ src/network.c | 16 ++++++++++++++-- src/network.h | 17 +++++++++++++---- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/link.c b/src/link.c index f54d96a..5458a33 100644 --- a/src/link.c +++ b/src/link.c @@ -11,13 +11,6 @@ #include #include -typedef enum { - HTTP_OK = 200, - HTTP_PARTIAL_CONTENT = 206, - HTTP_RANGE_NOT_SATISFIABLE = 416, - HTTP_TOO_MANY_REQUESTS = 429 -}HTTPResponseCode; - /* ---------------- External variables -----------------------*/ LinkTable *ROOT_LINK_TBL = NULL; int ROOT_LINK_OFFSET = 0; @@ -278,7 +271,7 @@ LinkTable *LinkTable_new(const char *url) if (http_resp == HTTP_TOO_MANY_REQUESTS) { fprintf(stderr, "link.c: LinkTable_new(): URL: %s, HTTP 429, \ Too Many Requests\n", url); - sleep(5); + sleep(HTTP_429_WAIT); } else if (http_resp != HTTP_OK) { fprintf(stderr, "link.c: LinkTable_new(): cannot retrieve the base \ URL, URL: %s, HTTP %ld\n", url, http_resp); diff --git a/src/link.h b/src/link.h index 8a7b3fa..c81fcb6 100644 --- a/src/link.h +++ b/src/link.h @@ -50,6 +50,11 @@ extern LinkTable *ROOT_LINK_TBL; */ extern int ROOT_LINK_OFFSET; +/** + * \brief + */ +void Link_get_stat(Link *this_link); + /** * \brief set the stats for a file */ diff --git a/src/network.c b/src/network.c index 5ef628f..335412b 100644 --- a/src/network.c +++ b/src/network.c @@ -98,6 +98,19 @@ static void curl_process_msgs(CURLMsg *curl_msg, int n_running_curl, int n_mesgs transfer->transferring = 0; char *url = NULL; curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url); + + /* Wait for 5 seconds if we get HTTP 429 */ + long http_resp = 0; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_resp); + if (http_resp == HTTP_TOO_MANY_REQUESTS) { + fprintf(stderr, "curl_process_msgs(): HTTP 429\n"); + sleep(HTTP_429_WAIT); + /* Re-add the link into the queue, if it is a file stat query */ + if (transfer->type == FILESTAT) { + Link_get_stat(transfer->link); + } + } + if (curl_msg->data.result) { fprintf(stderr, "curl_process_msgs(): %d - %s <%s>\n", curl_msg->data.result, @@ -107,11 +120,10 @@ static void curl_process_msgs(CURLMsg *curl_msg, int n_running_curl, int n_mesgs } else { /* Transfer successful, query the file size */ if (transfer->type == FILESTAT) { -// fprintf(stderr, "Link_set_stat(): %d, %d, %s\n", -// n_running_curl, n_mesgs, url); Link_set_stat(transfer->link, curl); } } + curl_multi_remove_handle(curl_multi, curl); /* clean up the handle, if we are querying the file size */ if (transfer->type == FILESTAT) { diff --git a/src/network.h b/src/network.h index c5adb68..1956439 100644 --- a/src/network.h +++ b/src/network.h @@ -3,16 +3,25 @@ #include "link.h" -typedef struct { - char *memory; - size_t size; -} MemoryStruct; +#define HTTP_429_WAIT 5 + +typedef enum { + HTTP_OK = 200, + HTTP_PARTIAL_CONTENT = 206, + HTTP_RANGE_NOT_SATISFIABLE = 416, + HTTP_TOO_MANY_REQUESTS = 429 +}HTTPResponseCode; typedef enum { FILESTAT = 's', DATA = 'd' } TransferType; +typedef struct { + char *memory; + size_t size; +} MemoryStruct; + typedef struct { TransferType type; int transferring;