1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import <ExpoFileSystem/EXSessionUploadTaskDelegate.h> 4 5@interface EXSessionUploadTaskDelegate () 6 7@property (strong, nonatomic) NSMutableData *responseData; 8 9@end 10 11@implementation EXSessionUploadTaskDelegate 12 13- (instancetype)initWithResolve:(EXPromiseResolveBlock)resolve reject:(EXPromiseRejectBlock)reject 14{ 15 if (self = [super initWithResolve:resolve reject:reject]) { 16 _responseData = [NSMutableData new]; 17 } 18 return self; 19} 20 21- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 22{ 23 if (!data.length) { 24 return; 25 } 26 [_responseData appendData:data]; 27} 28 29- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 30{ 31 if (error) { 32 self.reject(@"ERR_FILESYSTEM_CANNOT_UPLOAD", 33 [NSString stringWithFormat:@"Unable to upload the file: '%@'", error.description], 34 error); 35 return; 36 } 37 38 // We only set EXSessionUploadTaskDelegates as delegates of upload tasks 39 // so it should be safe to assume that this is what we will receive here. 40 NSURLSessionUploadTask *uploadTask = (NSURLSessionUploadTask *)task; 41 self.resolve([self parseServerResponse:uploadTask.response]); 42} 43 44- (NSDictionary *)parseServerResponse:(NSURLResponse *)response 45{ 46 NSMutableDictionary *result = [[super parseServerResponse:response] mutableCopy]; 47 // TODO: add support for others response types (different encodings, files) 48 result[@"body"] = EXNullIfNil([[NSString alloc] initWithData:_responseData encoding:NSUTF8StringEncoding]); 49 return result; 50} 51 52@end 53