Ben Hsieh пре 7 година
родитељ
комит
dbaeef14a3
5 измењених фајлова са 48 додато и 2 уклоњено
  1. 13
    1
      src/index.js
  2. 1
    0
      src/ios/RNFetchBlobConst.h
  3. 2
    1
      src/ios/RNFetchBlobConst.m
  4. 1
    0
      src/ios/RNFetchBlobNetwork.h
  5. 31
    0
      src/ios/RNFetchBlobNetwork.m

+ 13
- 1
src/index.js Прегледај датотеку

116
   // create task ID for receiving progress event
116
   // create task ID for receiving progress event
117
   let taskId = getUUID()
117
   let taskId = getUUID()
118
   let options = this || {}
118
   let options = this || {}
119
-  let subscription, subscriptionUpload, stateEvent
119
+  let subscription, subscriptionUpload, stateEvent, partEvent
120
   let respInfo = {}
120
   let respInfo = {}
121
 
121
 
122
   let promise = new Promise((resolve, reject) => {
122
   let promise = new Promise((resolve, reject) => {
143
       }
143
       }
144
     })
144
     })
145
 
145
 
146
+    partEvent = emitter.addListener('RNFetchBlobServerPush', (e) => {
147
+      if(e.taskId === taskId && promise.onPartData) {
148
+        promise.onPartData(e.chunk)
149
+      }
150
+    })
151
+
146
     // When the request body comes from Blob polyfill, we should use special its ref
152
     // When the request body comes from Blob polyfill, we should use special its ref
147
     // as the request body
153
     // as the request body
148
     if( body instanceof Blob && body.isRNFetchBlobPolyfill) {
154
     if( body instanceof Blob && body.isRNFetchBlobPolyfill) {
168
       subscription.remove()
174
       subscription.remove()
169
       subscriptionUpload.remove()
175
       subscriptionUpload.remove()
170
       stateEvent.remove()
176
       stateEvent.remove()
177
+      partEvent.remove()
171
       delete promise['progress']
178
       delete promise['progress']
172
       delete promise['uploadProgress']
179
       delete promise['uploadProgress']
173
       delete promise['stateChange']
180
       delete promise['stateChange']
181
+      delete promise['part']
174
       delete promise['cancel']
182
       delete promise['cancel']
175
       promise.cancel = () => {}
183
       promise.cancel = () => {}
176
 
184
 
229
     RNFetchBlob.enableUploadProgressReport(taskId, interval, count)
237
     RNFetchBlob.enableUploadProgressReport(taskId, interval, count)
230
     return promise
238
     return promise
231
   }
239
   }
240
+  promise.part = (fn) => {
241
+    promise.onPartData = fn
242
+    return promise
243
+  }
232
   promise.stateChange = (fn) => {
244
   promise.stateChange = (fn) => {
233
     promise.onStateChange = fn
245
     promise.onStateChange = fn
234
     return promise
246
     return promise

+ 1
- 0
src/ios/RNFetchBlobConst.h Прегледај датотеку

18
 extern NSString *const MSG_EVENT_ERROR;
18
 extern NSString *const MSG_EVENT_ERROR;
19
 
19
 
20
 extern NSString *const EVENT_PROGRESS;
20
 extern NSString *const EVENT_PROGRESS;
21
+extern NSString *const EVENT_SERVER_PUSH;
21
 extern NSString *const EVENT_PROGRESS_UPLOAD;
22
 extern NSString *const EVENT_PROGRESS_UPLOAD;
22
 extern NSString *const EVENT_STATE_CHANGE;
23
 extern NSString *const EVENT_STATE_CHANGE;
23
 
24
 

+ 2
- 1
src/ios/RNFetchBlobConst.m Прегледај датотеку

23
 extern NSString *const CONFIG_EXTRA_BLOB_CTYPE = @"binaryContentTypes";
23
 extern NSString *const CONFIG_EXTRA_BLOB_CTYPE = @"binaryContentTypes";
24
 
24
 
25
 extern NSString *const EVENT_STATE_CHANGE = @"RNFetchBlobState";
25
 extern NSString *const EVENT_STATE_CHANGE = @"RNFetchBlobState";
26
+extern NSString *const EVENT_SERVER_PUSH = @"RNFetchBlobServerPush";
26
 extern NSString *const EVENT_PROGRESS = @"RNFetchBlobProgress";
27
 extern NSString *const EVENT_PROGRESS = @"RNFetchBlobProgress";
27
 extern NSString *const EVENT_PROGRESS_UPLOAD = @"RNFetchBlobProgress-upload";
28
 extern NSString *const EVENT_PROGRESS_UPLOAD = @"RNFetchBlobProgress-upload";
28
 
29
 
41
 // response type
42
 // response type
42
 extern NSString *const RESP_TYPE_BASE64 = @"base64";
43
 extern NSString *const RESP_TYPE_BASE64 = @"base64";
43
 extern NSString *const RESP_TYPE_UTF8 = @"utf8";
44
 extern NSString *const RESP_TYPE_UTF8 = @"utf8";
44
-extern NSString *const RESP_TYPE_PATH = @"path";
45
+extern NSString *const RESP_TYPE_PATH = @"path";

+ 1
- 0
src/ios/RNFetchBlobNetwork.h Прегледај датотеку

22
 @property (nullable, nonatomic) NSString * taskId;
22
 @property (nullable, nonatomic) NSString * taskId;
23
 @property (nonatomic) int expectedBytes;
23
 @property (nonatomic) int expectedBytes;
24
 @property (nonatomic) int receivedBytes;
24
 @property (nonatomic) int receivedBytes;
25
+@property (nonatomic) BOOL isServerPush;
25
 @property (nullable, nonatomic) NSMutableData * respData;
26
 @property (nullable, nonatomic) NSMutableData * respData;
26
 @property (strong, nonatomic) RCTResponseSenderBlock callback;
27
 @property (strong, nonatomic) RCTResponseSenderBlock callback;
27
 @property (nullable, nonatomic) RCTBridge * bridge;
28
 @property (nullable, nonatomic) RCTBridge * bridge;

+ 31
- 0
src/ios/RNFetchBlobNetwork.m Прегледај датотеку

38
 @interface RNFetchBlobNetwork ()
38
 @interface RNFetchBlobNetwork ()
39
 {
39
 {
40
     BOOL * respFile;
40
     BOOL * respFile;
41
+    BOOL isNewPart;
42
+    NSMutableData * partBuffer;
41
     NSString * destPath;
43
     NSString * destPath;
42
     NSOutputStream * writeStream;
44
     NSOutputStream * writeStream;
43
     long bodyLength;
45
     long bodyLength;
222
     {
224
     {
223
         NSDictionary *headers = [httpResponse allHeaderFields];
225
         NSDictionary *headers = [httpResponse allHeaderFields];
224
         NSString * respCType = [[RNFetchBlobReqBuilder getHeaderIgnoreCases:@"Content-Type" fromHeaders:headers] lowercaseString];
226
         NSString * respCType = [[RNFetchBlobReqBuilder getHeaderIgnoreCases:@"Content-Type" fromHeaders:headers] lowercaseString];
227
+        if(self.isServerPush == NO)
228
+        {
229
+            self.isServerPush = [[respCType lowercaseString] RNFBContainsString:@"multipart/x-mixed-replace;"];
230
+        }
231
+        if(self.isServerPush)
232
+        {
233
+            if(partBuffer != nil)
234
+            {
235
+                [self.bridge.eventDispatcher
236
+                 sendDeviceEventWithName:EVENT_SERVER_PUSH
237
+                 body:@{
238
+                        @"taskId": taskId,
239
+                        @"chunk": [partBuffer base64EncodedStringWithOptions:0],
240
+                        }
241
+                 ];
242
+            }
243
+            partBuffer = [[NSMutableData alloc] init];
244
+            completionHandler(NSURLSessionResponseAllow);
245
+            return;
246
+        }
225
         if(respCType != nil)
247
         if(respCType != nil)
226
         {
248
         {
227
             NSArray * extraBlobCTypes = [options objectForKey:CONFIG_EXTRA_BLOB_CTYPE];
249
             NSArray * extraBlobCTypes = [options objectForKey:CONFIG_EXTRA_BLOB_CTYPE];
311
     completionHandler(NSURLSessionResponseAllow);
333
     completionHandler(NSURLSessionResponseAllow);
312
 }
334
 }
313
 
335
 
336
+
314
 // download progress handler
337
 // download progress handler
315
 - (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
338
 - (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
316
 {
339
 {
340
+    // For #143 handling multipart/x-mixed-replace response
341
+    if(self.isServerPush)
342
+    {
343
+        [partBuffer appendData:data];
344
+        return ;
345
+    }
346
+    
317
     NSNumber * received = [NSNumber numberWithLong:[data length]];
347
     NSNumber * received = [NSNumber numberWithLong:[data length]];
318
     receivedBytes += [received longValue];
348
     receivedBytes += [received longValue];
319
     if(respFile == NO)
349
     if(respFile == NO)
349
         session = nil;
379
         session = nil;
350
 }
380
 }
351
 
381
 
382
+
352
 - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
383
 - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
353
 {
384
 {
354
 
385