fix #296: [Bug] [browser] multipart requests are not serialized correctly

This commit is contained in:
Sefa Ilkimen 2020-01-27 01:29:04 +01:00
parent aded59e3d1
commit 78db1dc516
No known key found for this signature in database
GPG Key ID: 4AB0B60A9B5E59F5

View File

@ -37,6 +37,39 @@ function serializeParams(params) {
}).join('&'); }).join('&');
} }
function decodeB64(dataString) {
var binarString = atob(dataString);
var bytes = new Uint8Array(binarString.length);
for (var i = 0; i < binarString.length; ++i) {
bytes[i] = binarString.charCodeAt(i);
}
return bytes.buffer;
}
function processMultipartData(data) {
if (!data) return null;
var fd = new FormData();
for (var i = 0; i < data.buffers.length; ++i) {
var buffer = data.buffers[i];
var name = data.names[i];
var fileName = data.fileNames[i];
var type = data.types[i];
if (fileName) {
fd.append(name, new Blob([decodeB64(buffer)], {type: type}), fileName);
} else {
// we assume it's plain text if no filename was given
fd.append(name, atob(buffer));
}
}
return fd;
}
function deserializeResponseHeaders(headers) { function deserializeResponseHeaders(headers) {
var headerMap = {}; var headerMap = {};
var arr = headers.trim().split(/[\r\n]+/); var arr = headers.trim().split(/[\r\n]+/);
@ -161,6 +194,18 @@ function sendRequest(method, withData, opts, success, failure) {
processedData = serializeParams(data); processedData = serializeParams(data);
break; break;
case 'multipart':
const contentType = getHeaderValue(headers, 'Content-Type');
// intentionally don't set a default content type
// it's set by the browser together with the content disposition string
if (contentType) {
headers['Content-Type'] = contentType;
}
processedData = processMultipartData(data);
break;
case 'raw': case 'raw':
setDefaultContentType(headers, 'application/octet-stream'); setDefaultContentType(headers, 'application/octet-stream');
processedData = data; processedData = data;