OSSURLRequestRetryHandler.m 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //
  2. // OSSURLRequestRetryHandler.m
  3. // AliyunOSSSDK
  4. //
  5. // Created by huaixu on 2018/1/22.
  6. // Copyright © 2018年 aliyun. All rights reserved.
  7. //
  8. #import "OSSURLRequestRetryHandler.h"
  9. #import "OSSNetworkingRequestDelegate.h"
  10. #import "OSSDefine.h"
  11. @implementation OSSURLRequestRetryHandler
  12. - (OSSNetworkingRetryType)shouldRetry:(uint32_t)currentRetryCount
  13. requestDelegate:(OSSNetworkingRequestDelegate *)delegate
  14. response:(NSHTTPURLResponse *)response
  15. error:(NSError *)error {
  16. if (currentRetryCount >= self.maxRetryCount) {
  17. return OSSNetworkingRetryTypeShouldNotRetry;
  18. }
  19. /**
  20. When onRecieveData is set, no retry.
  21. When the error is task cancellation, no retry.
  22. */
  23. if (delegate.onRecieveData != nil) {
  24. return OSSNetworkingRetryTypeShouldNotRetry;
  25. }
  26. if ([error.domain isEqualToString:OSSClientErrorDomain]) {
  27. if (error.code == OSSClientErrorCodeTaskCancelled) {
  28. return OSSNetworkingRetryTypeShouldNotRetry;
  29. } else {
  30. return OSSNetworkingRetryTypeShouldRetry;
  31. }
  32. }
  33. switch (response.statusCode) {
  34. case 403:
  35. if ([[[error userInfo] objectForKey:@"Code"] isEqualToString:@"RequestTimeTooSkewed"]) {
  36. return OSSNetworkingRetryTypeShouldCorrectClockSkewAndRetry;
  37. }
  38. break;
  39. default:
  40. break;
  41. }
  42. return OSSNetworkingRetryTypeShouldNotRetry;
  43. }
  44. - (NSTimeInterval)timeIntervalForRetry:(uint32_t)currentRetryCount retryType:(OSSNetworkingRetryType)retryType {
  45. switch (retryType) {
  46. case OSSNetworkingRetryTypeShouldCorrectClockSkewAndRetry:
  47. case OSSNetworkingRetryTypeShouldRefreshCredentialsAndRetry:
  48. return 0;
  49. default:
  50. return pow(2, currentRetryCount) * 200 / 1000;
  51. }
  52. }
  53. + (instancetype)defaultRetryHandler {
  54. OSSURLRequestRetryHandler * retryHandler = [OSSURLRequestRetryHandler new];
  55. retryHandler.maxRetryCount = OSSDefaultRetryCount;
  56. return retryHandler;
  57. }
  58. @end