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