설명 없음

AWSService.m 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. //
  2. // Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License").
  5. // You may not use this file except in compliance with the License.
  6. // A copy of the License is located at
  7. //
  8. // http://aws.amazon.com/apache2.0
  9. //
  10. // or in the "license" file accompanying this file. This file is distributed
  11. // on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  12. // express or implied. See the License for the specific language governing
  13. // permissions and limitations under the License.
  14. //
  15. #import "AWSService.h"
  16. #import <UIKit/UIKit.h>
  17. #import "AWSSynchronizedMutableDictionary.h"
  18. #import "AWSURLResponseSerialization.h"
  19. #import "AWSCocoaLumberjack.h"
  20. #import "AWSCategory.h"
  21. NSString *const AWSiOSSDKVersion = @"2.8.4";
  22. NSString *const AWSServiceErrorDomain = @"com.amazonaws.AWSServiceErrorDomain";
  23. static NSString *const AWSServiceConfigurationUnknown = @"Unknown";
  24. #pragma mark - AWSService
  25. @implementation AWSService
  26. + (NSDictionary<NSString *, NSNumber *> *)errorCodeDictionary {
  27. static NSDictionary *_errorCodeDictionary = nil;
  28. static dispatch_once_t onceToken;
  29. dispatch_once(&onceToken, ^{
  30. _errorCodeDictionary = @{
  31. @"RequestTimeTooSkewed" : @(AWSServiceErrorRequestTimeTooSkewed),
  32. @"InvalidSignatureException" : @(AWSServiceErrorInvalidSignatureException),
  33. @"RequestExpired" : @(AWSServiceErrorRequestExpired),
  34. @"SignatureDoesNotMatch" : @(AWSServiceErrorSignatureDoesNotMatch),
  35. @"AuthFailure" : @(AWSServiceErrorAuthFailure),
  36. @"AccessDeniedException" : @(AWSServiceErrorAccessDeniedException),
  37. @"UnrecognizedClientException" : @(AWSServiceErrorUnrecognizedClientException),
  38. @"IncompleteSignature" : @(AWSServiceErrorIncompleteSignature),
  39. @"InvalidClientTokenId" : @(AWSServiceErrorInvalidClientTokenId),
  40. @"MissingAuthenticationToken" : @(AWSServiceErrorMissingAuthenticationToken),
  41. @"AccessDenied" : @(AWSServiceErrorAccessDenied),
  42. @"ExpiredToken" : @(AWSServiceErrorExpiredToken),
  43. @"InvalidAccessKeyId" : @(AWSServiceErrorInvalidAccessKeyId),
  44. @"InvalidToken" : @(AWSServiceErrorInvalidToken),
  45. @"TokenRefreshRequired" : @(AWSServiceErrorTokenRefreshRequired),
  46. @"AccessFailure" : @(AWSServiceErrorAccessFailure),
  47. @"AuthMissingFailure" : @(AWSServiceErrorAuthMissingFailure),
  48. @"Throttling" : @(AWSServiceErrorThrottling),
  49. @"ThrottlingException" : @(AWSServiceErrorThrottlingException),
  50. };
  51. });
  52. return _errorCodeDictionary;
  53. }
  54. @end
  55. #pragma mark - AWSServiceManager
  56. @interface AWSServiceManager()
  57. @property (nonatomic, strong) AWSSynchronizedMutableDictionary *dictionary;
  58. @end
  59. @implementation AWSServiceManager
  60. + (instancetype)defaultServiceManager {
  61. static AWSServiceManager *_defaultServiceManager = nil;
  62. static dispatch_once_t onceToken;
  63. dispatch_once(&onceToken, ^{
  64. _defaultServiceManager = [AWSServiceManager new];
  65. });
  66. return _defaultServiceManager;
  67. }
  68. - (instancetype)init {
  69. if ( self = [super init]) {
  70. _dictionary = [AWSSynchronizedMutableDictionary new];
  71. }
  72. return self;
  73. }
  74. - (void)setDefaultServiceConfiguration:(AWSServiceConfiguration *)defaultServiceConfiguration {
  75. static dispatch_once_t onceToken;
  76. dispatch_once(&onceToken, ^{
  77. self->_defaultServiceConfiguration = [defaultServiceConfiguration copy];
  78. });
  79. }
  80. @end
  81. #pragma mark - AWSServiceConfiguration
  82. @interface AWSServiceConfiguration()
  83. @property (nonatomic, assign) AWSRegionType regionType;
  84. @property (nonatomic, strong) id<AWSCredentialsProvider> credentialsProvider;
  85. @property (nonatomic, strong) AWSEndpoint *endpoint;
  86. @property (nonatomic, strong) NSArray *userAgentProductTokens;
  87. @end
  88. @implementation AWSServiceConfiguration
  89. - (instancetype)init {
  90. @throw [NSException exceptionWithName:NSInternalInconsistencyException
  91. reason:@"`- init` is not a valid initializer. Use `+ configurationWithRegion:credentialsProvider:` instead."
  92. userInfo:nil];
  93. }
  94. - (instancetype)initWithRegion:(AWSRegionType)regionType
  95. credentialsProvider:(id<AWSCredentialsProvider>)credentialsProvider {
  96. if (self = [super init]) {
  97. _regionType = regionType;
  98. _credentialsProvider = credentialsProvider;
  99. }
  100. return self;
  101. }
  102. - (instancetype)initWithRegion:(AWSRegionType)regionType
  103. endpoint:(AWSEndpoint *)endpoint
  104. credentialsProvider:(id<AWSCredentialsProvider>)credentialsProvider{
  105. if(self = [self initWithRegion:regionType credentialsProvider:credentialsProvider]){
  106. _endpoint = endpoint;
  107. }
  108. return self;
  109. }
  110. + (NSString *)baseUserAgent {
  111. static NSString *_userAgent = nil;
  112. static dispatch_once_t onceToken;
  113. dispatch_once(&onceToken, ^{
  114. NSString *systemName = [[[UIDevice currentDevice] systemName] stringByReplacingOccurrencesOfString:@" " withString:@"-"];
  115. if (!systemName) {
  116. systemName = AWSServiceConfigurationUnknown;
  117. }
  118. NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
  119. if (!systemVersion) {
  120. systemVersion = AWSServiceConfigurationUnknown;
  121. }
  122. NSString *localeIdentifier = [[NSLocale currentLocale] localeIdentifier];
  123. if (!localeIdentifier) {
  124. localeIdentifier = AWSServiceConfigurationUnknown;
  125. }
  126. _userAgent = [NSString stringWithFormat:@"aws-sdk-iOS/%@ %@/%@ %@", AWSiOSSDKVersion, systemName, systemVersion, localeIdentifier];
  127. });
  128. NSMutableString *userAgent = [NSMutableString stringWithString:_userAgent];
  129. for (NSString *prefix in _globalUserAgentPrefixes) {
  130. [userAgent appendFormat:@" %@", prefix];
  131. }
  132. return [NSString stringWithString:userAgent];
  133. }
  134. static NSMutableArray *_globalUserAgentPrefixes = nil;
  135. + (void)addGlobalUserAgentProductToken:(NSString *)productToken {
  136. if (productToken) {
  137. static dispatch_once_t onceToken;
  138. dispatch_once(&onceToken, ^{
  139. _globalUserAgentPrefixes = [NSMutableArray new];
  140. });
  141. if (![_globalUserAgentPrefixes containsObject:productToken]) {
  142. [_globalUserAgentPrefixes addObject:productToken];
  143. }
  144. }
  145. }
  146. - (NSString *)userAgent {
  147. NSMutableString *userAgent = [NSMutableString stringWithString:[AWSServiceConfiguration baseUserAgent]];
  148. for (NSString *prefix in self.userAgentProductTokens) {
  149. [userAgent appendFormat:@" %@", prefix];
  150. }
  151. return [NSString stringWithString:userAgent];
  152. }
  153. - (void)addUserAgentProductToken:(NSString *)productToken {
  154. if (productToken) {
  155. if (self.userAgentProductTokens) {
  156. if (![self.userAgentProductTokens containsObject:productToken]) {
  157. NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self.userAgentProductTokens];
  158. [mutableArray addObject:productToken];
  159. self.userAgentProductTokens = [NSArray arrayWithArray:mutableArray];
  160. }
  161. } else {
  162. self.userAgentProductTokens = @[productToken];
  163. }
  164. }
  165. }
  166. - (id)copyWithZone:(NSZone *)zone {
  167. AWSServiceConfiguration *configuration = [super copyWithZone:zone];
  168. configuration.regionType = self.regionType;
  169. configuration.credentialsProvider = self.credentialsProvider;
  170. configuration.userAgentProductTokens = self.userAgentProductTokens;
  171. configuration.endpoint = self.endpoint;
  172. return configuration;
  173. }
  174. @end
  175. #pragma mark - AWSEndpoint
  176. static NSString *const AWSRegionNameUSEast1 = @"us-east-1";
  177. static NSString *const AWSRegionNameUSEast2 = @"us-east-2";
  178. static NSString *const AWSRegionNameUSWest2 = @"us-west-2";
  179. static NSString *const AWSRegionNameUSWest1 = @"us-west-1";
  180. static NSString *const AWSRegionNameEUWest1 = @"eu-west-1";
  181. static NSString *const AWSRegionNameEUWest2 = @"eu-west-2";
  182. static NSString *const AWSRegionNameEUWest3 = @"eu-west-3";
  183. static NSString *const AWSRegionNameEUCentral1 = @"eu-central-1";
  184. static NSString *const AWSRegionNameEUNorth1 = @"eu-north-1";
  185. static NSString *const AWSRegionNameAPSoutheast1 = @"ap-southeast-1";
  186. static NSString *const AWSRegionNameAPNortheast1 = @"ap-northeast-1";
  187. static NSString *const AWSRegionNameAPNortheast2 = @"ap-northeast-2";
  188. static NSString *const AWSRegionNameAPSoutheast2 = @"ap-southeast-2";
  189. static NSString *const AWSRegionNameAPSouth1 = @"ap-south-1";
  190. static NSString *const AWSRegionNameSAEast1 = @"sa-east-1";
  191. static NSString *const AWSRegionNameCNNorth1 = @"cn-north-1";
  192. static NSString *const AWSRegionNameCNNorthWest1 = @"cn-northwest-1";
  193. static NSString *const AWSRegionNameCACentral1 = @"ca-central-1";
  194. static NSString *const AWSRegionNameUSGovWest1 = @"us-gov-west-1";
  195. static NSString *const AWSRegionNameUSGovEast1 = @"us-gov-east-1";
  196. static NSString *const AWSServiceNameAPIGateway = @"execute-api";
  197. static NSString *const AWSServiceNameAutoScaling = @"autoscaling";
  198. static NSString *const AWSServiceNameCloudWatch = @"monitoring";
  199. static NSString *const AWSServiceNameCognitoIdentity = @"cognito-identity";
  200. static NSString *const AWSServiceNameCognitoIdentityProvider = @"cognito-idp";
  201. static NSString *const AWSServiceNameCognitoSync = @"cognito-sync";
  202. static NSString *const AWSServiceNameDynamoDB = @"dynamodb";
  203. static NSString *const AWSServiceNameEC2 = @"ec2";
  204. static NSString *const AWSServiceNameElasticLoadBalancing = @"elasticloadbalancing";
  205. static NSString *const AWSServiceNameIoT = @"execute-api";
  206. static NSString *const AWSServiceNameIoTData = @"iotdata";
  207. static NSString *const AWSServiceNameFirehose = @"firehose";
  208. static NSString *const AWSServiceNameKinesis = @"kinesis";
  209. static NSString *const AWSServiceNameKMS = @"kms";
  210. static NSString *const AWSServiceNameLambda = @"lambda";
  211. static NSString *const AWSServiceNameLexRuntime = @"runtime.lex";
  212. static NSString *const AWSServiceNameLogs = @"logs";
  213. static NSString *const AWSServiceNameMachineLearning = @"machinelearning";
  214. static NSString *const AWSServiceNameMobileAnalytics = @"mobileanalytics";
  215. static NSString *const AWSServiceNamePolly = @"polly";
  216. static NSString *const AWSServiceNameMobileTargeting = @"mobiletargeting";
  217. static NSString *const AWSServiceNameRekognition = @"rekognition";
  218. static NSString *const AWSServiceNameS3 = @"s3";
  219. static NSString *const AWSServiceNameSES = @"email";
  220. static NSString *const AWSServiceNameSimpleDB = @"sdb";
  221. static NSString *const AWSServiceNameSNS = @"sns";
  222. static NSString *const AWSServiceNameSQS = @"sqs";
  223. static NSString *const AWSServiceNameSTS = @"sts";
  224. static NSString *const AWSServiceNameTranscribe = @"transcribe";
  225. static NSString *const AWSServiceNameTranslate = @"translate";
  226. static NSString *const AWSServiceNameComprehend = @"comprehend";
  227. static NSString *const AWSServiceNameKinesisVideo = @"kinesisvideo";
  228. static NSString *const AWSServiceNameKinesisVideoArchivedMedia = @"kinesisvideo";
  229. @interface AWSEndpoint()
  230. - (void) setRegion:(AWSRegionType)regionType service:(AWSServiceType)serviceType;
  231. @end
  232. @implementation AWSEndpoint
  233. - (instancetype)init {
  234. @throw [NSException exceptionWithName:NSInternalInconsistencyException
  235. reason:@"`- init` is not a valid initializer. Use `- initWithRegion:service:useUnsafeURL:` instead."
  236. userInfo:nil];
  237. }
  238. - (instancetype)initWithRegion:(AWSRegionType)regionType
  239. service:(AWSServiceType)serviceType
  240. useUnsafeURL:(BOOL)useUnsafeURL {
  241. if (self = [super init]) {
  242. _regionType = regionType;
  243. _serviceType = serviceType;
  244. _useUnsafeURL = useUnsafeURL;
  245. _regionName = [self regionNameFromType:regionType];
  246. if (!_regionName) {
  247. @throw [NSException exceptionWithName:NSInternalInconsistencyException
  248. reason:@"Invalid region type."
  249. userInfo:nil];
  250. }
  251. _serviceName = [self serviceNameFromType:serviceType];
  252. if (!_serviceName) {
  253. @throw [NSException exceptionWithName:NSInternalInconsistencyException
  254. reason:@"Invalid service type."
  255. userInfo:nil];
  256. }
  257. _URL = [self URLWithRegion:_regionType
  258. regionName:_regionName
  259. service:_serviceType
  260. serviceName:_serviceName
  261. useUnsafeURL:useUnsafeURL];
  262. _hostName = [_URL host];
  263. }
  264. return self;
  265. }
  266. - (instancetype)initWithRegion:(AWSRegionType)regionType
  267. serviceName:(NSString *)serviceName
  268. URL:(NSURL *)URL {
  269. if (self = [super init]) {
  270. _regionType = regionType;
  271. _serviceType = AWSServiceUnknown;
  272. _useUnsafeURL = [[URL scheme] isEqualToString:@"http"];
  273. _regionName = [self regionNameFromType:regionType];
  274. _serviceName = serviceName;
  275. _URL = URL;
  276. _hostName = [_URL host];
  277. }
  278. return self;
  279. }
  280. - (instancetype)initWithRegion:(AWSRegionType)regionType
  281. service:(AWSServiceType)serviceType
  282. URL:(NSURL *)URL {
  283. if (self = [super init]) {
  284. _regionType = regionType;
  285. _serviceType = serviceType;
  286. _useUnsafeURL = [[URL scheme] isEqualToString:@"http"];
  287. _regionName = [self regionNameFromType:regionType];
  288. _serviceName = [self serviceNameFromType:serviceType];
  289. _URL = URL;
  290. _hostName = [_URL host];
  291. }
  292. return self;
  293. }
  294. - (instancetype)initWithURL:(NSURL *)URL{
  295. if (self = [super init]) {
  296. _URL = URL;
  297. _hostName = [_URL host];
  298. if ([[_URL scheme].lowercaseString isEqualToString:@"https"]) {
  299. _useUnsafeURL = NO;
  300. }else{
  301. _useUnsafeURL = YES;
  302. }
  303. }
  304. return self;
  305. }
  306. - (instancetype)initWithURLString:(NSString *)URLString{
  307. return [self initWithURL:[[NSURL alloc] initWithString:URLString]];
  308. }
  309. - (void) setRegion:(AWSRegionType)regionType service:(AWSServiceType)serviceType{
  310. _regionType = regionType;
  311. _serviceType = serviceType;
  312. _regionName = [self regionNameFromType:regionType];
  313. _serviceName = [self serviceNameFromType:serviceType];
  314. }
  315. - (NSString *)regionNameFromType:(AWSRegionType)regionType {
  316. switch (regionType) {
  317. case AWSRegionUSEast1:
  318. return AWSRegionNameUSEast1;
  319. case AWSRegionUSEast2:
  320. return AWSRegionNameUSEast2;
  321. case AWSRegionUSWest2:
  322. return AWSRegionNameUSWest2;
  323. case AWSRegionUSWest1:
  324. return AWSRegionNameUSWest1;
  325. case AWSRegionEUWest1:
  326. return AWSRegionNameEUWest1;
  327. case AWSRegionEUWest2:
  328. return AWSRegionNameEUWest2;
  329. case AWSRegionEUCentral1:
  330. return AWSRegionNameEUCentral1;
  331. case AWSRegionAPSoutheast1:
  332. return AWSRegionNameAPSoutheast1;
  333. case AWSRegionAPSoutheast2:
  334. return AWSRegionNameAPSoutheast2;
  335. case AWSRegionAPNortheast1:
  336. return AWSRegionNameAPNortheast1;
  337. case AWSRegionAPNortheast2:
  338. return AWSRegionNameAPNortheast2;
  339. case AWSRegionAPSouth1:
  340. return AWSRegionNameAPSouth1;
  341. case AWSRegionSAEast1:
  342. return AWSRegionNameSAEast1;
  343. case AWSRegionCNNorth1:
  344. return AWSRegionNameCNNorth1;
  345. case AWSRegionCACentral1:
  346. return AWSRegionNameCACentral1;
  347. case AWSRegionUSGovWest1:
  348. return AWSRegionNameUSGovWest1;
  349. case AWSRegionCNNorthWest1:
  350. return AWSRegionNameCNNorthWest1;
  351. case AWSRegionEUWest3:
  352. return AWSRegionNameEUWest3;
  353. case AWSRegionUSGovEast1:
  354. return AWSRegionNameUSGovEast1;
  355. case AWSRegionEUNorth1:
  356. return AWSRegionNameEUNorth1;
  357. default:
  358. return nil;
  359. }
  360. }
  361. - (NSString *)serviceNameFromType:(AWSServiceType)serviceType {
  362. switch (serviceType) {
  363. case AWSServiceAPIGateway:
  364. return AWSServiceNameAPIGateway;
  365. case AWSServiceAutoScaling:
  366. return AWSServiceNameAutoScaling;
  367. case AWSServiceCloudWatch:
  368. return AWSServiceNameCloudWatch;
  369. case AWSServiceCognitoIdentity:
  370. return AWSServiceNameCognitoIdentity;
  371. case AWSServiceCognitoIdentityProvider:
  372. return AWSServiceNameCognitoIdentityProvider;
  373. case AWSServiceCognitoSync:
  374. return AWSServiceNameCognitoSync;
  375. case AWSServiceDynamoDB:
  376. return AWSServiceNameDynamoDB;
  377. case AWSServiceEC2:
  378. return AWSServiceNameEC2;
  379. case AWSServiceElasticLoadBalancing:
  380. return AWSServiceNameElasticLoadBalancing;
  381. case AWSServiceIoT:
  382. return AWSServiceNameIoT;
  383. case AWSServiceIoTData:
  384. return AWSServiceNameIoTData;
  385. case AWSServiceFirehose:
  386. return AWSServiceNameFirehose;
  387. case AWSServiceKinesis:
  388. return AWSServiceNameKinesis;
  389. case AWSServiceKMS:
  390. return AWSServiceNameKMS;
  391. case AWSServiceLambda:
  392. return AWSServiceNameLambda;
  393. case AWSServiceLexRuntime:
  394. return AWSServiceNameLexRuntime;
  395. case AWSServiceLogs:
  396. return AWSServiceNameLogs;
  397. case AWSServiceMachineLearning:
  398. return AWSServiceNameMachineLearning;
  399. case AWSServiceMobileAnalytics:
  400. return AWSServiceNameMobileAnalytics;
  401. case AWSServicePolly:
  402. return AWSServiceNamePolly;
  403. case AWSServiceMobileTargeting:
  404. return AWSServiceNameMobileTargeting;
  405. case AWSServiceRekognition:
  406. return AWSServiceNameRekognition;
  407. case AWSServiceS3:
  408. return AWSServiceNameS3;
  409. case AWSServiceSES:
  410. return AWSServiceNameSES;
  411. case AWSServiceSimpleDB:
  412. return AWSServiceNameSimpleDB;
  413. case AWSServiceSNS:
  414. return AWSServiceNameSNS;
  415. case AWSServiceSQS:
  416. return AWSServiceNameSQS;
  417. case AWSServiceSTS:
  418. return AWSServiceNameSTS;
  419. case AWSServiceTranscribe:
  420. return AWSServiceNameTranscribe;
  421. case AWSServiceTranslate:
  422. return AWSServiceNameTranslate;
  423. case AWSServiceComprehend:
  424. return AWSServiceNameComprehend;
  425. case AWSServiceKinesisVideo:
  426. return AWSServiceNameKinesisVideo;
  427. case AWSServiceKinesisVideoArchivedMedia:
  428. return AWSServiceNameKinesisVideoArchivedMedia;
  429. default:
  430. return nil;
  431. }
  432. }
  433. - (NSURL *)URLWithRegion:(AWSRegionType)regionType
  434. regionName:(NSString *)regionName
  435. service:(AWSServiceType)serviceType
  436. serviceName:(NSString *)serviceName
  437. useUnsafeURL:(BOOL)useUnsafeURL {
  438. NSURL *URL = nil;
  439. NSString *separator = @".";
  440. if (serviceType == AWSServiceS3
  441. && (regionType == AWSRegionUSEast1
  442. || regionType == AWSRegionUSWest1
  443. || regionType == AWSRegionUSWest2
  444. || regionType == AWSRegionEUWest1
  445. || regionType == AWSRegionAPSoutheast1
  446. || regionType == AWSRegionAPNortheast1
  447. || regionType == AWSRegionAPNortheast2
  448. || regionType == AWSRegionAPSoutheast2
  449. || regionType == AWSRegionAPSouth1
  450. || regionType == AWSRegionSAEast1
  451. || regionType == AWSRegionUSGovWest1)) {
  452. separator = @"-";
  453. }
  454. NSString *HTTPType = @"https";
  455. if (useUnsafeURL) {
  456. HTTPType = @"http";
  457. }
  458. if (serviceType == AWSServiceS3 && regionType == AWSRegionUSEast1) {
  459. URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://s3.amazonaws.com", HTTPType]];
  460. } else if (serviceType == AWSServiceSTS) {
  461. if (regionType == AWSRegionCNNorth1) {
  462. URL = [NSURL URLWithString:@"https://sts.cn-north-1.amazonaws.com"];
  463. } else if (regionType == AWSRegionUSGovWest1) {
  464. URL = [NSURL URLWithString:@"https://sts.us-gov-west-1.amazonaws.com"];
  465. } else {
  466. URL = [NSURL URLWithString:@"https://sts.amazonaws.com"];
  467. }
  468. } else if (serviceType == AWSServiceSimpleDB && regionType == AWSRegionUSEast1) {
  469. URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://sdb.amazonaws.com", HTTPType]];
  470. } else if (serviceType == AWSServiceIoT) {
  471. URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://iot%@%@.amazonaws.com", HTTPType, separator, regionName]];
  472. } else if (serviceType == AWSServiceIoTData) {
  473. URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://data%@iot%@%@.amazonaws.com", HTTPType, separator, separator, regionName]];
  474. } else if (serviceType == AWSServiceMobileTargeting) {
  475. URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://pinpoint%@%@.amazonaws.com", HTTPType, separator, regionName]];
  476. } else {
  477. URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@%@%@.amazonaws.com", HTTPType, serviceName, separator, regionName]];
  478. }
  479. //need to add ".cn" at end of URL if it is in China Region
  480. if ([regionName hasPrefix:@"cn"]) {
  481. NSString *urlString = [URL absoluteString];
  482. URL = [NSURL URLWithString:[urlString stringByAppendingString:@".cn"]];
  483. }
  484. return URL;
  485. }
  486. @end