From dc4659b4a80cd6cfcce5db75b0648bbd4eb14b55 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Fri, 2 Sep 2016 16:40:41 +0200 Subject: [PATCH] [linux] HTTPFileSource - rate limit --- platform/default/http_file_source.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/platform/default/http_file_source.cpp b/platform/default/http_file_source.cpp index 17e06a6c0..ce6987fbd 100644 --- a/platform/default/http_file_source.cpp +++ b/platform/default/http_file_source.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -80,6 +81,9 @@ private: std::shared_ptr data; std::unique_ptr response; + optional retryAfter; + optional xRateLimitReset; + CURL *handle = nullptr; curl_slist *headers = nullptr; @@ -325,6 +329,10 @@ size_t HTTPRequest::headerCallback(char *const buffer, const size_t size, const } else if ((begin = headerMatches("expires: ", buffer, length)) != std::string::npos) { const std::string value { buffer + begin, length - begin - 2 }; // remove \r\n baton->response->expires = Timestamp{ Seconds(curl_getdate(value.c_str(), nullptr)) }; + } else if ((begin = headerMatches("retry-after: ", buffer, length)) != std::string::npos) { + baton->retryAfter = std::string(buffer + begin, length - begin - 2); // remove \r\n + } else if ((begin = headerMatches("x-rate-limit-reset: ", buffer, length)) != std::string::npos) { + baton->xRateLimitReset = std::string(buffer + begin, length - begin - 2); // remove \r\n } return length; @@ -372,6 +380,10 @@ void HTTPRequest::handleResult(CURLcode code) { } else if (responseCode == 404) { response->error = std::make_unique(Error::Reason::NotFound, "HTTP status code 404"); + } else if (responseCode == 429) { + response->error = + std::make_unique(Error::Reason::RateLimit, "HTTP status code 429", + http::parseRetryHeaders(retryAfter, xRateLimitReset)); } else if (responseCode >= 500 && responseCode < 600) { response->error = std::make_unique(Error::Reason::Server, std::string{ "HTTP status code " } +