OSSURLRequestRetryHandler.m 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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