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
All checks were successful
continuous-integration/appveyor/branch AppVeyor build succeeded
This commit is contained in:
parent
5f916e97ea
commit
8a56969015
5 changed files with 67 additions and 5 deletions
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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)
|
||||||
})
|
})
|
||||||
|
|
|
@ -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
BIN
test/test.gibberish
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
Loading…
Reference in a new issue