QNConfiguration.m 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. //
  2. // QNConfiguration.m
  3. // QiniuSDK
  4. //
  5. // Created by bailong on 15/5/21.
  6. // Copyright (c) 2015年 Qiniu. All rights reserved.
  7. //
  8. #import "QNConfiguration.h"
  9. #import "QNResponseInfo.h"
  10. #import "QNUpToken.h"
  11. #import "QNReportConfig.h"
  12. #import "QNAutoZone.h"
  13. #import "QN_GTM_Base64.h"
  14. const UInt32 kQNBlockSize = 4 * 1024 * 1024;
  15. const UInt32 kQNDefaultDnsCacheTime = 2 * 60;
  16. @implementation QNConfiguration
  17. + (instancetype)defaultConfiguration{
  18. QNConfigurationBuilder *builder = [[QNConfigurationBuilder alloc] init];
  19. return [[QNConfiguration alloc] initWithBuilder:builder];
  20. }
  21. + (instancetype)build:(QNConfigurationBuilderBlock)block {
  22. QNConfigurationBuilder *builder = [[QNConfigurationBuilder alloc] init];
  23. block(builder);
  24. return [[QNConfiguration alloc] initWithBuilder:builder];
  25. }
  26. - (instancetype)initWithBuilder:(QNConfigurationBuilder *)builder {
  27. if (self = [super init]) {
  28. _useConcurrentResumeUpload = builder.useConcurrentResumeUpload;
  29. _resumeUploadVersion = builder.resumeUploadVersion;
  30. _concurrentTaskCount = builder.concurrentTaskCount;
  31. _chunkSize = builder.chunkSize;
  32. if (builder.resumeUploadVersion == QNResumeUploadVersionV1) {
  33. if (_chunkSize < 1024) {
  34. _chunkSize = 1024;
  35. }
  36. } else if (builder.resumeUploadVersion == QNResumeUploadVersionV2) {
  37. if (_chunkSize < 1024 * 1024) {
  38. _chunkSize = 1024 * 1024;
  39. }
  40. }
  41. _putThreshold = builder.putThreshold;
  42. _retryMax = builder.retryMax;
  43. _retryInterval = builder.retryInterval;
  44. _timeoutInterval = builder.timeoutInterval;
  45. _recorder = builder.recorder;
  46. _recorderKeyGen = builder.recorderKeyGen;
  47. _proxy = builder.proxy;
  48. _converter = builder.converter;
  49. _zone = builder.zone;
  50. _useHttps = builder.useHttps;
  51. _allowBackupHost = builder.allowBackupHost;
  52. }
  53. return self;
  54. }
  55. @end
  56. @interface QNGlobalConfiguration(){
  57. NSArray *_defaultDohIpv4Servers;
  58. NSArray *_defaultDohIpv6Servers;
  59. NSArray *_defaultUdpDnsIpv4Servers;
  60. NSArray *_defaultUdpDnsIpv6Servers;
  61. NSArray *_defaultConnectCheckUrls;
  62. }
  63. @property(nonatomic, strong)NSArray *defaultDohIpv4Servers;
  64. @property(nonatomic, strong)NSArray *defaultDohIpv6Servers;
  65. @property(nonatomic, strong)NSArray *defaultUdpDnsIpv4Servers;
  66. @property(nonatomic, strong)NSArray *defaultUdpDnsIpv6Servers;
  67. @property(nonatomic, strong)NSArray *defaultConnectCheckUrls;
  68. @end
  69. @implementation QNGlobalConfiguration
  70. + (instancetype)shared{
  71. static QNGlobalConfiguration *config = nil;
  72. static dispatch_once_t onceToken;
  73. dispatch_once(&onceToken, ^{
  74. config = [[QNGlobalConfiguration alloc] init];
  75. [config setupData];
  76. });
  77. return config;
  78. }
  79. - (void)setupData{
  80. _isDnsOpen = YES;
  81. _dnsResolveTimeout = 2;
  82. _dnsCacheDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/Dns"];
  83. _dnsRepreHostNum = 2;
  84. _dnsCacheTime = kQNDefaultDnsCacheTime;
  85. _dnsCacheMaxTTL = 10*60;
  86. _dohEnable = true;
  87. _defaultDohIpv4Servers = [self parseBase64Array:@"WyJodHRwczovLzIyMy42LjYuNi9kbnMtcXVlcnkiLCAiaHR0cHM6Ly84LjguOC44L2Rucy1xdWVyeSJd"];
  88. _udpDnsEnable = true;
  89. _defaultUdpDnsIpv4Servers = [self parseBase64Array:@"WyIyMjMuNS41LjUiLCAiMTE0LjExNC4xMTQuMTE0IiwgIjEuMS4xLjEiLCAiOC44LjguOCJd"];
  90. _globalHostFrozenTime = 10;
  91. _partialHostFrozenTime = 5*60;
  92. _connectCheckEnable = YES;
  93. _connectCheckTimeout = 2;
  94. _defaultConnectCheckUrls = [self parseBase64Array:@"WyJodHRwczovL3d3dy5xaW5pdS5jb20iLCAiaHR0cHM6Ly93d3cuYmFpZHUuY29tIiwgImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20iXQ=="];
  95. _connectCheckURLStrings = nil;
  96. }
  97. - (NSArray *)parseBase64Array:(NSString *)data {
  98. NSData *jsonData = [QN_GTM_Base64 decodeData:[data dataUsingEncoding:NSUTF8StringEncoding]];
  99. NSArray *ret = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
  100. if (ret && [ret isKindOfClass:[NSArray class]]) {
  101. return ret;
  102. }
  103. return nil;
  104. }
  105. - (BOOL)isDohEnable {
  106. return _dohEnable && (self.dohIpv4Servers.count > 0 || self.dohIpv6Servers.count > 0) ;
  107. }
  108. - (NSArray<NSString *> *)dohIpv4Servers {
  109. if (_dohIpv4Servers) {
  110. return _dohIpv4Servers;
  111. } else {
  112. return self.defaultDohIpv4Servers;
  113. }
  114. }
  115. - (NSArray<NSString *> *)dohIpv6Servers {
  116. if (_dohIpv6Servers) {
  117. return _dohIpv6Servers;
  118. } else {
  119. return self.defaultDohIpv6Servers;
  120. }
  121. }
  122. - (NSArray<NSString *> *)udpDnsIpv4Servers {
  123. if (_udpDnsIpv4Servers) {
  124. return _udpDnsIpv4Servers;
  125. } else {
  126. return self.defaultUdpDnsIpv4Servers;
  127. }
  128. }
  129. - (NSArray<NSString *> *)udpDnsIpv6Servers {
  130. if (_udpDnsIpv6Servers) {
  131. return _udpDnsIpv6Servers;
  132. } else {
  133. return self.defaultUdpDnsIpv6Servers;
  134. }
  135. }
  136. - (BOOL)isUdpDnsEnable {
  137. return _udpDnsEnable && (self.udpDnsIpv4Servers.count > 0 || self.udpDnsIpv6Servers.count > 0) ;
  138. }
  139. - (NSArray<NSString *> *)connectCheckURLStrings {
  140. if (_connectCheckURLStrings) {
  141. return _connectCheckURLStrings;
  142. } else {
  143. return self.defaultConnectCheckUrls;
  144. }
  145. }
  146. - (NSArray *)defaultDohIpv4Servers {
  147. NSArray *arr = nil;
  148. @synchronized (self) {
  149. if (_defaultDohIpv4Servers) {
  150. arr = [_defaultDohIpv4Servers copy];
  151. }
  152. }
  153. return arr;
  154. }
  155. - (void)setDefaultDohIpv4Servers:(NSArray *)defaultDohIpv4Servers {
  156. @synchronized (self) {
  157. _defaultDohIpv4Servers = defaultDohIpv4Servers;
  158. }
  159. }
  160. - (NSArray *)defaultDohIpv6Servers {
  161. NSArray *arr = nil;
  162. @synchronized (self) {
  163. if (_defaultDohIpv6Servers) {
  164. arr = [_defaultDohIpv6Servers copy];
  165. }
  166. }
  167. return arr;
  168. }
  169. - (void)setDefaultDohIpv6Servers:(NSArray *)defaultDohIpv6Servers {
  170. @synchronized (self) {
  171. _defaultDohIpv6Servers = defaultDohIpv6Servers;
  172. }
  173. }
  174. - (NSArray *)defaultUdpDnsIpv4Servers {
  175. NSArray *arr = nil;
  176. @synchronized (self) {
  177. if (_defaultUdpDnsIpv4Servers) {
  178. arr = [_defaultUdpDnsIpv4Servers copy];
  179. }
  180. }
  181. return arr;
  182. }
  183. - (void)setDefaultUdpDnsIpv4Servers:(NSArray *)defaultUdpDnsIpv4Servers {
  184. @synchronized (self) {
  185. _defaultUdpDnsIpv4Servers = defaultUdpDnsIpv4Servers;
  186. }
  187. }
  188. - (NSArray *)defaultUdpDnsIpv6Servers {
  189. NSArray *arr = nil;
  190. @synchronized (self) {
  191. if (_defaultUdpDnsIpv6Servers) {
  192. arr = [_defaultUdpDnsIpv6Servers copy];
  193. }
  194. }
  195. return arr;
  196. }
  197. - (void)setDefaultUdpDnsIpv6Servers:(NSArray *)defaultUdpDnsIpv6Servers {
  198. @synchronized (self) {
  199. _defaultUdpDnsIpv6Servers = defaultUdpDnsIpv6Servers;
  200. }
  201. }
  202. - (NSArray *)defaultConnectCheckUrls {
  203. NSArray *arr = nil;
  204. @synchronized (self) {
  205. if (_defaultConnectCheckUrls) {
  206. arr = [_defaultConnectCheckUrls copy];
  207. }
  208. }
  209. return arr;
  210. }
  211. - (void)setDefaultConnectCheckUrls:(NSArray *)defaultConnectCheckUrls {
  212. @synchronized (self) {
  213. _defaultConnectCheckUrls = defaultConnectCheckUrls;
  214. }
  215. }
  216. @end
  217. @implementation QNConfigurationBuilder
  218. - (instancetype)init {
  219. if (self = [super init]) {
  220. _zone = [[QNAutoZone alloc] init];
  221. _chunkSize = 2 * 1024 * 1024;
  222. _putThreshold = 4 * 1024 * 1024;
  223. _retryMax = 1;
  224. _timeoutInterval = 90;
  225. _retryInterval = 0.5;
  226. _recorder = nil;
  227. _recorderKeyGen = nil;
  228. _proxy = nil;
  229. _converter = nil;
  230. _useHttps = YES;
  231. _allowBackupHost = YES;
  232. _useConcurrentResumeUpload = NO;
  233. _resumeUploadVersion = QNResumeUploadVersionV1;
  234. _concurrentTaskCount = 3;
  235. }
  236. return self;
  237. }
  238. @end