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