Quellcode durchsuchen

Merge branch '0.9.5-issue-122' into 0.9.5

Ben Hsieh vor 8 Jahren
Ursprung
Commit
b3b62c1ad3

+ 28
- 3
src/android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java Datei anzeigen

@@ -63,6 +63,12 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
63 63
         FileStorage
64 64
     }
65 65
 
66
+    enum ResponseFormat {
67
+        Auto,
68
+        UTF8,
69
+        BASE64
70
+    }
71
+
66 72
     public static HashMap<String, Call> taskTable = new HashMap<>();
67 73
     static HashMap<String, Boolean> progressReport = new HashMap<>();
68 74
     static HashMap<String, Boolean> uploadProgressReport = new HashMap<>();
@@ -83,8 +89,10 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
83 89
     RNFetchBlobBody requestBody;
84 90
     RequestType requestType;
85 91
     ResponseType responseType;
92
+    ResponseFormat responseFormat = ResponseFormat.Auto;
86 93
     WritableMap respInfo;
87 94
     boolean timeout = false;
95
+
88 96
     ArrayList<String> redirects = new ArrayList<>();
89 97
 
90 98
     public RNFetchBlobReq(ReadableMap options, String taskId, String method, String url, ReadableMap headers, String body, ReadableArray arrayBody, final Callback callback) {
@@ -200,8 +208,16 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
200 208
                 while (it.hasNextKey()) {
201 209
                     String key = it.nextKey();
202 210
                     String value = headers.getString(key);
203
-                    builder.header(key, value);
204
-                    mheaders.put(key,value);
211
+                    if(key.equalsIgnoreCase("RNFB-Response")) {
212
+                        if(value.equalsIgnoreCase("base64"))
213
+                            responseFormat = ResponseFormat.BASE64;
214
+                        else if (value.equalsIgnoreCase("utf8"))
215
+                            responseFormat = ResponseFormat.UTF8;
216
+                    }
217
+                    else {
218
+                        builder.header(key, value);
219
+                        mheaders.put(key, value);
220
+                    }
205 221
                 }
206 222
             }
207 223
 
@@ -437,6 +453,10 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
437 453
                         // string correctly, we should do URL encoding before BASE64.
438 454
                         byte[] b = resp.body().bytes();
439 455
                         CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
456
+                        if(responseFormat == ResponseFormat.BASE64) {
457
+                            callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_BASE64, android.util.Base64.encodeToString(b, Base64.NO_WRAP));
458
+                            return;
459
+                        }
440 460
                         try {
441 461
                             encoder.encode(ByteBuffer.wrap(b).asCharBuffer());
442 462
                             // if the data contains invalid characters the following lines will be
@@ -447,7 +467,12 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
447 467
                         // This usually mean the data is contains invalid unicode characters, it's
448 468
                         // binary data
449 469
                         catch(CharacterCodingException ignored) {
450
-                            callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_BASE64, android.util.Base64.encodeToString(b, Base64.NO_WRAP));
470
+                            if(responseFormat == ResponseFormat.UTF8) {
471
+                                callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_UTF8, "");
472
+                            }
473
+                            else {
474
+                                callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_BASE64, android.util.Base64.encodeToString(b, Base64.NO_WRAP));
475
+                            }
451 476
                         }
452 477
                     }
453 478
                 } catch (IOException e) {

+ 33
- 5
src/ios/RNFetchBlobNetwork.m Datei anzeigen

@@ -27,6 +27,12 @@ NSMapTable * taskTable;
27 27
 NSMutableDictionary * progressTable;
28 28
 NSMutableDictionary * uploadProgressTable;
29 29
 
30
+typedef NS_ENUM(NSUInteger, ResponseFormat) {
31
+    UTF8,
32
+    BASE64,
33
+    AUTO
34
+};
35
+
30 36
 
31 37
 @interface RNFetchBlobNetwork ()
32 38
 {
@@ -37,6 +43,7 @@ NSMutableDictionary * uploadProgressTable;
37 43
     NSMutableDictionary * respInfo;
38 44
     NSInteger respStatus;
39 45
     NSMutableArray * redirects;
46
+    ResponseFormat responseFormat;
40 47
 }
41 48
 
42 49
 @end
@@ -128,6 +135,15 @@ NSOperationQueue *taskQueue;
128 135
     self.options = options;
129 136
     redirects = [[NSMutableArray alloc] init];
130 137
     [redirects addObject:req.URL.absoluteString];
138
+    
139
+    // set response format
140
+    NSString * rnfbResp = [req.allHTTPHeaderFields valueForKey:@"RNFB-Response"];
141
+    if([[rnfbResp lowercaseString] isEqualToString:@"base64"])
142
+        responseFormat = BASE64;
143
+    else if([[rnfbResp lowercaseString] isEqualToString:@"utf8"])
144
+        responseFormat = UTF8;
145
+    else
146
+        responseFormat = AUTO;
131 147
 
132 148
     NSString * path = [self.options valueForKey:CONFIG_FILE_PATH];
133 149
     NSString * ext = [self.options valueForKey:CONFIG_FILE_EXT];
@@ -357,18 +373,30 @@ NSOperationQueue *taskQueue;
357 373
             // if it turns out not to be `nil` that means the response data contains valid UTF8 string,
358 374
             // in order to properly encode the UTF8 string, use URL encoding before BASE64 encoding.
359 375
             NSString * utf8 = [[NSString alloc] initWithData:respData encoding:NSUTF8StringEncoding];
360
-
361
-            if(utf8 != nil)
376
+            
377
+            if(responseFormat == BASE64)
378
+            {
379
+                rnfbRespType = RESP_TYPE_BASE64;
380
+                respStr = [respData base64EncodedStringWithOptions:0];
381
+            }
382
+            else if (responseFormat == UTF8)
362 383
             {
363 384
                 rnfbRespType = RESP_TYPE_UTF8;
364 385
                 respStr = utf8;
365 386
             }
366 387
             else
367 388
             {
368
-                rnfbRespType = RESP_TYPE_BASE64;
369
-                respStr = [respData base64EncodedStringWithOptions:0];
389
+                if(utf8 != nil)
390
+                {
391
+                    rnfbRespType = RESP_TYPE_UTF8;
392
+                    respStr = utf8;
393
+                }
394
+                else
395
+                {
396
+                    rnfbRespType = RESP_TYPE_BASE64;
397
+                    respStr = [respData base64EncodedStringWithOptions:0];
398
+                }
370 399
             }
371
-
372 400
         }
373 401
     }
374 402