1 #include <mbgl/util/http_timeout.hpp>
2 #include <mbgl/util/constants.hpp>
3
4 #include <algorithm>
5 #include <cassert>
6
7 namespace mbgl {
8 namespace http {
9
errorRetryTimeout(Response::Error::Reason failedRequestReason,uint32_t failedRequests,optional<Timestamp> retryAfter)10 Duration errorRetryTimeout(Response::Error::Reason failedRequestReason, uint32_t failedRequests, optional<Timestamp> retryAfter) {
11
12 if (failedRequestReason == Response::Error::Reason::Server) {
13 // Retry after one second three times, then start exponential backoff.
14 return Seconds(failedRequests <= 3 ? 1 : 1u << std::min(failedRequests - 3, 31u));
15 } else if (failedRequestReason == Response::Error::Reason::Connection) {
16 // Immediate exponential backoff.
17 assert(failedRequests > 0);
18 return Seconds(1u << std::min(failedRequests - 1, 31u));
19 } else if (failedRequestReason == Response::Error::Reason::RateLimit) {
20 if (retryAfter) {
21 return *retryAfter - util::now();
22 } else {
23 // Default
24 return Seconds(util::DEFAULT_RATE_LIMIT_TIMEOUT);
25 }
26 } else {
27 // No error, or not an error that triggers retries.
28 return Duration::max();
29 }
30 }
31
expirationTimeout(optional<Timestamp> expires,uint32_t expiredRequests)32 Duration expirationTimeout(optional<Timestamp> expires, uint32_t expiredRequests) {
33 if (expiredRequests) {
34 return Seconds(1u << std::min(expiredRequests - 1, 31u));
35 } else if (expires) {
36 return std::max(Seconds::zero(), *expires - util::now());
37 } else {
38 return Duration::max();
39 }
40 }
41
42 } // namespace http
43 } // namespace mbgl
44