OSSModel.m 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856
  1. //
  2. // OSSModel.m
  3. // oss_ios_sdk
  4. //
  5. // Created by zhouzhuo on 8/16/15.
  6. // Copyright (c) 2015 aliyun.com. All rights reserved.
  7. //
  8. #import "OSSDefine.h"
  9. #import "OSSModel.h"
  10. #import "OSSBolts.h"
  11. #import "OSSUtil.h"
  12. #import "OSSNetworking.h"
  13. #import "OSSLog.h"
  14. #import "OSSXMLDictionary.h"
  15. #if TARGET_OS_IOS
  16. #import <UIKit/UIDevice.h>
  17. #endif
  18. #import "OSSAllRequestNeededMessage.h"
  19. @implementation NSDictionary (OSS)
  20. - (NSString *)base64JsonString {
  21. NSError * error;
  22. NSData * jsonData = [NSJSONSerialization dataWithJSONObject:self
  23. options:0
  24. error:&error];
  25. if (!jsonData) {
  26. return @"e30="; // base64("{}");
  27. } else {
  28. NSString * jsonStr = [[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"];
  29. NSLog(@"callback json - %@", jsonStr);
  30. return [[jsonStr dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
  31. }
  32. }
  33. @end
  34. @implementation OSSSyncMutableDictionary
  35. - (instancetype)init {
  36. if (self = [super init]) {
  37. _dictionary = [NSMutableDictionary dictionary];
  38. _dispatchQueue = dispatch_queue_create("com.aliyun.aliyunsycmutabledictionary", DISPATCH_QUEUE_SERIAL);
  39. }
  40. return self;
  41. }
  42. - (NSArray *)allKeys {
  43. __block NSArray *allKeys = nil;
  44. dispatch_sync(self.dispatchQueue, ^{
  45. allKeys = [self.dictionary allKeys];
  46. });
  47. return allKeys;
  48. }
  49. - (id)objectForKey:(id)aKey {
  50. __block id returnObject = nil;
  51. dispatch_sync(self.dispatchQueue, ^{
  52. returnObject = [self.dictionary objectForKey:aKey];
  53. });
  54. return returnObject;
  55. }
  56. - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey {
  57. dispatch_sync(self.dispatchQueue, ^{
  58. [self.dictionary oss_setObject:anObject forKey:aKey];
  59. });
  60. }
  61. - (void)removeObjectForKey:(id)aKey {
  62. dispatch_sync(self.dispatchQueue, ^{
  63. [self.dictionary removeObjectForKey:aKey];
  64. });
  65. }
  66. @end
  67. @implementation OSSFederationToken
  68. - (NSString *)description
  69. {
  70. return [NSString stringWithFormat:@"OSSFederationToken<%p>:{AccessKeyId: %@\nAccessKeySecret: %@\nSecurityToken: %@\nExpiration: %@}", self, _tAccessKey, _tSecretKey, _tToken, _expirationTimeInGMTFormat];
  71. }
  72. @end
  73. @implementation OSSPlainTextAKSKPairCredentialProvider
  74. - (instancetype)initWithPlainTextAccessKey:(nonnull NSString *)accessKey secretKey:(nonnull NSString *)secretKey {
  75. if (self = [super init]) {
  76. self.accessKey = [accessKey oss_trim];
  77. self.secretKey = [secretKey oss_trim];
  78. }
  79. return self;
  80. }
  81. - (nullable NSString *)sign:(NSString *)content error:(NSError **)error {
  82. if (![self.accessKey oss_isNotEmpty] || ![self.secretKey oss_isNotEmpty])
  83. {
  84. if (error != nil)
  85. {
  86. *error = [NSError errorWithDomain:OSSClientErrorDomain
  87. code:OSSClientErrorCodeSignFailed
  88. userInfo:@{OSSErrorMessageTOKEN: @"accessKey or secretKey can't be null"}];
  89. }
  90. return nil;
  91. }
  92. NSString * sign = [OSSUtil calBase64Sha1WithData:content withSecret:self.secretKey];
  93. return [NSString stringWithFormat:@"OSS %@:%@", self.accessKey, sign];
  94. }
  95. @end
  96. @implementation OSSCustomSignerCredentialProvider
  97. - (instancetype)initWithImplementedSigner:(OSSCustomSignContentBlock)signContent
  98. {
  99. NSParameterAssert(signContent);
  100. if (self = [super init])
  101. {
  102. _signContent = signContent;
  103. }
  104. return self;
  105. }
  106. - (NSString *)sign:(NSString *)content error:(NSError **)error
  107. {
  108. NSString * signature = @"";
  109. @synchronized(self) {
  110. signature = self.signContent(content, error);
  111. }
  112. if (*error) {
  113. *error = [NSError errorWithDomain:OSSClientErrorDomain
  114. code:OSSClientErrorCodeSignFailed
  115. userInfo:[[NSDictionary alloc] initWithDictionary:[*error userInfo]]];
  116. return nil;
  117. }
  118. return signature;
  119. }
  120. @end
  121. @implementation OSSFederationCredentialProvider
  122. - (instancetype)initWithFederationTokenGetter:(OSSGetFederationTokenBlock)federationTokenGetter {
  123. if (self = [super init]) {
  124. self.federationTokenGetter = federationTokenGetter;
  125. }
  126. return self;
  127. }
  128. - (nullable OSSFederationToken *)getToken:(NSError **)error {
  129. OSSFederationToken * validToken = nil;
  130. @synchronized(self) {
  131. if (self.cachedToken == nil) {
  132. self.cachedToken = self.federationTokenGetter();
  133. } else {
  134. if (self.cachedToken.expirationTimeInGMTFormat) {
  135. NSDateFormatter * fm = [NSDateFormatter new];
  136. [fm setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
  137. self.cachedToken.expirationTimeInMilliSecond = [[fm dateFromString:self.cachedToken.expirationTimeInGMTFormat] timeIntervalSince1970] * 1000;
  138. self.cachedToken.expirationTimeInGMTFormat = nil;
  139. OSSLogVerbose(@"Transform GMT date to expirationTimeInMilliSecond: %lld", self.cachedToken.expirationTimeInMilliSecond);
  140. }
  141. NSDate * expirationDate = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval)(self.cachedToken.expirationTimeInMilliSecond / 1000)];
  142. NSTimeInterval interval = [expirationDate timeIntervalSinceDate:[NSDate oss_clockSkewFixedDate]];
  143. /* if this token will be expired after less than 2min, we abort it in case of when request arrived oss server,
  144. it's expired already. */
  145. if (interval < 5 * 60) {
  146. OSSLogDebug(@"get federation token, but after %lf second it would be expired", interval);
  147. self.cachedToken = self.federationTokenGetter();
  148. }
  149. }
  150. validToken = self.cachedToken;
  151. }
  152. if (!validToken)
  153. {
  154. if (error != nil)
  155. {
  156. *error = [NSError errorWithDomain:OSSClientErrorDomain
  157. code:OSSClientErrorCodeSignFailed
  158. userInfo:@{OSSErrorMessageTOKEN: @"Can't get a federation token"}];
  159. }
  160. return nil;
  161. }
  162. return validToken;
  163. }
  164. @end
  165. @implementation OSSStsTokenCredentialProvider
  166. - (OSSFederationToken *)getToken {
  167. OSSFederationToken * token = [OSSFederationToken new];
  168. token.tAccessKey = self.accessKeyId;
  169. token.tSecretKey = self.secretKeyId;
  170. token.tToken = self.securityToken;
  171. token.expirationTimeInMilliSecond = NSIntegerMax;
  172. return token;
  173. }
  174. - (instancetype)initWithAccessKeyId:(NSString *)accessKeyId secretKeyId:(NSString *)secretKeyId securityToken:(NSString *)securityToken {
  175. if (self = [super init]) {
  176. self.accessKeyId = [accessKeyId oss_trim];
  177. self.secretKeyId = [secretKeyId oss_trim];
  178. self.securityToken = [securityToken oss_trim];
  179. }
  180. return self;
  181. }
  182. - (NSString *)sign:(NSString *)content error:(NSError **)error {
  183. NSString * sign = [OSSUtil calBase64Sha1WithData:content withSecret:self.secretKeyId];
  184. return [NSString stringWithFormat:@"OSS %@:%@", self.accessKeyId, sign];
  185. }
  186. @end
  187. @implementation OSSAuthCredentialProvider
  188. - (instancetype)initWithAuthServerUrl:(NSString *)authServerUrl
  189. {
  190. return [self initWithAuthServerUrl:authServerUrl responseDecoder:nil];
  191. }
  192. - (instancetype)initWithAuthServerUrl:(NSString *)authServerUrl responseDecoder:(nullable OSSResponseDecoderBlock)decoder
  193. {
  194. self = [super initWithFederationTokenGetter:^OSSFederationToken * {
  195. NSURL * url = [NSURL URLWithString:self.authServerUrl];
  196. NSURLRequest * request = [NSURLRequest requestWithURL:url];
  197. OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource];
  198. NSURLSession * session = [NSURLSession sharedSession];
  199. NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request
  200. completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  201. if (error) {
  202. [tcs setError:error];
  203. return;
  204. }
  205. [tcs setResult:data];
  206. }];
  207. [sessionTask resume];
  208. [tcs.task waitUntilFinished];
  209. if (tcs.task.error) {
  210. return nil;
  211. } else {
  212. NSData* data = tcs.task.result;
  213. if(decoder){
  214. data = decoder(data);
  215. }
  216. NSDictionary * object = [NSJSONSerialization JSONObjectWithData:data
  217. options:kNilOptions
  218. error:nil];
  219. int statusCode = [[object objectForKey:@"StatusCode"] intValue];
  220. if (statusCode == 200) {
  221. OSSFederationToken * token = [OSSFederationToken new];
  222. // All the entries below are mandatory.
  223. token.tAccessKey = [object objectForKey:@"AccessKeyId"];
  224. token.tSecretKey = [object objectForKey:@"AccessKeySecret"];
  225. token.tToken = [object objectForKey:@"SecurityToken"];
  226. token.expirationTimeInGMTFormat = [object objectForKey:@"Expiration"];
  227. OSSLogDebug(@"token: %@ %@ %@ %@", token.tAccessKey, token.tSecretKey, token.tToken, [object objectForKey:@"Expiration"]);
  228. return token;
  229. }else{
  230. return nil;
  231. }
  232. }
  233. }];
  234. if(self){
  235. self.authServerUrl = authServerUrl;
  236. }
  237. return self;
  238. }
  239. @end
  240. NSString * const BACKGROUND_SESSION_IDENTIFIER = @"com.aliyun.oss.backgroundsession";
  241. @implementation OSSClientConfiguration
  242. - (instancetype)init {
  243. if (self = [super init]) {
  244. self.maxRetryCount = OSSDefaultRetryCount;
  245. self.maxConcurrentRequestCount = OSSDefaultMaxConcurrentNum;
  246. self.enableBackgroundTransmitService = NO;
  247. self.isHttpdnsEnable = YES;
  248. self.backgroundSesseionIdentifier = BACKGROUND_SESSION_IDENTIFIER;
  249. self.timeoutIntervalForRequest = OSSDefaultTimeoutForRequestInSecond;
  250. self.timeoutIntervalForResource = OSSDefaultTimeoutForResourceInSecond;
  251. }
  252. return self;
  253. }
  254. - (void)setCnameExcludeList:(NSArray *)cnameExcludeList {
  255. NSMutableArray * array = [NSMutableArray new];
  256. [cnameExcludeList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  257. NSString * host = [(NSString *)obj lowercaseString];
  258. if ([host containsString:@"://"]) {
  259. NSString * trimHost = [host substringFromIndex:[host rangeOfString:@"://"].location + 3];
  260. [array addObject:trimHost];
  261. } else {
  262. [array addObject:host];
  263. }
  264. }];
  265. _cnameExcludeList = array.copy;
  266. }
  267. @end
  268. @implementation OSSSignerInterceptor
  269. - (instancetype)initWithCredentialProvider:(id<OSSCredentialProvider>)credentialProvider {
  270. if (self = [super init]) {
  271. self.credentialProvider = credentialProvider;
  272. }
  273. return self;
  274. }
  275. - (OSSTask *)interceptRequestMessage:(OSSAllRequestNeededMessage *)requestMessage {
  276. OSSLogVerbose(@"signing intercepting - ");
  277. NSError * error = nil;
  278. /****************************************************************
  279. * define a constant array to contain all specified subresource */
  280. static NSArray * OSSSubResourceARRAY = nil;
  281. static dispatch_once_t onceToken;
  282. dispatch_once(&onceToken, ^{
  283. OSSSubResourceARRAY = @[@"acl", @"uploadId", @"partNumber", @"uploads", @"logging", @"website", @"location",
  284. @"lifecycle", @"referer", @"cors", @"delete", @"append", @"position", @"security-token", @"x-oss-process", @"sequential",@"bucketInfo",@"symlink", @"restore"];
  285. });
  286. /****************************************************************/
  287. /* initial each part of content to sign */
  288. NSString * method = requestMessage.httpMethod;
  289. NSString * contentType = @"";
  290. NSString * contentMd5 = @"";
  291. NSString * date = requestMessage.date;
  292. NSString * xossHeader = @"";
  293. NSString * resource = @"";
  294. OSSFederationToken * federationToken = nil;
  295. if (requestMessage.contentType) {
  296. contentType = requestMessage.contentType;
  297. }
  298. if (requestMessage.contentMd5) {
  299. contentMd5 = requestMessage.contentMd5;
  300. }
  301. /* if credential provider is a federation token provider, it need to specially handle */
  302. if ([self.credentialProvider isKindOfClass:[OSSFederationCredentialProvider class]]) {
  303. federationToken = [(OSSFederationCredentialProvider *)self.credentialProvider getToken:&error];
  304. if (error) {
  305. return [OSSTask taskWithError:error];
  306. }
  307. [requestMessage.headerParams oss_setObject:federationToken.tToken forKey:@"x-oss-security-token"];
  308. } else if ([self.credentialProvider isKindOfClass:[OSSStsTokenCredentialProvider class]]) {
  309. federationToken = [(OSSStsTokenCredentialProvider *)self.credentialProvider getToken];
  310. [requestMessage.headerParams oss_setObject:federationToken.tToken forKey:@"x-oss-security-token"];
  311. }
  312. [requestMessage.headerParams oss_setObject:requestMessage.contentSHA1 forKey:OSSHttpHeaderHashSHA1];
  313. /* construct CanonicalizedOSSHeaders */
  314. if (requestMessage.headerParams) {
  315. NSMutableArray * params = [[NSMutableArray alloc] init];
  316. NSArray * sortedKey = [[requestMessage.headerParams allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  317. return [obj1 compare:obj2];
  318. }];
  319. for (NSString * key in sortedKey) {
  320. if ([key hasPrefix:@"x-oss-"]) {
  321. [params addObject:[NSString stringWithFormat:@"%@:%@", key, [requestMessage.headerParams objectForKey:key]]];
  322. }
  323. }
  324. if ([params count]) {
  325. xossHeader = [NSString stringWithFormat:@"%@\n", [params componentsJoinedByString:@"\n"]];
  326. }
  327. }
  328. /* construct CanonicalizedResource */
  329. resource = @"/";
  330. if (requestMessage.bucketName) {
  331. resource = [NSString stringWithFormat:@"/%@/", requestMessage.bucketName];
  332. }
  333. if (requestMessage.objectKey) {
  334. resource = [resource oss_stringByAppendingPathComponentForURL:requestMessage.objectKey];
  335. }
  336. if (requestMessage.params) {
  337. NSMutableArray * querys = [[NSMutableArray alloc] init];
  338. NSArray * sortedKey = [[requestMessage.params allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  339. return [obj1 compare:obj2];
  340. }];
  341. for (NSString * key in sortedKey) {
  342. NSString * value = [requestMessage.params objectForKey:key];
  343. if (![OSSSubResourceARRAY containsObject:key]) { // notice it's based on content compare
  344. continue;
  345. }
  346. if ([value isEqualToString:@""]) {
  347. [querys addObject:[NSString stringWithFormat:@"%@", key]];
  348. } else {
  349. [querys addObject:[NSString stringWithFormat:@"%@=%@", key, value]];
  350. }
  351. }
  352. if ([querys count]) {
  353. resource = [resource stringByAppendingString:[NSString stringWithFormat:@"?%@",[querys componentsJoinedByString:@"&"]]];
  354. }
  355. }
  356. /* now, join every part of content and sign */
  357. NSString * stringToSign = [NSString stringWithFormat:@"%@\n%@\n%@\n%@\n%@%@", method, contentMd5, contentType, date, xossHeader, resource];
  358. OSSLogDebug(@"string to sign: %@", stringToSign);
  359. if ([self.credentialProvider isKindOfClass:[OSSFederationCredentialProvider class]]
  360. || [self.credentialProvider isKindOfClass:[OSSStsTokenCredentialProvider class]])
  361. {
  362. NSString * signature = [OSSUtil sign:stringToSign withToken:federationToken];
  363. [requestMessage.headerParams oss_setObject:signature forKey:@"Authorization"];
  364. }else if ([self.credentialProvider isKindOfClass:[OSSCustomSignerCredentialProvider class]])
  365. {
  366. OSSCustomSignerCredentialProvider *provider = (OSSCustomSignerCredentialProvider *)self.credentialProvider;
  367. NSError *customSignError;
  368. NSString * signature = [provider sign:stringToSign error:&customSignError];
  369. if (customSignError) {
  370. OSSLogError(@"OSSCustomSignerError: %@", customSignError)
  371. return [OSSTask taskWithError: customSignError];
  372. }
  373. [requestMessage.headerParams oss_setObject:signature forKey:@"Authorization"];
  374. }else
  375. {
  376. NSString * signature = [self.credentialProvider sign:stringToSign error:&error];
  377. if (error) {
  378. return [OSSTask taskWithError:error];
  379. }
  380. [requestMessage.headerParams oss_setObject:signature forKey:@"Authorization"];
  381. }
  382. return [OSSTask taskWithResult:nil];
  383. }
  384. @end
  385. @implementation OSSUASettingInterceptor
  386. - (instancetype)initWithClientConfiguration:(OSSClientConfiguration *)clientConfiguration{
  387. if (self = [super init]) {
  388. self.clientConfiguration = clientConfiguration;
  389. }
  390. return self;
  391. }
  392. - (OSSTask *)interceptRequestMessage:(OSSAllRequestNeededMessage *)request {
  393. NSString * userAgent = [self getUserAgent:self.clientConfiguration.userAgentMark];
  394. [request.headerParams oss_setObject:userAgent forKey:@"User-Agent"];
  395. return [OSSTask taskWithResult:nil];
  396. }
  397. - (NSString *)getUserAgent:(NSString *)customUserAgent {
  398. static NSString * userAgent = nil;
  399. static dispatch_once_t once;
  400. NSString * tempUserAgent = nil;
  401. dispatch_once(&once, ^{
  402. NSString *localeIdentifier = [[NSLocale currentLocale] localeIdentifier];
  403. #if TARGET_OS_IOS
  404. NSString *systemName = [[[UIDevice currentDevice] systemName] stringByReplacingOccurrencesOfString:@" " withString:@"-"];
  405. NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
  406. userAgent = [NSString stringWithFormat:@"%@/%@(/%@/%@/%@)", OSSUAPrefix, OSSSDKVersion, systemName, systemVersion, localeIdentifier];
  407. #elif TARGET_OS_OSX
  408. userAgent = [NSString stringWithFormat:@"%@/%@(/%@/%@/%@)", OSSUAPrefix, OSSSDKVersion, @"OSX", [NSProcessInfo processInfo].operatingSystemVersionString, localeIdentifier];
  409. #endif
  410. });
  411. if(customUserAgent){
  412. if(userAgent){
  413. tempUserAgent = [[userAgent stringByAppendingString:@"/"] stringByAppendingString:customUserAgent];
  414. }else{
  415. tempUserAgent = customUserAgent;
  416. }
  417. }else{
  418. tempUserAgent = userAgent;
  419. }
  420. return tempUserAgent;
  421. }
  422. @end
  423. @implementation OSSTimeSkewedFixingInterceptor
  424. - (OSSTask *)interceptRequestMessage:(OSSAllRequestNeededMessage *)request {
  425. request.date = [[NSDate oss_clockSkewFixedDate] oss_asStringValue];
  426. return [OSSTask taskWithResult:nil];
  427. }
  428. @end
  429. @implementation OSSRange
  430. - (instancetype)initWithStart:(int64_t)start withEnd:(int64_t)end {
  431. if (self = [super init]) {
  432. self.startPosition = start;
  433. self.endPosition = end;
  434. }
  435. return self;
  436. }
  437. - (NSString *)toHeaderString {
  438. NSString * rangeString = nil;
  439. if (self.startPosition < 0 && self.endPosition < 0) {
  440. rangeString = [NSString stringWithFormat:@"bytes=%lld-%lld", self.startPosition, self.endPosition];
  441. } else if (self.startPosition < 0) {
  442. rangeString = [NSString stringWithFormat:@"bytes=-%lld", self.endPosition];
  443. } else if (self.endPosition < 0) {
  444. rangeString = [NSString stringWithFormat:@"bytes=%lld-", self.startPosition];
  445. } else {
  446. rangeString = [NSString stringWithFormat:@"bytes=%lld-%lld", self.startPosition, self.endPosition];
  447. }
  448. return rangeString;
  449. }
  450. @end
  451. #pragma mark request and result objects
  452. @implementation OSSGetServiceRequest
  453. - (NSDictionary *)requestParams {
  454. NSMutableDictionary * params = [NSMutableDictionary dictionary];
  455. [params oss_setObject:self.prefix forKey:@"prefix"];
  456. [params oss_setObject:self.marker forKey:@"marker"];
  457. if (self.maxKeys > 0) {
  458. [params oss_setObject:[@(self.maxKeys) stringValue] forKey:@"max-keys"];
  459. }
  460. return [params copy];
  461. }
  462. @end
  463. @implementation OSSGetServiceResult
  464. @end
  465. @implementation OSSCreateBucketRequest
  466. - (instancetype)init
  467. {
  468. self = [super init];
  469. if (self) {
  470. _storageClass = OSSBucketStorageClassStandard;
  471. }
  472. return self;
  473. }
  474. - (NSString *)storageClassAsString {
  475. NSString *storageClassString = nil;
  476. switch (_storageClass) {
  477. case OSSBucketStorageClassStandard:
  478. storageClassString = @"Standard";
  479. break;
  480. case OSSBucketStorageClassIA:
  481. storageClassString = @"IA";
  482. break;
  483. case OSSBucketStorageClassArchive:
  484. storageClassString = @"Archive";
  485. break;
  486. default:
  487. storageClassString = @"Unknown";
  488. break;
  489. }
  490. return storageClassString;
  491. }
  492. @end
  493. @implementation OSSCreateBucketResult
  494. @end
  495. @implementation OSSDeleteBucketRequest
  496. @end
  497. @implementation OSSDeleteBucketResult
  498. @end
  499. @implementation OSSGetBucketRequest
  500. - (NSDictionary *)requestParams {
  501. NSMutableDictionary * params = [NSMutableDictionary dictionary];
  502. [params oss_setObject:self.delimiter forKey:@"delimiter"];
  503. [params oss_setObject:self.prefix forKey:@"prefix"];
  504. [params oss_setObject:self.marker forKey:@"marker"];
  505. if (self.maxKeys > 0) {
  506. [params oss_setObject:[@(self.maxKeys) stringValue] forKey:@"max-keys"];
  507. }
  508. return [params copy];
  509. }
  510. @end
  511. @implementation OSSListMultipartUploadsRequest
  512. - (NSDictionary *)requestParams {
  513. NSMutableDictionary * params = [NSMutableDictionary dictionary];
  514. [params oss_setObject:self.delimiter forKey:@"delimiter"];
  515. [params oss_setObject:self.prefix forKey:@"prefix"];
  516. [params oss_setObject:self.keyMarker forKey:@"key-marker"];
  517. [params oss_setObject:self.uploadIdMarker forKey:@"upload-id-marker"];
  518. [params oss_setObject:self.encodingType forKey:@"encoding-type"];
  519. if (self.maxUploads > 0) {
  520. [params oss_setObject:[@(self.maxUploads) stringValue] forKey:@"max-uploads"];
  521. }
  522. return [params copy];
  523. }
  524. @end
  525. @implementation OSSListMultipartUploadsResult
  526. @end
  527. @implementation OSSGetBucketResult
  528. @end
  529. @implementation OSSGetBucketACLRequest
  530. - (NSDictionary *)requestParams {
  531. return @{@"acl": @""};
  532. }
  533. @end
  534. @implementation OSSGetBucketACLResult
  535. @end
  536. @implementation OSSHeadObjectRequest
  537. @end
  538. @implementation OSSHeadObjectResult
  539. @end
  540. @implementation OSSGetObjectRequest
  541. @end
  542. @implementation OSSGetObjectResult
  543. @end
  544. @implementation OSSPutObjectACLRequest
  545. - (instancetype)init
  546. {
  547. self = [super init];
  548. if (self) {
  549. _acl = @"default";
  550. }
  551. return self;
  552. }
  553. @end
  554. @implementation OSSPutObjectACLResult
  555. @end
  556. @implementation OSSPutObjectRequest
  557. - (instancetype)init {
  558. if (self = [super init]) {
  559. self.objectMeta = [NSDictionary new];
  560. }
  561. return self;
  562. }
  563. @end
  564. @implementation OSSPutObjectResult
  565. @end
  566. @implementation OSSAppendObjectRequest
  567. - (instancetype)init {
  568. if (self = [super init]) {
  569. self.objectMeta = [NSDictionary new];
  570. }
  571. return self;
  572. }
  573. @end
  574. @implementation OSSAppendObjectResult
  575. @end
  576. @implementation OSSDeleteObjectRequest
  577. @end
  578. @implementation OSSDeleteObjectResult
  579. @end
  580. @implementation OSSCopyObjectRequest
  581. - (instancetype)init {
  582. if (self = [super init]) {
  583. self.objectMeta = [NSDictionary new];
  584. }
  585. return self;
  586. }
  587. @end
  588. @implementation OSSCopyObjectResult
  589. @end
  590. @implementation OSSInitMultipartUploadRequest
  591. - (instancetype)init {
  592. if (self = [super init]) {
  593. self.objectMeta = [NSDictionary new];
  594. }
  595. return self;
  596. }
  597. @end
  598. @implementation OSSInitMultipartUploadResult
  599. @end
  600. @implementation OSSUploadPartRequest
  601. @end
  602. @implementation OSSUploadPartResult
  603. @end
  604. @implementation OSSPartInfo
  605. + (instancetype)partInfoWithPartNum:(int32_t)partNum
  606. eTag:(NSString *)eTag
  607. size:(int64_t)size {
  608. return [self partInfoWithPartNum:partNum
  609. eTag:eTag
  610. size:size
  611. crc64:0];
  612. }
  613. + (instancetype)partInfoWithPartNum:(int32_t)partNum eTag:(NSString *)eTag size:(int64_t)size crc64:(uint64_t)crc64
  614. {
  615. OSSPartInfo *parInfo = [OSSPartInfo new];
  616. parInfo.partNum = partNum;
  617. parInfo.eTag = eTag;
  618. parInfo.size = size;
  619. parInfo.crc64 = crc64;
  620. return parInfo;
  621. }
  622. - (nonnull NSDictionary *)entityToDictionary
  623. {
  624. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  625. [dict setValue:@(_partNum) forKey:@"partNum"];
  626. if (_eTag)
  627. {
  628. [dict setValue:_eTag forKey:@"eTag"];
  629. }
  630. [dict setValue:@(_size) forKey:@"size"];
  631. [dict setValue:@(_crc64) forKey:@"crc64"];
  632. return [dict copy];
  633. }
  634. - (NSString *)description
  635. {
  636. return [NSString stringWithFormat:@"OSSPartInfo<%p>:{partNum: %d,eTag: %@,partSize: %lld,crc64: %llu}",self,self.partNum,self.eTag,self.size,self.crc64];
  637. }
  638. #pragma marks - Protocol Methods
  639. - (id)copyWithZone:(nullable NSZone *)zone
  640. {
  641. OSSPartInfo *instance = [[[self class] allocWithZone:zone] init];
  642. instance.partNum = self.partNum;
  643. instance.eTag = self.eTag;
  644. instance.size = self.size;
  645. instance.crc64 = self.crc64;
  646. return instance;
  647. }
  648. @end
  649. @implementation OSSCompleteMultipartUploadRequest
  650. @end
  651. @implementation OSSCompleteMultipartUploadResult
  652. @end
  653. @implementation OSSAbortMultipartUploadRequest
  654. @end
  655. @implementation OSSAbortMultipartUploadResult
  656. @end
  657. @implementation OSSListPartsRequest
  658. @end
  659. @implementation OSSListPartsResult
  660. @end
  661. @implementation OSSMultipartUploadRequest
  662. - (instancetype)init {
  663. if (self = [super init]) {
  664. self.partSize = 256 * 1024;
  665. }
  666. return self;
  667. }
  668. - (void)cancel {
  669. [super cancel];
  670. }
  671. @end
  672. @implementation OSSResumableUploadRequest
  673. - (instancetype)init {
  674. if (self = [super init]) {
  675. self.deleteUploadIdOnCancelling = YES;
  676. self.partSize = 256 * 1024;
  677. }
  678. return self;
  679. }
  680. - (void)cancel {
  681. [super cancel];
  682. if(_runningChildrenRequest){
  683. [_runningChildrenRequest cancel];
  684. }
  685. }
  686. @end
  687. @implementation OSSResumableUploadResult
  688. @end
  689. @implementation OSSCallBackRequest
  690. @end
  691. @implementation OSSCallBackResult
  692. @end
  693. @implementation OSSImagePersistRequest
  694. @end
  695. @implementation OSSImagePersistResult
  696. @end