QNZoneInfo.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 = @"default_io_host";
  10. NSString * const QNZoneInfoEmptyRegionId = @"none";
  11. @interface QNZoneInfo()
  12. @property(nonatomic, strong) NSDate *buildDate;
  13. @property(nonatomic, copy)NSString *regionId;
  14. @property(nonatomic, assign) long ttl;
  15. @property(nonatomic, assign)BOOL http3Enabled;
  16. @property(nonatomic, strong)NSArray<NSString *> *domains;
  17. @property(nonatomic, strong)NSArray<NSString *> *old_domains;
  18. @property(nonatomic, strong)NSArray <NSString *> *allHosts;
  19. @property(nonatomic, strong) NSDictionary *detailInfo;
  20. @end
  21. @implementation QNZoneInfo
  22. + (QNZoneInfo *)zoneInfoWithMainHosts:(NSArray <NSString *> *)mainHosts
  23. regionId:(NSString * _Nullable)regionId{
  24. return [self zoneInfoWithMainHosts:mainHosts oldHosts:nil regionId:regionId];
  25. }
  26. + (QNZoneInfo *)zoneInfoWithMainHosts:(NSArray <NSString *> *)mainHosts
  27. oldHosts:(NSArray <NSString *> * _Nullable)oldHosts
  28. regionId:(NSString * _Nullable)regionId{
  29. if (!mainHosts || ![mainHosts isKindOfClass:[NSArray class]] || mainHosts.count == 0) {
  30. return nil;
  31. }
  32. if (mainHosts && ![mainHosts isKindOfClass:[NSArray class]]) {
  33. mainHosts = nil;
  34. }
  35. QNZoneInfo *zoneInfo = [QNZoneInfo zoneInfoFromDictionary:@{@"ttl" : @(-1),
  36. @"region" : regionId ?: QNZoneInfoEmptyRegionId,
  37. @"up" : @{@"domains" : mainHosts ?: @[],
  38. @"old" : oldHosts ?: @[]},
  39. }];
  40. return zoneInfo;
  41. }
  42. + (QNZoneInfo *)zoneInfoFromDictionary:(NSDictionary *)detailInfo {
  43. if (![detailInfo isKindOfClass:[NSDictionary class]]) {
  44. return nil;
  45. }
  46. NSString *regionId = [detailInfo objectForKey:@"region"];
  47. if (regionId == nil) {
  48. regionId = QNZoneInfoEmptyRegionId;
  49. }
  50. long ttl = [[detailInfo objectForKey:@"ttl"] longValue];
  51. BOOL http3Enabled = false;
  52. if ([detailInfo[@"features"] isKindOfClass:[NSDictionary class]] &&
  53. [detailInfo[@"features"][@"http3"] isKindOfClass:[NSDictionary class]]) {
  54. http3Enabled = [detailInfo[@"features"][@"http3"][@"enabled"] boolValue];
  55. }
  56. NSDictionary *up = [detailInfo objectForKey:@"up"];
  57. NSArray *domains = [up objectForKey:@"domains"];
  58. NSArray *old_domains = [up objectForKey:@"old"];
  59. NSMutableArray *allHosts = [NSMutableArray array];
  60. QNZoneInfo *zoneInfo = [[QNZoneInfo alloc] init:ttl regionId:regionId];
  61. zoneInfo.http3Enabled = http3Enabled;
  62. if ([domains isKindOfClass:[NSArray class]]) {
  63. zoneInfo.domains = domains;
  64. [allHosts addObjectsFromArray:domains];
  65. }
  66. if ([old_domains isKindOfClass:[NSArray class]]) {
  67. zoneInfo.old_domains = old_domains;
  68. [allHosts addObjectsFromArray:old_domains];
  69. }
  70. zoneInfo.allHosts = [allHosts copy];
  71. zoneInfo.detailInfo = detailInfo;
  72. return zoneInfo;
  73. }
  74. - (instancetype)init:(long)ttl
  75. regionId:(NSString *)regionId {
  76. if (self = [super init]) {
  77. _ttl = ttl;
  78. _buildDate = [NSDate date];
  79. _regionId = regionId;
  80. }
  81. return self;
  82. }
  83. - (BOOL)isValid{
  84. if (self.ttl < 0) {
  85. return true;
  86. }
  87. NSDate *currentDate = [NSDate date];
  88. return self.ttl > [currentDate timeIntervalSinceDate:self.buildDate];
  89. }
  90. - (id)copyWithZone:(NSZone *)zone {
  91. QNZoneInfo *zoneInfo = [[QNZoneInfo allocWithZone:zone] init];
  92. zoneInfo.ttl = self.ttl;
  93. zoneInfo.buildDate = self.buildDate;
  94. zoneInfo.http3Enabled = self.http3Enabled;
  95. zoneInfo.regionId = self.regionId;
  96. zoneInfo.domains = [self.domains copy];
  97. zoneInfo.old_domains = [self.old_domains copy];
  98. zoneInfo.allHosts = [self.allHosts copy];
  99. zoneInfo.detailInfo = [self.detailInfo copy];
  100. return zoneInfo;
  101. }
  102. @end
  103. @interface QNZonesInfo()
  104. @property (nonatomic, assign) BOOL isTemporary;
  105. @property (nonatomic, strong) NSArray<QNZoneInfo *> *zonesInfo;
  106. @end
  107. @implementation QNZonesInfo
  108. - (instancetype)initWithZonesInfo:(NSArray<QNZoneInfo *> *)zonesInfo{
  109. self = [super init];
  110. if (self) {
  111. _zonesInfo = zonesInfo;
  112. }
  113. return self;
  114. }
  115. + (instancetype)infoWithDictionary:(NSDictionary *)dictionary {
  116. NSMutableArray *zonesInfo = [NSMutableArray array];
  117. NSArray *hosts = dictionary[@"hosts"];
  118. if ([hosts isKindOfClass:[NSArray class]]) {
  119. for (NSInteger i = 0; i < hosts.count; i++) {
  120. QNZoneInfo *zoneInfo = [QNZoneInfo zoneInfoFromDictionary:hosts[i]];
  121. if (zoneInfo && [zoneInfo isValid]) {
  122. [zonesInfo addObject:zoneInfo];
  123. }
  124. }
  125. }
  126. return [[[self class] alloc] initWithZonesInfo:zonesInfo];
  127. }
  128. - (void)toTemporary {
  129. _isTemporary = true;
  130. }
  131. - (BOOL)isValid {
  132. if ([self.zonesInfo count] == 0) {
  133. return false;
  134. }
  135. BOOL valid = true;
  136. for (QNZoneInfo *info in self.zonesInfo) {
  137. if (![info isValid]) {
  138. valid = false;
  139. break;
  140. }
  141. }
  142. return valid;
  143. }
  144. - (id)copyWithZone:(NSZone *)zone {
  145. NSMutableArray *zonesInfoArray = [NSMutableArray array];
  146. for (QNZoneInfo *info in self.zonesInfo) {
  147. [zonesInfoArray addObject:[info copy]];
  148. }
  149. QNZonesInfo *zonesInfo = [[QNZonesInfo allocWithZone:zone] init];
  150. zonesInfo.zonesInfo = [zonesInfoArray copy];
  151. zonesInfo.isTemporary = self.isTemporary;
  152. return zonesInfo;
  153. }
  154. @end