|
36 | 36 | import java.net.SocketException;
|
37 | 37 | import java.net.SocketTimeoutException;
|
38 | 38 | import java.net.URL;
|
| 39 | +import java.nio.ByteBuffer; |
| 40 | +import java.nio.charset.CharacterCodingException; |
| 41 | +import java.nio.charset.Charset; |
| 42 | +import java.nio.charset.CharsetEncoder; |
39 | 43 | import java.security.KeyStore;
|
40 | 44 | import java.util.ArrayList;
|
41 | 45 | import java.util.Arrays;
|
@@ -498,12 +502,28 @@ private void done(Response resp) {
|
498 | 502 | // encoding will somehow break the UTF8 string format, to encode UTF8
|
499 | 503 | // string correctly, we should do URL encoding before BASE64.
|
500 | 504 | byte[] b = resp.body().bytes();
|
| 505 | + CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); |
501 | 506 | if(responseFormat == ResponseFormat.BASE64) {
|
502 | 507 | callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_BASE64, android.util.Base64.encodeToString(b, Base64.NO_WRAP));
|
503 | 508 | return;
|
504 | 509 | }
|
505 |
| - String utf8 = new String(b); |
506 |
| - callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_UTF8, utf8); |
| 510 | + try { |
| 511 | + encoder.encode(ByteBuffer.wrap(b).asCharBuffer()); |
| 512 | + // if the data contains invalid characters the following lines will be |
| 513 | + // skipped. |
| 514 | + String utf8 = new String(b); |
| 515 | + callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_UTF8, utf8); |
| 516 | + } |
| 517 | + // This usually mean the data is contains invalid unicode characters, it's |
| 518 | + // binary data |
| 519 | + catch(CharacterCodingException ignored) { |
| 520 | + if(responseFormat == ResponseFormat.UTF8) { |
| 521 | + callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_UTF8, ""); |
| 522 | + } |
| 523 | + else { |
| 524 | + callback.invoke(null, RNFetchBlobConst.RNFB_RESPONSE_BASE64, android.util.Base64.encodeToString(b, Base64.NO_WRAP)); |
| 525 | + } |
| 526 | + } |
507 | 527 | }
|
508 | 528 | } catch (IOException e) {
|
509 | 529 | callback.invoke("RNFetchBlob failed to encode response data to BASE64 string.", null);
|
|
0 commit comments