Source/TNLBackoff.m (35 lines of code) (raw):

// // TNLBackoff.m // TwitterNetworkLayer // // Created on 3/31/20. // Copyright © 2020 Twitter. All rights reserved. // #import "NSDictionary+TNLAdditions.h" #import "NSURLResponse+TNLAdditions.h" #import "TNLBackoff.h" NS_ASSUME_NONNULL_BEGIN const NSTimeInterval TNLSimpleRetryAfterBackoffValueDefault = 1.0; const NSTimeInterval TNLSimpleRetryAfterBackoffValueMinimum = 0.1; const NSTimeInterval TNLSimpleRetryAfterMaximumBackoffValueBeforeTreatedAsGoAway = 10.0; @implementation TNLSimpleBackoffBehaviorProvider - (TNLBackoffBehavior)tnl_backoffBehaviorForURL:(NSURL *)URL responseHeaders:(nullable NSDictionary<NSString *, NSString *> *)headers { NSTimeInterval backoff = TNLSimpleRetryAfterBackoffValueDefault; NSString *retryAfterString = [headers tnl_objectForCaseInsensitiveKey:@"retry-after"]; id retryAfterValue = [NSHTTPURLResponse tnl_parseRetryAfterValueFromString:retryAfterString]; if (retryAfterValue) { backoff = [NSHTTPURLResponse tnl_delayFromRetryAfterValue:retryAfterValue]; } if (backoff < TNLSimpleRetryAfterBackoffValueMinimum) { backoff = TNLSimpleRetryAfterBackoffValueMinimum; } else if (backoff > TNLSimpleRetryAfterMaximumBackoffValueBeforeTreatedAsGoAway) { backoff = TNLSimpleRetryAfterBackoffValueDefault; } return TNLBackoffBehaviorMake(backoff, self.serializeDuration, self.serialDelayDuration); } @end @implementation TNLSimpleBackoffSignaler - (BOOL)tnl_shouldSignalBackoffForURL:(NSURL *)URL host:(nullable NSString *)host statusCode:(TNLHTTPStatusCode)statusCode responseHeaders:(nullable NSDictionary<NSString *,NSString *> *)responseHeaders { return TNLHTTPStatusCodeServiceUnavailable == statusCode; } @end NS_ASSUME_NONNULL_END