Skip to content

Commit 78db1dc

Browse files
committed
fix silkimen#296: [Bug] [browser] multipart requests are not serialized correctly
1 parent aded59e commit 78db1dc

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

src/browser/cordova-http-plugin.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,39 @@ function serializeParams(params) {
3737
}).join('&');
3838
}
3939

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+
4073
function deserializeResponseHeaders(headers) {
4174
var headerMap = {};
4275
var arr = headers.trim().split(/[\r\n]+/);
@@ -161,6 +194,18 @@ function sendRequest(method, withData, opts, success, failure) {
161194
processedData = serializeParams(data);
162195
break;
163196

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+
164209
case 'raw':
165210
setDefaultContentType(headers, 'application/octet-stream');
166211
processedData = data;

0 commit comments

Comments
 (0)