Fix FormidableHandler so it detects filetype based on extension if type is unknown or application octet-stream.
All checks were successful
continuous-integration/appveyor/branch AppVeyor build succeeded

This commit is contained in:
Jonatan Nilsson 2022-08-10 14:13:14 +00:00
parent 5f916e97ea
commit 8a56969015
5 changed files with 67 additions and 5 deletions

View file

@ -272,6 +272,10 @@ export function FormidableHandler(formidable, org = {}) {
return rename(ctx.req.files[key].path, target) return rename(ctx.req.files[key].path, target)
.then(function() { .then(function() {
if (!ctx.req.files[key].type || ctx.req.files[key].type === 'application/octet-stream') {
let found = MimeTypeDb[path.extname(filename).slice(1)]
ctx.req.files[key].type = found && found[0] || 'application/octet-stream'
}
ctx.req.files[key].path = target ctx.req.files[key].path = target
ctx.req.files[key].filename = filename ctx.req.files[key].filename = filename
}) })

View file

@ -1,6 +1,6 @@
{ {
"name": "flaska", "name": "flaska",
"version": "1.3.0", "version": "1.3.1",
"description": "Flaska is a micro web-framework for node. It is designed to be fast, simple and lightweight, and is distributed as a single file module with no dependencies.", "description": "Flaska is a micro web-framework for node. It is designed to be fast, simple and lightweight, and is distributed as a single file module with no dependencies.",
"main": "flaska.mjs", "main": "flaska.mjs",
"scripts": { "scripts": {

View file

@ -126,7 +126,7 @@ const random = (length = 8) => {
return str; return str;
} }
Client.prototype.upload = function(url, files, method = 'POST', body = {}) { Client.prototype.upload = function(url, files, method = 'POST', body = {}, overrideType = null) {
const boundary = `---------${random(32)}` const boundary = `---------${random(32)}`
const crlf = '\r\n' const crlf = '\r\n'
let upload = files let upload = files
@ -145,8 +145,11 @@ Client.prototype.upload = function(url, files, method = 'POST', body = {}) {
const filename = path.basename(file) const filename = path.basename(file)
uploadBody.push(Buffer.from( uploadBody.push(Buffer.from(
`${crlf}--${boundary}${crlf}` + `${crlf}--${boundary}${crlf}`
`Content-Disposition: form-data; name="${key}"; filename="${filename}"` + crlf + crlf + `Content-Disposition: form-data; name="${key}"; filename="${filename}"`
+ (overrideType ? crlf + `Content-Type: ${overrideType}`: '')
+ crlf
+ crlf
)) ))
uploadBody.push(data) uploadBody.push(data)
}) })

View file

@ -301,7 +301,7 @@ t.describe('/filehandle', function() {
}) })
}) })
t.describe('/file/upload', function() { t.only().describe('/file/upload', function() {
t.test('server should upload file', async function() { t.test('server should upload file', async function() {
let res = await client.upload('/file/upload', './test/test.png') let res = await client.upload('/file/upload', './test/test.png')
@ -312,6 +312,61 @@ t.describe('/file/upload', function() {
assert.strictEqual(statSource.size, statTarget.size) assert.strictEqual(statSource.size, statTarget.size)
assert.strictEqual(statSource.size, res.size) assert.strictEqual(statSource.size, res.size)
assert.strictEqual(res.type, 'image/png')
})
t.test('server should have correct type', async function() {
let res = await client.upload('/file/upload', './test/test.jpg')
let [statSource, statTarget] = await Promise.all([
fs.stat('./test/test.jpg'),
fs.stat(res.path),
])
assert.strictEqual(statSource.size, statTarget.size)
assert.strictEqual(statSource.size, res.size)
assert.strictEqual(res.type, 'image/jpeg')
})
t.test('server should use type from user', async function() {
const assertType = 'some/test/here'
let res = await client.upload('/file/upload', './test/test.jpg', 'POST', {}, assertType)
let [statSource, statTarget] = await Promise.all([
fs.stat('./test/test.jpg'),
fs.stat(res.path),
])
assert.strictEqual(statSource.size, statTarget.size)
assert.strictEqual(statSource.size, res.size)
assert.strictEqual(res.type, assertType)
})
t.test('server should attempt to correct type if type is application/octet-stream', async function() {
const assertNotType = 'application/octet-stream'
let res = await client.upload('/file/upload', './test/test.jpg', 'POST', {}, assertNotType)
let [statSource, statTarget] = await Promise.all([
fs.stat('./test/test.jpg'),
fs.stat(res.path),
])
assert.strictEqual(statSource.size, statTarget.size)
assert.strictEqual(statSource.size, res.size)
assert.notStrictEqual(res.type, assertNotType)
assert.strictEqual(res.type, 'image/jpeg')
})
t.test('server fall back to type application/octet-stream if unknown', async function() {
let res = await client.upload('/file/upload', './test/test.gibberish')
let [statSource, statTarget] = await Promise.all([
fs.stat('./test/test.gibberish'),
fs.stat(res.path),
])
assert.strictEqual(statSource.size, statTarget.size)
assert.strictEqual(statSource.size, res.size)
assert.strictEqual(res.type, 'application/octet-stream')
res = await client.upload('/file/upload', './test/test.gibberish', 'POST', {}, 'application/octet-stream')
assert.strictEqual(res.type, 'application/octet-stream')
}) })
}) })

BIN
test/test.gibberish Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB