QNServerConfigSynchronizer.m 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. //
  2. // QNServerConfigSynchronizer.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2021/8/30.
  6. // Copyright © 2021 Qiniu. All rights reserved.
  7. //
  8. #import "QNConfig.h"
  9. #import "QNUpToken.h"
  10. #import "QNZoneInfo.h"
  11. #import "QNResponseInfo.h"
  12. #import "QNRequestTransaction.h"
  13. #import "QNServerConfigSynchronizer.h"
  14. #import <pthread.h>
  15. static NSString *Token = nil;
  16. static NSArray <NSString *> *Hosts = nil;
  17. static pthread_mutex_t TokenMutexLock = PTHREAD_MUTEX_INITIALIZER;
  18. static pthread_mutex_t HostsMutexLock = PTHREAD_MUTEX_INITIALIZER;
  19. static QNRequestTransaction *serverConfigTransaction = nil;
  20. static QNRequestTransaction *serverUserConfigTransaction = nil;
  21. @implementation QNServerConfigSynchronizer
  22. //MARK: --- server config
  23. + (void)getServerConfigFromServer:(void(^)(QNServerConfig *config))complete {
  24. if (complete == nil) {
  25. return;
  26. }
  27. QNRequestTransaction *transaction = [self createServerConfigTransaction];
  28. if (transaction == nil) {
  29. complete(nil);
  30. return;
  31. }
  32. [transaction serverConfig:^(QNResponseInfo * _Nullable responseInfo, QNUploadRegionRequestMetrics * _Nullable metrics, NSDictionary * _Nullable response) {
  33. if (responseInfo.isOK && response != nil) {
  34. complete([QNServerConfig config:response]);
  35. } else {
  36. complete(nil);
  37. }
  38. [self destroyServerConfigRequestTransaction];
  39. }];
  40. }
  41. + (QNRequestTransaction *)createServerConfigTransaction {
  42. @synchronized (self) {
  43. // 上传时才会有 token,不上传不请求,避免不必要请求
  44. if (serverConfigTransaction != nil) {
  45. return nil;
  46. }
  47. QNUpToken *token = [QNUpToken parse:self.token];
  48. if (token == nil) {
  49. token = [QNUpToken getInvalidToken];
  50. }
  51. NSArray *hosts = self.hosts;
  52. if (hosts == nil) {
  53. hosts = kQNPreQueryHosts;
  54. }
  55. QNRequestTransaction *transaction = [[QNRequestTransaction alloc] initWithHosts:hosts
  56. regionId:QNZoneInfoEmptyRegionId
  57. token:token];
  58. serverConfigTransaction = transaction;
  59. return transaction;
  60. }
  61. }
  62. + (void)destroyServerConfigRequestTransaction {
  63. @synchronized (self) {
  64. serverConfigTransaction = nil;
  65. }
  66. }
  67. //MARK: --- server user config
  68. + (void)getServerUserConfigFromServer:(void(^)(QNServerUserConfig *config))complete {
  69. if (complete == nil) {
  70. return;
  71. }
  72. QNRequestTransaction *transaction = [self createServerUserConfigTransaction];
  73. if (transaction == nil) {
  74. complete(nil);
  75. return;
  76. }
  77. [transaction serverUserConfig:^(QNResponseInfo * _Nullable responseInfo, QNUploadRegionRequestMetrics * _Nullable metrics, NSDictionary * _Nullable response) {
  78. if (responseInfo.isOK && response != nil) {
  79. complete([QNServerUserConfig config:response]);
  80. } else {
  81. complete(nil);
  82. }
  83. [self destroyServerConfigRequestTransaction];
  84. }];
  85. }
  86. + (QNRequestTransaction *)createServerUserConfigTransaction {
  87. @synchronized (self) {
  88. if (serverConfigTransaction != nil) {
  89. return nil;
  90. }
  91. QNUpToken *token = [QNUpToken parse:self.token];
  92. if (token == nil || !token.isValid) {
  93. return nil;
  94. }
  95. NSArray *hosts = self.hosts;
  96. if (hosts == nil) {
  97. hosts = kQNPreQueryHosts;
  98. }
  99. QNRequestTransaction *transaction = [[QNRequestTransaction alloc] initWithHosts:hosts
  100. regionId:QNZoneInfoEmptyRegionId
  101. token:token];
  102. serverUserConfigTransaction = transaction;
  103. return transaction;
  104. }
  105. }
  106. + (void)destroyServerUserConfigRequestTransaction {
  107. @synchronized (self) {
  108. serverUserConfigTransaction = nil;
  109. }
  110. }
  111. + (void)setToken:(NSString *)token {
  112. pthread_mutex_lock(&TokenMutexLock);
  113. Token = token;
  114. pthread_mutex_unlock(&TokenMutexLock);
  115. }
  116. + (NSString *)token {
  117. NSString *token = nil;
  118. pthread_mutex_lock(&TokenMutexLock);
  119. token = Token;
  120. pthread_mutex_unlock(&TokenMutexLock);
  121. return token;
  122. }
  123. + (void)setHosts:(NSArray<NSString *> *)servers {
  124. pthread_mutex_lock(&HostsMutexLock);
  125. Hosts = [servers copy];
  126. pthread_mutex_unlock(&HostsMutexLock);
  127. }
  128. + (NSArray<NSString *> *)hosts {
  129. NSArray<NSString *> *hosts = nil;
  130. pthread_mutex_lock(&HostsMutexLock);
  131. hosts = [Hosts copy];
  132. pthread_mutex_unlock(&HostsMutexLock);
  133. return hosts;
  134. }
  135. @end