Нет описания

OSSHttpResponseParser.m 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. //
  2. // OSSHttpResponseParser.m
  3. // AliyunOSSSDK
  4. //
  5. // Created by huaixu on 2018/1/22.
  6. // Copyright © 2018年 aliyun. All rights reserved.
  7. //
  8. #import "OSSHttpResponseParser.h"
  9. #import "NSMutableData+OSS_CRC.h"
  10. #import "OSSXMLDictionary.h"
  11. #import "OSSDefine.h"
  12. #import "OSSModel.h"
  13. #import "OSSUtil.h"
  14. #import "OSSLog.h"
  15. #import "OSSGetObjectACLResult.h"
  16. #import "OSSDeleteMultipleObjectsResult.h"
  17. @implementation OSSHttpResponseParser {
  18. OSSOperationType _operationTypeForThisParser;
  19. NSFileHandle * _fileHandle;
  20. NSMutableData * _collectingData;
  21. NSHTTPURLResponse * _response;
  22. uint64_t _crc64ecma;
  23. }
  24. - (void)reset {
  25. _collectingData = nil;
  26. _fileHandle = nil;
  27. _response = nil;
  28. }
  29. - (instancetype)initForOperationType:(OSSOperationType)operationType {
  30. if (self = [super init]) {
  31. _operationTypeForThisParser = operationType;
  32. }
  33. return self;
  34. }
  35. - (void)consumeHttpResponse:(NSHTTPURLResponse *)response {
  36. _response = response;
  37. }
  38. - (OSSTask *)consumeHttpResponseBody:(NSData *)data
  39. {
  40. if (_crc64Verifiable&&(_operationTypeForThisParser == OSSOperationTypeGetObject))
  41. {
  42. NSMutableData *mutableData = [NSMutableData dataWithData:data];
  43. if (_crc64ecma != 0)
  44. {
  45. _crc64ecma = [OSSUtil crc64ForCombineCRC1:_crc64ecma
  46. CRC2:[mutableData oss_crc64]
  47. length:mutableData.length];
  48. }else
  49. {
  50. _crc64ecma = [mutableData oss_crc64];
  51. }
  52. }
  53. if (self.onRecieveBlock) {
  54. self.onRecieveBlock(data);
  55. return [OSSTask taskWithResult:nil];
  56. }
  57. NSError * error;
  58. if (self.downloadingFileURL)
  59. {
  60. if (!_fileHandle)
  61. {
  62. NSFileManager * fm = [NSFileManager defaultManager];
  63. NSString * dirName = [[self.downloadingFileURL path] stringByDeletingLastPathComponent];
  64. if (![fm fileExistsAtPath:dirName])
  65. {
  66. [fm createDirectoryAtPath:dirName withIntermediateDirectories:YES attributes:nil error:&error];
  67. }
  68. if (![fm fileExistsAtPath:dirName] || error)
  69. {
  70. return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain
  71. code:OSSClientErrorCodeFileCantWrite
  72. userInfo:@{OSSErrorMessageTOKEN: [NSString stringWithFormat:@"Can't create dir at %@", dirName]}]];
  73. }
  74. [fm createFileAtPath:[self.downloadingFileURL path] contents:nil attributes:nil];
  75. if (![fm fileExistsAtPath:[self.downloadingFileURL path]])
  76. {
  77. return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain
  78. code:OSSClientErrorCodeFileCantWrite
  79. userInfo:@{OSSErrorMessageTOKEN: [NSString stringWithFormat:@"Can't create file at %@", [self.downloadingFileURL path]]}]];
  80. }
  81. _fileHandle = [NSFileHandle fileHandleForWritingToURL:self.downloadingFileURL error:&error];
  82. if (error)
  83. {
  84. return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain
  85. code:OSSClientErrorCodeFileCantWrite
  86. userInfo:[error userInfo]]];
  87. }
  88. [_fileHandle writeData:data];
  89. } else
  90. {
  91. @try {
  92. [_fileHandle writeData:data];
  93. }
  94. @catch (NSException *exception) {
  95. return [OSSTask taskWithError:[NSError errorWithDomain:OSSServerErrorDomain
  96. code:OSSClientErrorCodeFileCantWrite
  97. userInfo:@{OSSErrorMessageTOKEN: [exception description]}]];
  98. }
  99. }
  100. } else
  101. {
  102. if (!_collectingData)
  103. {
  104. _collectingData = [[NSMutableData alloc] initWithData:data];
  105. }
  106. else
  107. {
  108. [_collectingData appendData:data];
  109. }
  110. }
  111. return [OSSTask taskWithResult:nil];
  112. }
  113. - (void)parseResponseHeader:(NSHTTPURLResponse *)response toResultObject:(OSSResult *)result
  114. {
  115. result.httpResponseCode = [_response statusCode];
  116. result.httpResponseHeaderFields = [NSDictionary dictionaryWithDictionary:[_response allHeaderFields]];
  117. [[_response allHeaderFields] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  118. NSString * keyString = (NSString *)key;
  119. if ([keyString isEqualToString:@"x-oss-request-id"])
  120. {
  121. result.requestId = obj;
  122. }
  123. else if ([keyString isEqualToString:@"x-oss-hash-crc64ecma"])
  124. {
  125. result.remoteCRC64ecma = obj;
  126. }
  127. }];
  128. }
  129. - (NSDictionary *)parseResponseHeaderToGetMeta:(NSHTTPURLResponse *)response
  130. {
  131. NSMutableDictionary * meta = [NSMutableDictionary new];
  132. /* define a constant array to contain all meta header name */
  133. static NSArray * OSSObjectMetaFieldNames = nil;
  134. static dispatch_once_t onceToken;
  135. dispatch_once(&onceToken, ^{
  136. OSSObjectMetaFieldNames = @[@"Content-Type", @"Content-Length", @"Etag", @"Last-Modified", @"x-oss-request-id", @"x-oss-object-type",
  137. @"If-Modified-Since", @"If-Unmodified-Since", @"If-Match", @"If-None-Match"];
  138. });
  139. /****************************************************************/
  140. [[_response allHeaderFields] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  141. NSString * keyString = (NSString *)key;
  142. if ([OSSObjectMetaFieldNames containsObject:keyString] || [keyString hasPrefix:@"x-oss-meta"]) {
  143. [meta setObject:obj forKey:key];
  144. }
  145. }];
  146. return meta;
  147. }
  148. - (nullable id)constructResultObject
  149. {
  150. if (self.onRecieveBlock)
  151. {
  152. return nil;
  153. }
  154. switch (_operationTypeForThisParser)
  155. {
  156. case OSSOperationTypeGetService:
  157. {
  158. OSSGetServiceResult * getServiceResult = [OSSGetServiceResult new];
  159. if (_response)
  160. {
  161. [self parseResponseHeader:_response toResultObject:getServiceResult];
  162. }
  163. if (_collectingData)
  164. {
  165. NSDictionary * parseDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  166. OSSLogVerbose(@"Get service dict: %@", parseDict);
  167. if (parseDict)
  168. {
  169. getServiceResult.ownerId = [[parseDict objectForKey:OSSOwnerXMLTOKEN] objectForKey:OSSIDXMLTOKEN];
  170. getServiceResult.ownerDispName = [[parseDict objectForKey:OSSOwnerXMLTOKEN] objectForKey:OSSDisplayNameXMLTOKEN];
  171. getServiceResult.prefix = [parseDict objectForKey:OSSPrefixXMLTOKEN];
  172. getServiceResult.marker = [parseDict objectForKey:OSSMarkerXMLTOKEN];
  173. getServiceResult.maxKeys = [[parseDict objectForKey:OSSMaxKeysXMLTOKEN] intValue];
  174. getServiceResult.isTruncated = [[parseDict objectForKey:OSSIsTruncatedXMLTOKEN] boolValue];
  175. id bucketObject = [[parseDict objectForKey:OSSBucketsXMLTOKEN] objectForKey:OSSBucketXMLTOKEN];
  176. if ([bucketObject isKindOfClass:[NSArray class]]) {
  177. getServiceResult.buckets = bucketObject;
  178. } else if ([bucketObject isKindOfClass:[NSDictionary class]]) {
  179. NSArray * arr = [NSArray arrayWithObject:bucketObject];
  180. getServiceResult.buckets = arr;
  181. } else {
  182. getServiceResult.buckets = nil;
  183. }
  184. }
  185. }
  186. return getServiceResult;
  187. }
  188. case OSSOperationTypeCreateBucket:
  189. {
  190. OSSCreateBucketResult * createBucketResult = [OSSCreateBucketResult new];
  191. if (_response)
  192. {
  193. [self parseResponseHeader:_response toResultObject:createBucketResult];
  194. [_response.allHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  195. if ([((NSString *)key) isEqualToString:@"Location"]) {
  196. createBucketResult.location = obj;
  197. *stop = YES;
  198. }
  199. }];
  200. }
  201. return createBucketResult;
  202. }
  203. case OSSOperationTypeGetBucketACL:
  204. {
  205. OSSGetBucketACLResult * getBucketACLResult = [OSSGetBucketACLResult new];
  206. if (_response)
  207. {
  208. [self parseResponseHeader:_response toResultObject:getBucketACLResult];
  209. }
  210. if (_collectingData)
  211. {
  212. NSDictionary * parseDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  213. OSSLogVerbose(@"Get service dict: %@", parseDict);
  214. if (parseDict)
  215. {
  216. getBucketACLResult.aclGranted = [[parseDict objectForKey:OSSAccessControlListXMLTOKEN] objectForKey:OSSGrantXMLTOKEN];
  217. }
  218. }
  219. return getBucketACLResult;
  220. }
  221. case OSSOperationTypeDeleteBucket:
  222. {
  223. OSSDeleteBucketResult * deleteBucketResult = [OSSDeleteBucketResult new];
  224. if (_response) {
  225. [self parseResponseHeader:_response toResultObject:deleteBucketResult];
  226. }
  227. return deleteBucketResult;
  228. }
  229. case OSSOperationTypeGetBucket:
  230. {
  231. OSSGetBucketResult * getBucketResult = [OSSGetBucketResult new];
  232. if (_response) {
  233. [self parseResponseHeader:_response toResultObject:getBucketResult];
  234. }
  235. if (_collectingData) {
  236. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  237. OSSLogVerbose(@"Get bucket dict: %@", parsedDict);
  238. if (parsedDict) {
  239. getBucketResult.bucketName = [parsedDict objectForKey:OSSNameXMLTOKEN];
  240. getBucketResult.prefix = [parsedDict objectForKey:OSSPrefixXMLTOKEN];
  241. getBucketResult.marker = [parsedDict objectForKey:OSSMarkerXMLTOKEN];
  242. getBucketResult.nextMarker = [parsedDict objectForKey:OSSNextMarkerXMLTOKEN];
  243. getBucketResult.maxKeys = (int32_t)[[parsedDict objectForKey:OSSMaxKeysXMLTOKEN] integerValue];
  244. getBucketResult.delimiter = [parsedDict objectForKey:OSSDelimiterXMLTOKEN];
  245. getBucketResult.isTruncated = [[parsedDict objectForKey:OSSIsTruncatedXMLTOKEN] boolValue];
  246. id contentObject = [parsedDict objectForKey:OSSContentsXMLTOKEN];
  247. if ([contentObject isKindOfClass:[NSArray class]]) {
  248. getBucketResult.contents = contentObject;
  249. } else if ([contentObject isKindOfClass:[NSDictionary class]]) {
  250. NSArray * arr = [NSArray arrayWithObject:contentObject];
  251. getBucketResult.contents = arr;
  252. } else {
  253. getBucketResult.contents = nil;
  254. }
  255. NSMutableArray * commentPrefixesArr = [NSMutableArray new];
  256. id commentPrefixes = [parsedDict objectForKey:OSSCommonPrefixesXMLTOKEN];
  257. if ([commentPrefixes isKindOfClass:[NSArray class]]) {
  258. for (NSDictionary * prefix in commentPrefixes) {
  259. [commentPrefixesArr addObject:[prefix objectForKey:@"Prefix"]];
  260. }
  261. } else if ([commentPrefixes isKindOfClass:[NSDictionary class]]) {
  262. [commentPrefixesArr addObject:[(NSDictionary *)commentPrefixes objectForKey:@"Prefix"]];
  263. } else {
  264. commentPrefixesArr = nil;
  265. }
  266. getBucketResult.commentPrefixes = commentPrefixesArr;
  267. }
  268. }
  269. return getBucketResult;
  270. }
  271. case OSSOperationTypeListMultipartUploads:
  272. {
  273. OSSListMultipartUploadsResult * listMultipartUploadsResult = [OSSListMultipartUploadsResult new];
  274. if (_response) {
  275. [self parseResponseHeader:_response toResultObject:listMultipartUploadsResult];
  276. }
  277. if (_collectingData) {
  278. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  279. OSSLogVerbose(@"List multipart uploads dict: %@", parsedDict);
  280. if (parsedDict) {
  281. listMultipartUploadsResult.bucketName = [parsedDict objectForKey:OSSBucketXMLTOKEN];
  282. listMultipartUploadsResult.prefix = [parsedDict objectForKey:OSSPrefixXMLTOKEN];
  283. listMultipartUploadsResult.uploadIdMarker = [parsedDict objectForKey:OSSUploadIdMarkerXMLTOKEN];
  284. listMultipartUploadsResult.nextUploadIdMarker = [parsedDict objectForKey:OSSUploadIdMarkerXMLTOKEN];
  285. listMultipartUploadsResult.keyMarker = [parsedDict objectForKey:OSSKeyMarkerXMLTOKEN];
  286. listMultipartUploadsResult.nextKeyMarker = [parsedDict objectForKey:OSSNextKeyMarkerXMLTOKEN];
  287. listMultipartUploadsResult.maxUploads = (int32_t)[[parsedDict objectForKey:OSSMaxUploadsXMLTOKEN] integerValue];
  288. listMultipartUploadsResult.delimiter = [parsedDict objectForKey:OSSDelimiterXMLTOKEN];
  289. listMultipartUploadsResult.isTruncated = [[parsedDict objectForKey:OSSIsTruncatedXMLTOKEN] boolValue];
  290. id contentObject = [parsedDict objectForKey:OSSUploadXMLTOKEN];
  291. if ([contentObject isKindOfClass:[NSArray class]]) {
  292. listMultipartUploadsResult.uploads = contentObject;
  293. } else if ([contentObject isKindOfClass:[NSDictionary class]]) {
  294. NSArray * arr = [NSArray arrayWithObject:contentObject];
  295. listMultipartUploadsResult.uploads = arr;
  296. } else {
  297. listMultipartUploadsResult.uploads = nil;
  298. }
  299. NSMutableArray * commentPrefixesArr = [NSMutableArray new];
  300. id commentPrefixes = [parsedDict objectForKey:OSSCommonPrefixesXMLTOKEN];
  301. if ([commentPrefixes isKindOfClass:[NSArray class]]) {
  302. for (NSDictionary * prefix in commentPrefixes) {
  303. [commentPrefixesArr addObject:[prefix objectForKey:@"Prefix"]];
  304. }
  305. } else if ([commentPrefixes isKindOfClass:[NSDictionary class]]) {
  306. [commentPrefixesArr addObject:[(NSDictionary *)commentPrefixes objectForKey:@"Prefix"]];
  307. } else {
  308. commentPrefixesArr = nil;
  309. }
  310. listMultipartUploadsResult.commonPrefixes = commentPrefixesArr;
  311. }
  312. }
  313. return listMultipartUploadsResult;
  314. }
  315. case OSSOperationTypeHeadObject:
  316. {
  317. OSSHeadObjectResult * headObjectResult = [OSSHeadObjectResult new];
  318. if (_response)
  319. {
  320. [self parseResponseHeader:_response toResultObject:headObjectResult];
  321. headObjectResult.objectMeta = [self parseResponseHeaderToGetMeta:_response];
  322. }
  323. return headObjectResult;
  324. }
  325. case OSSOperationTypeGetObject:
  326. {
  327. OSSGetObjectResult * getObejctResult = [OSSGetObjectResult new];
  328. OSSLogDebug(@"GetObjectResponse: %@", _response);
  329. if (_response)
  330. {
  331. [self parseResponseHeader:_response toResultObject:getObejctResult];
  332. getObejctResult.objectMeta = [self parseResponseHeaderToGetMeta:_response];
  333. if (_crc64ecma != 0)
  334. {
  335. getObejctResult.localCRC64ecma = [NSString stringWithFormat:@"%llu",_crc64ecma];
  336. }
  337. }
  338. if (_fileHandle) {
  339. [_fileHandle closeFile];
  340. }
  341. if (_collectingData) {
  342. getObejctResult.downloadedData = _collectingData;
  343. }
  344. return getObejctResult;
  345. }
  346. case OSSOperationTypeGetObjectACL:
  347. {
  348. OSSGetObjectACLResult * getObjectACLResult = [OSSGetObjectACLResult new];
  349. OSSLogDebug(@"GetObjectResponse: %@", _response);
  350. if (_response)
  351. {
  352. [self parseResponseHeader:_response toResultObject:getObjectACLResult];
  353. }
  354. if (_collectingData) {
  355. NSDictionary * parseDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  356. OSSLogVerbose(@"Get service dict: %@", parseDict);
  357. getObjectACLResult.grant = parseDict[@"AccessControlList"][@"Grant"];
  358. }
  359. return getObjectACLResult;
  360. }
  361. case OSSOperationTypePutObject:
  362. {
  363. OSSPutObjectResult * putObjectResult = [OSSPutObjectResult new];
  364. if (_response)
  365. {
  366. [self parseResponseHeader:_response toResultObject:putObjectResult];
  367. [_response.allHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  368. if ([((NSString *)key) isEqualToString:@"Etag"]) {
  369. putObjectResult.eTag = obj;
  370. *stop = YES;
  371. }
  372. }];
  373. }
  374. if (_collectingData) {
  375. putObjectResult.serverReturnJsonString = [[NSString alloc] initWithData:_collectingData encoding:NSUTF8StringEncoding];
  376. }
  377. return putObjectResult;
  378. }
  379. case OSSOperationTypeAppendObject:
  380. {
  381. OSSAppendObjectResult * appendObjectResult = [OSSAppendObjectResult new];
  382. if (_response) {
  383. [self parseResponseHeader:_response toResultObject:appendObjectResult];
  384. [_response.allHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  385. if ([((NSString *)key) isEqualToString:@"Etag"]) {
  386. appendObjectResult.eTag = obj;
  387. }
  388. if ([((NSString *)key) isEqualToString:@"x-oss-next-append-position"]) {
  389. appendObjectResult.xOssNextAppendPosition = [((NSString *)obj) longLongValue];
  390. }
  391. }];
  392. }
  393. return appendObjectResult;
  394. }
  395. case OSSOperationTypeDeleteObject: {
  396. OSSDeleteObjectResult * deleteObjectResult = [OSSDeleteObjectResult new];
  397. if (_response) {
  398. [self parseResponseHeader:_response toResultObject:deleteObjectResult];
  399. }
  400. return deleteObjectResult;
  401. }
  402. case OSSOperationTypeDeleteMultipleObjects: {
  403. OSSDeleteMultipleObjectsResult * deleteObjectResult = [OSSDeleteMultipleObjectsResult new];
  404. if (_response) {
  405. [self parseResponseHeader:_response toResultObject:deleteObjectResult];
  406. }
  407. if (_collectingData) {
  408. NSDictionary *dict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  409. deleteObjectResult.encodingType = dict[@"EncodingType"];
  410. deleteObjectResult.deletedObjects = dict[@"Deleted"];
  411. }
  412. return deleteObjectResult;
  413. }
  414. case OSSOperationTypePutObjectACL: {
  415. OSSPutObjectACLResult * putObjectACLResult = [OSSPutObjectACLResult new];
  416. if (_response) {
  417. [self parseResponseHeader:_response toResultObject:putObjectACLResult];
  418. }
  419. return putObjectACLResult;
  420. }
  421. case OSSOperationTypeCopyObject: {
  422. OSSCopyObjectResult * copyObjectResult = [OSSCopyObjectResult new];
  423. if (_response) {
  424. [self parseResponseHeader:_response toResultObject:copyObjectResult];
  425. }
  426. if (_collectingData) {
  427. OSSLogVerbose(@"copy object dict: %@", [NSDictionary oss_dictionaryWithXMLData:_collectingData]);
  428. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  429. if (parsedDict) {
  430. copyObjectResult.lastModifed = [parsedDict objectForKey:OSSLastModifiedXMLTOKEN];
  431. copyObjectResult.eTag = [parsedDict objectForKey:OSSETagXMLTOKEN];
  432. }
  433. }
  434. return copyObjectResult;
  435. }
  436. case OSSOperationTypeInitMultipartUpload: {
  437. OSSInitMultipartUploadResult * initMultipartUploadResult = [OSSInitMultipartUploadResult new];
  438. if (_response) {
  439. [self parseResponseHeader:_response toResultObject:initMultipartUploadResult];
  440. }
  441. if (_collectingData) {
  442. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  443. OSSLogVerbose(@"init multipart upload result: %@", parsedDict);
  444. if (parsedDict) {
  445. initMultipartUploadResult.uploadId = [parsedDict objectForKey:OSSUploadIdXMLTOKEN];
  446. }
  447. }
  448. return initMultipartUploadResult;
  449. }
  450. case OSSOperationTypeUploadPart: {
  451. OSSUploadPartResult * uploadPartResult = [OSSUploadPartResult new];
  452. if (_response) {
  453. [self parseResponseHeader:_response toResultObject:uploadPartResult];
  454. [_response.allHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  455. if ([((NSString *)key) isEqualToString:@"Etag"]) {
  456. uploadPartResult.eTag = obj;
  457. *stop = YES;
  458. }
  459. }];
  460. }
  461. return uploadPartResult;
  462. }
  463. case OSSOperationTypeCompleteMultipartUpload: {
  464. OSSCompleteMultipartUploadResult * completeMultipartUploadResult = [OSSCompleteMultipartUploadResult new];
  465. if (_response) {
  466. [self parseResponseHeader:_response toResultObject:completeMultipartUploadResult];
  467. }
  468. if (_collectingData) {
  469. if ([[[_response.allHeaderFields objectForKey:OSSHttpHeaderContentType] description] isEqual:@"application/xml"]) {
  470. OSSLogVerbose(@"complete multipart upload result: %@", [NSDictionary oss_dictionaryWithXMLData:_collectingData]);
  471. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  472. if (parsedDict) {
  473. completeMultipartUploadResult.location = [parsedDict objectForKey:OSSLocationXMLTOKEN];
  474. completeMultipartUploadResult.eTag = [parsedDict objectForKey:OSSETagXMLTOKEN];
  475. }
  476. } else {
  477. completeMultipartUploadResult.serverReturnJsonString = [[NSString alloc] initWithData:_collectingData encoding:NSUTF8StringEncoding];
  478. }
  479. }
  480. return completeMultipartUploadResult;
  481. }
  482. case OSSOperationTypeListMultipart: {
  483. OSSListPartsResult * listPartsReuslt = [OSSListPartsResult new];
  484. if (_response) {
  485. [self parseResponseHeader:_response toResultObject:listPartsReuslt];
  486. }
  487. if (_collectingData) {
  488. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  489. OSSLogVerbose(@"list multipart upload result: %@", parsedDict);
  490. if (parsedDict) {
  491. listPartsReuslt.nextPartNumberMarker = [[parsedDict objectForKey:OSSNextPartNumberMarkerXMLTOKEN] intValue];
  492. listPartsReuslt.maxParts = [[parsedDict objectForKey:OSSMaxKeysXMLTOKEN] intValue];
  493. listPartsReuslt.isTruncated = [[parsedDict objectForKey:OSSMaxKeysXMLTOKEN] boolValue];
  494. id partsObject = [parsedDict objectForKey:OSSPartXMLTOKEN];
  495. if ([partsObject isKindOfClass:[NSArray class]]) {
  496. listPartsReuslt.parts = partsObject;
  497. } else if ([partsObject isKindOfClass:[NSDictionary class]]) {
  498. NSArray * arr = [NSArray arrayWithObject:partsObject];
  499. listPartsReuslt.parts = arr;
  500. } else {
  501. listPartsReuslt.parts = nil;
  502. }
  503. }
  504. }
  505. return listPartsReuslt;
  506. }
  507. case OSSOperationTypeAbortMultipartUpload: {
  508. OSSAbortMultipartUploadResult * abortMultipartUploadResult = [OSSAbortMultipartUploadResult new];
  509. if (_response) {
  510. [self parseResponseHeader:_response toResultObject:abortMultipartUploadResult];
  511. }
  512. return abortMultipartUploadResult;
  513. }
  514. case OSSOperationTypeTriggerCallBack: {
  515. OSSCallBackResult *callbackResult = [OSSCallBackResult new];
  516. if (_response) {
  517. [self parseResponseHeader:_response toResultObject:callbackResult];
  518. }
  519. if (_collectingData) {
  520. if ([[[_response.allHeaderFields objectForKey:OSSHttpHeaderContentType] description] isEqual:@"application/xml"]) {
  521. NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData];
  522. OSSLogVerbose(@"callback trigger result<xml>: %@", parsedDict);
  523. callbackResult.serverReturnXML = parsedDict;
  524. } else if ([[[_response.allHeaderFields objectForKey:OSSHttpHeaderContentType] description] isEqual:@"application/json"]) {
  525. callbackResult.serverReturnJsonString = [[NSString alloc] initWithData:_collectingData encoding:NSUTF8StringEncoding];
  526. OSSLogVerbose(@"callback trigger result<json>: %@", callbackResult.serverReturnJsonString);
  527. }
  528. }
  529. return callbackResult;
  530. }
  531. case OSSOperationTypeImagePersist: {
  532. OSSImagePersistResult *imagePersistResult = [OSSImagePersistResult new];
  533. if (_response) {
  534. [self parseResponseHeader:_response toResultObject:imagePersistResult];
  535. }
  536. return imagePersistResult;
  537. }
  538. default: {
  539. OSSLogError(@"unknown operation type");
  540. break;
  541. }
  542. }
  543. return nil;
  544. }
  545. @end