diff --git a/packages/master/src/routes.js b/packages/master/src/routes.js index 0843f79a..b6d7f741 100644 --- a/packages/master/src/routes.js +++ b/packages/master/src/routes.js @@ -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"); diff --git a/test/master/routes.js b/test/master/routes.js index 7037be75..cca2c3b7 100644 --- a/test/master/routes.js +++ b/test/master/routes.js @@ -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); + }); }); });