QNServerConfig.m 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. //
  2. // QNServerConfig.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2021/8/30.
  6. // Copyright © 2021 Qiniu. All rights reserved.
  7. //
  8. #import "QNServerConfig.h"
  9. @interface QNServerRegionConfig()
  10. @property(nonatomic, assign)long clearId;
  11. @property(nonatomic, assign)BOOL clearCache;
  12. @end
  13. @implementation QNServerRegionConfig
  14. + (instancetype)config:(NSDictionary *)info {
  15. QNServerRegionConfig *config = [[QNServerRegionConfig alloc] init];
  16. config.clearId = [info[@"clear_id"] longValue];
  17. config.clearCache = [info[@"clear_cache"] longValue];
  18. return config;
  19. }
  20. @end
  21. @interface QNServerDnsServer()
  22. @property(nonatomic, assign)BOOL isOverride;
  23. @property(nonatomic, strong)NSArray <NSString *> *servers;
  24. @end
  25. @implementation QNServerDnsServer
  26. + (instancetype)config:(NSDictionary *)info {
  27. QNServerDnsServer *config = [[QNServerDnsServer alloc] init];
  28. config.isOverride = [info[@"override_default"] boolValue];
  29. if (info[@"ips"] && [info[@"ips"] isKindOfClass:[NSArray class]]) {
  30. config.servers = info[@"ips"];
  31. } else if ([info[@"urls"] isKindOfClass:[NSArray class]]){
  32. config.servers = info[@"urls"];
  33. }
  34. return config;
  35. }
  36. @end
  37. @interface QNServerDohConfig()
  38. @property(nonatomic, strong)NSNumber *enable;
  39. @property(nonatomic, strong)QNServerDnsServer *ipv4Server;
  40. @property(nonatomic, strong)QNServerDnsServer *ipv6Server;
  41. @end
  42. @implementation QNServerDohConfig
  43. + (instancetype)config:(NSDictionary *)info {
  44. QNServerDohConfig *config = [[QNServerDohConfig alloc] init];
  45. config.enable = info[@"enabled"];
  46. config.ipv4Server = [QNServerDnsServer config:info[@"ipv4"]];
  47. config.ipv6Server = [QNServerDnsServer config:info[@"ipv6"]];
  48. return config;
  49. }
  50. @end
  51. @interface QNServerUdpDnsConfig()
  52. @property(nonatomic, strong)NSNumber *enable;
  53. @property(nonatomic, strong)QNServerDnsServer *ipv4Server;
  54. @property(nonatomic, strong)QNServerDnsServer *ipv6Server;
  55. @end
  56. @implementation QNServerUdpDnsConfig
  57. + (instancetype)config:(NSDictionary *)info {
  58. QNServerUdpDnsConfig *config = [[QNServerUdpDnsConfig alloc] init];
  59. config.enable = info[@"enabled"];
  60. config.ipv4Server = [QNServerDnsServer config:info[@"ipv4"]];
  61. config.ipv6Server = [QNServerDnsServer config:info[@"ipv6"]];
  62. return config;
  63. }
  64. @end
  65. @interface QNServerDnsConfig()
  66. @property(nonatomic, strong)NSNumber *enable;
  67. @property(nonatomic, assign)long clearId;
  68. @property(nonatomic, assign)BOOL clearCache;
  69. @property(nonatomic, strong)QNServerUdpDnsConfig *udpConfig;
  70. @property(nonatomic, strong)QNServerDohConfig *dohConfig;
  71. @end
  72. @implementation QNServerDnsConfig
  73. + (instancetype)config:(NSDictionary *)info {
  74. QNServerDnsConfig *config = [[QNServerDnsConfig alloc] init];
  75. config.enable = info[@"enabled"];
  76. config.clearId = [info[@"clear_id"] longValue];
  77. config.clearCache = [info[@"clear_cache"] longValue];
  78. config.dohConfig = [QNServerDohConfig config:info[@"doh"]];
  79. config.udpConfig = [QNServerUdpDnsConfig config:info[@"udp"]];
  80. return config;
  81. }
  82. @end
  83. @interface QNConnectCheckConfig()
  84. @property(nonatomic, assign)BOOL isOverride;
  85. @property(nonatomic, strong)NSNumber *enable;
  86. @property(nonatomic, strong)NSNumber *timeoutMs;
  87. @property(nonatomic, strong)NSArray <NSString *> *urls;
  88. @end
  89. @implementation QNConnectCheckConfig
  90. + (instancetype)config:(NSDictionary *)info {
  91. QNConnectCheckConfig *config = [[QNConnectCheckConfig alloc] init];
  92. config.isOverride = [info[@"override_default"] boolValue];
  93. config.enable = info[@"enabled"];
  94. config.timeoutMs = info[@"timeout_ms"];
  95. if (info[@"urls"] && [info[@"urls"] isKindOfClass:[NSArray class]]) {
  96. config.urls = info[@"urls"];
  97. }
  98. return config;
  99. }
  100. @end
  101. @interface QNServerConfig()
  102. @property(nonatomic, strong)NSDictionary *info;
  103. @property(nonatomic, assign)double timestamp;
  104. @property(nonatomic, assign)long ttl;
  105. @property(nonatomic, strong)QNServerRegionConfig *regionConfig;
  106. @property(nonatomic, strong)QNServerDnsConfig *dnsConfig;
  107. @property(nonatomic, strong)QNConnectCheckConfig *connectCheckConfig;
  108. @end
  109. @implementation QNServerConfig
  110. + (instancetype)config:(NSDictionary *)info {
  111. QNServerConfig *config = [[QNServerConfig alloc] init];
  112. config.ttl = [info[@"ttl"] longValue];
  113. config.regionConfig = [QNServerRegionConfig config:info[@"region"]];
  114. config.dnsConfig = [QNServerDnsConfig config:info[@"dns"]];
  115. config.connectCheckConfig = [QNConnectCheckConfig config:info[@"connection_check"]];
  116. if (config.ttl < 10) {
  117. config.ttl = 10;
  118. }
  119. NSMutableDictionary *mutableInfo = [info mutableCopy];
  120. if (info[@"timestamp"] != nil) {
  121. config.timestamp = [info[@"timestamp"] doubleValue];
  122. }
  123. if (config.timestamp == 0) {
  124. config.timestamp = [[NSDate date] timeIntervalSince1970];
  125. mutableInfo[@"timestamp"] = @(config.timestamp);
  126. }
  127. config.info = [mutableInfo copy];
  128. return config;
  129. }
  130. - (BOOL)isValid {
  131. return [[NSDate date] timeIntervalSince1970] < (self.timestamp + self.ttl);
  132. }
  133. @end