summaryrefslogtreecommitdiff
path: root/platform/default
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2016-08-31 16:43:33 +0200
committerIvo van Dongen <info@ivovandongen.nl>2016-09-13 14:21:37 +0200
commit290bd07a92d7103c67f606c1423785069fc9b776 (patch)
tree00fa0a654830f3cf239932f266e311cab6ebeb59 /platform/default
parentfdaf26b2c02afa6042876962f92b1eaf0ada19bb (diff)
downloadqtlocation-mapboxgl-290bd07a92d7103c67f606c1423785069fc9b776.tar.gz
[core] OnlineFileSource - rate limit
Diffstat (limited to 'platform/default')
-rw-r--r--platform/default/online_file_source.cpp32
1 files changed, 6 insertions, 26 deletions
diff --git a/platform/default/online_file_source.cpp b/platform/default/online_file_source.cpp
index b7d658694c..44245b9c13 100644
--- a/platform/default/online_file_source.cpp
+++ b/platform/default/online_file_source.cpp
@@ -13,6 +13,7 @@
#include <mbgl/util/async_task.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/timer.hpp>
+#include <mbgl/util/http_timeout.hpp>
#include <algorithm>
#include <cassert>
@@ -48,6 +49,7 @@ public:
// backoff when retrying requests.
uint32_t failedRequests = 0;
Response::Error::Reason failedRequestReason = Response::Error::Reason::Success;
+ optional<Timestamp> retryAfter;
};
class OnlineFileSource::Impl {
@@ -200,30 +202,6 @@ OnlineFileRequest::~OnlineFileRequest() {
impl.remove(this);
}
-static Duration errorRetryTimeout(Response::Error::Reason failedRequestReason, uint32_t failedRequests) {
- if (failedRequestReason == Response::Error::Reason::Server) {
- // Retry after one second three times, then start exponential backoff.
- return Seconds(failedRequests <= 3 ? 1 : 1 << std::min(failedRequests - 3, 31u));
- } else if (failedRequestReason == Response::Error::Reason::Connection) {
- // Immediate exponential backoff.
- assert(failedRequests > 0);
- return Seconds(1 << std::min(failedRequests - 1, 31u));
- } else {
- // No error, or not an error that triggers retries.
- return Duration::max();
- }
-}
-
-static Duration expirationTimeout(optional<Timestamp> expires, uint32_t expiredRequests) {
- if (expiredRequests) {
- return Seconds(1 << std::min(expiredRequests - 1, 31u));
- } else if (expires) {
- return std::max(Seconds::zero(), *expires - util::now());
- } else {
- return Duration::max();
- }
-}
-
Timestamp interpolateExpiration(const Timestamp& current,
optional<Timestamp> prior,
bool& expired) {
@@ -267,8 +245,9 @@ void OnlineFileRequest::schedule(optional<Timestamp> expires) {
// If we're not being asked for a forced refresh, calculate a timeout that depends on how many
// consecutive errors we've encountered, and on the expiration time, if present.
- Duration timeout = std::min(errorRetryTimeout(failedRequestReason, failedRequests),
- expirationTimeout(expires, expiredRequests));
+ Duration timeout = std::min(
+ http::errorRetryTimeout(failedRequestReason, failedRequests, retryAfter),
+ http::expirationTimeout(expires, expiredRequests));
if (timeout == Duration::max()) {
return;
@@ -321,6 +300,7 @@ void OnlineFileRequest::completed(Response response) {
if (response.error) {
failedRequests++;
failedRequestReason = response.error->reason;
+ retryAfter = response.error->retryAfter;
} else {
failedRequests = 0;
failedRequestReason = Response::Error::Reason::Success;