@@ -37,6 +37,39 @@ function serializeParams(params) {
37
37
} ) . join ( '&' ) ;
38
38
}
39
39
40
+ function decodeB64 ( dataString ) {
41
+ var binarString = atob ( dataString ) ;
42
+ var bytes = new Uint8Array ( binarString . length ) ;
43
+
44
+ for ( var i = 0 ; i < binarString . length ; ++ i ) {
45
+ bytes [ i ] = binarString . charCodeAt ( i ) ;
46
+ }
47
+
48
+ return bytes . buffer ;
49
+ }
50
+
51
+ function processMultipartData ( data ) {
52
+ if ( ! data ) return null ;
53
+
54
+ var fd = new FormData ( ) ;
55
+
56
+ for ( var i = 0 ; i < data . buffers . length ; ++ i ) {
57
+ var buffer = data . buffers [ i ] ;
58
+ var name = data . names [ i ] ;
59
+ var fileName = data . fileNames [ i ] ;
60
+ var type = data . types [ i ] ;
61
+
62
+ if ( fileName ) {
63
+ fd . append ( name , new Blob ( [ decodeB64 ( buffer ) ] , { type : type } ) , fileName ) ;
64
+ } else {
65
+ // we assume it's plain text if no filename was given
66
+ fd . append ( name , atob ( buffer ) ) ;
67
+ }
68
+ }
69
+
70
+ return fd ;
71
+ }
72
+
40
73
function deserializeResponseHeaders ( headers ) {
41
74
var headerMap = { } ;
42
75
var arr = headers . trim ( ) . split ( / [ \r \n ] + / ) ;
@@ -161,6 +194,18 @@ function sendRequest(method, withData, opts, success, failure) {
161
194
processedData = serializeParams ( data ) ;
162
195
break ;
163
196
197
+ case 'multipart' :
198
+ const contentType = getHeaderValue ( headers , 'Content-Type' ) ;
199
+
200
+ // intentionally don't set a default content type
201
+ // it's set by the browser together with the content disposition string
202
+ if ( contentType ) {
203
+ headers [ 'Content-Type' ] = contentType ;
204
+ }
205
+
206
+ processedData = processMultipartData ( data ) ;
207
+ break ;
208
+
164
209
case 'raw' :
165
210
setDefaultContentType ( headers , 'application/octet-stream' ) ;
166
211
processedData = data ;
0 commit comments