QNZoneInfo.m 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. //
  2. // QNZoneInfo.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2020/4/16.
  6. // Copyright © 2020 Qiniu. All rights reserved.
  7. //
  8. #import "QNZoneInfo.h"
  9. NSString * const QNZoneInfoSDKDefaultIOHost = @"sdkDefaultIOHost";
  10. NSString * const QNZoneInfoEmptyRegionId = @"sdkEmptyRegionId";
  11. @interface QNZoneInfo()
  12. @property(nonatomic, strong) NSDate *buildDate;
  13. @property(nonatomic, assign) long ttl;
  14. @property(nonatomic, strong)NSArray<NSString *> *domains;
  15. @property(nonatomic, strong)NSArray<NSString *> *old_domains;
  16. @property(nonatomic, strong)NSArray <NSString *> *allHosts;
  17. @property(nonatomic, strong) NSDictionary *detailInfo;
  18. @end
  19. @implementation QNZoneInfo
  20. + (QNZoneInfo *)zoneInfoWithMainHosts:(NSArray <NSString *> *)mainHosts
  21. regionId:(NSString * _Nullable)regionId{
  22. return [self zoneInfoWithMainHosts:mainHosts oldHosts:nil regionId:regionId];
  23. }
  24. + (QNZoneInfo *)zoneInfoWithMainHosts:(NSArray <NSString *> *)mainHosts
  25. oldHosts:(NSArray <NSString *> * _Nullable)oldHosts
  26. regionId:(NSString * _Nullable)regionId{
  27. if (!mainHosts || ![mainHosts isKindOfClass:[NSArray class]] || mainHosts.count == 0) {
  28. return nil;
  29. }
  30. if (mainHosts && ![mainHosts isKindOfClass:[NSArray class]]) {
  31. mainHosts = nil;
  32. }
  33. QNZoneInfo *zoneInfo = [QNZoneInfo zoneInfoFromDictionary:@{@"ttl" : @(86400*1000),
  34. @"region" : regionId ?: QNZoneInfoEmptyRegionId,
  35. @"up" : @{@"domains" : mainHosts ?: @[],
  36. @"old" : oldHosts ?: @[]},
  37. }];
  38. return zoneInfo;
  39. }
  40. + (QNZoneInfo *)zoneInfoFromDictionary:(NSDictionary *)detailInfo {
  41. if (![detailInfo isKindOfClass:[NSDictionary class]]) {
  42. return nil;
  43. }
  44. NSString *regionId = [detailInfo objectForKey:@"region"];
  45. if (regionId == nil) {
  46. regionId = QNZoneInfoEmptyRegionId;
  47. }
  48. long ttl = [[detailInfo objectForKey:@"ttl"] longValue];
  49. NSDictionary *up = [detailInfo objectForKey:@"up"];
  50. NSArray *domains = [up objectForKey:@"domains"];
  51. NSArray *old_domains = [up objectForKey:@"old"];
  52. NSMutableArray *allHosts = [NSMutableArray array];
  53. QNZoneInfo *zoneInfo = [[QNZoneInfo alloc] init:ttl regionId:regionId];
  54. if ([domains isKindOfClass:[NSArray class]]) {
  55. zoneInfo.domains = domains;
  56. [allHosts addObjectsFromArray:domains];
  57. }
  58. if ([old_domains isKindOfClass:[NSArray class]]) {
  59. zoneInfo.old_domains = old_domains;
  60. [allHosts addObjectsFromArray:old_domains];
  61. }
  62. zoneInfo.allHosts = [allHosts copy];
  63. zoneInfo.detailInfo = detailInfo;
  64. return zoneInfo;
  65. }
  66. - (instancetype)init:(long)ttl
  67. regionId:(NSString *)regionId {
  68. if (self = [super init]) {
  69. _ttl = ttl;
  70. _buildDate = [NSDate date];
  71. _regionId = regionId;
  72. }
  73. return self;
  74. }
  75. - (BOOL)isValid{
  76. NSDate *currentDate = [NSDate date];
  77. return self.ttl > [currentDate timeIntervalSinceDate:self.buildDate];
  78. }
  79. @end
  80. @interface QNZonesInfo()
  81. @property (nonatomic, strong) NSArray<QNZoneInfo *> *zonesInfo;
  82. @end
  83. @implementation QNZonesInfo
  84. - (instancetype)initWithZonesInfo:(NSArray<QNZoneInfo *> *)zonesInfo{
  85. self = [super init];
  86. if (self) {
  87. _zonesInfo = zonesInfo;
  88. }
  89. return self;
  90. }
  91. + (instancetype)infoWithDictionary:(NSDictionary *)dictionary {
  92. NSArray *hosts = dictionary[@"hosts"];
  93. NSMutableArray *zonesInfo = [NSMutableArray array];
  94. if ([hosts isKindOfClass:[NSArray class]]) {
  95. for (NSInteger i = 0; i < hosts.count; i++) {
  96. QNZoneInfo *zoneInfo = [QNZoneInfo zoneInfoFromDictionary:hosts[i]];
  97. if (zoneInfo && [zoneInfo isValid]) {
  98. [zonesInfo addObject:zoneInfo];
  99. }
  100. }
  101. }
  102. return [[[self class] alloc] initWithZonesInfo:zonesInfo];
  103. }
  104. - (BOOL)isValid {
  105. return [self.zonesInfo count] > 0;
  106. }
  107. @end