Support non-standard zip mime types in save upload

Browser like Chrome doesn't use the application/zip mime type when
uploading .zip files.  Add support for application/x-zip-compressed to
the save upload endpoint.
This commit is contained in:
Hornwitser committed 2021-06-21 16:59:36 +02:00
1 parent 8dc1415404
commit 5ab4b95e3c
2 files changed
+27 -2

No files matched your search

+7 -2
View File
@@ -259,6 +259,11 @@ async function getStream(req, res) {
}
const zipMimes = [
"application/zip",
"application/x-zip-compressed",
];
async function uploadSave(req, res) {
try {
res.locals.user.checkPermission("core.instance.save.upload");
@@ -319,7 +324,7 @@ async function uploadSave(req, res) {
requestErrors.push("instance_id must come before files uploaded");
}
if (fileMime !== "application/zip") {
if (!zipMimes.includes(fileMime)) {
requestErrors.push("invalid file Content-Type");
}
@@ -350,7 +355,7 @@ async function uploadSave(req, res) {
req.pipe(busboy);
});
} else if (mimeType === "application/zip") {
} else if (zipMimes.includes(mimeType)) {
let filename = req.query.filename;
if (typeof filename !== "string") {
requestErrors.push("Missing or invalid filename parameter");
+20
View File
@@ -325,5 +325,25 @@ describe("master/src/routes", function() {
assert.deepEqual(JSON.parse(response.body), { saves: ["test.zip"] });
assert.equal(response.statusCode, 200);
});
it("should complete a valid transfer with non-standerd mime type", async function() {
master.forwardRequestToInstance = async (request, data) => {
let stream = await phin({
url: `http://localhost:${port}/api/stream/${data.stream_id}`,
});
assert.equal(stream.body.toString(), "totally a zip file");
return { save: data.filename };
};
let response;
response = await phin({
url: `http://localhost:${port}/api/upload-save?instance_id=123&filename=test.zip`, method: "POST",
headers: {
"X-Access-Token": testToken,
"Content-Type": "application/x-zip-compressed",
},
data: "totally a zip file",
});
assert.deepEqual(JSON.parse(response.body), { saves: ["test.zip"] });
assert.equal(response.statusCode, 200);
});
});
});