@@ -6,7 +6,8 @@ import Blob from './Blob'
6
6
7
7
const log = new Log ( 'FetchPolyfill' )
8
8
9
- log . level ( 3 )
9
+ // log.level(3)
10
+ log . disable ( )
10
11
11
12
export default class Fetch {
12
13
@@ -20,16 +21,41 @@ class RNFetchBlobFetchPolyfill {
20
21
21
22
constructor ( config :RNFetchBlobConfig ) {
22
23
this . build = ( ) => ( url , options = { } ) => {
24
+
25
+ let body = options . body
26
+ let promise = null
27
+ let blobCache = null
28
+
23
29
options . headers = options . headers || { }
24
30
options [ 'Content-Type' ] = options . headers [ 'Content-Type' ] || options . headers [ 'content-type' ]
25
31
options [ 'content-type' ] = options . headers [ 'Content-Type' ] || options . headers [ 'content-type' ]
26
- return RNFetchBlob . config ( config )
27
- . fetch ( options . method , url , options . headers , options . body )
28
- . then ( ( resp ) => {
29
- log . verbose ( 'response' , resp )
30
- let info = resp . info ( )
31
- return Promise . resolve ( new RNFetchBlobFetchRepsonse ( resp ) )
32
+
33
+ // When the request body is an instance of FormData, create a Blob cache
34
+ // to upload the body.
35
+ if ( body instanceof FormData ) {
36
+ promise = Blob . build ( body ) . then ( ( b ) => {
37
+ blobCache = b
38
+ return Promise . resolve ( b . getRNFetchBlobRef ( ) )
32
39
} )
40
+ }
41
+ // When request body is a Blob, use file URI of the Blob as request body.
42
+ else if ( body instanceof Blob )
43
+ promise = Promise . resolve ( RNFetchBlob . wrap ( body . getRNFetchBlobRef ( ) ) )
44
+ // send it as-is, leave the native module decide how to send the body.
45
+ else
46
+ promise = Promise . resolve ( body )
47
+
48
+ return promise
49
+ . then ( ( body ) => RNFetchBlob . config ( config )
50
+ . fetch ( options . method , url , options . headers , options . body ) )
51
+ . then ( ( resp ) => {
52
+ log . verbose ( 'response' , resp )
53
+ // release blob cache created when sending request
54
+ if ( blobCache !== null && blobCache instanceof Blob )
55
+ blobCache . close ( )
56
+ let info = resp . info ( )
57
+ return Promise . resolve ( new RNFetchBlobFetchRepsonse ( resp ) )
58
+ } )
33
59
}
34
60
}
35
61
@@ -75,7 +101,12 @@ class RNFetchBlobFetchRepsonse {
75
101
}
76
102
}
77
103
78
-
104
+ /**
105
+ * Get response data as string.
106
+ * @param {FetchBlobResponse } resp Response data object from RNFB fetch call.
107
+ * @param {RNFetchBlobResponseInfo } info Response informations.
108
+ * @return {Promise<string> }
109
+ */
79
110
function readText ( resp , info ) :Promise < string > {
80
111
switch ( info . rnfbEncode ) {
81
112
case 'base64' :
@@ -93,7 +124,14 @@ function readText(resp, info):Promise<string> {
93
124
}
94
125
}
95
126
96
- function readBlob ( resp , info ) :Promise < object > {
127
+
128
+ /**
129
+ * Get response data as RNFetchBlob Blob polyfill object.
130
+ * @param {FetchBlobResponse } resp Response data object from RNFB fetch call.
131
+ * @param {RNFetchBlobResponseInfo } info Response informations.
132
+ * @return {Promise<Blob> }
133
+ */
134
+ function readBlob ( resp , info ) :Promise < Blob > {
97
135
log . verbose ( 'readBlob' , resp , info )
98
136
let cType = info . headers [ 'Content-Type' ]
99
137
switch ( info . rnfbEncode ) {
@@ -106,6 +144,12 @@ function readBlob(resp, info):Promise<object> {
106
144
}
107
145
}
108
146
147
+ /**
148
+ * Get response data as JSON object.
149
+ * @param {FetchBlobResponse } resp Response data object from RNFB fetch call.
150
+ * @param {RNFetchBlobResponseInfo } info Response informations.
151
+ * @return {Promise<object> }
152
+ */
109
153
function readJSON ( resp , info ) :Promise < object > {
110
154
log . verbose ( 'readJSON' , resp , info )
111
155
switch ( info . rnfbEncode ) {
0 commit comments