diff --git a/.gitignore b/.gitignore index 6704566..3c904d3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ yarn-debug.log* yarn-error.log* lerna-debug.log* +yarn.lock + # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json diff --git a/demos/with-upload-file.js b/demos/with-upload-file.js new file mode 100644 index 0000000..380fa9f --- /dev/null +++ b/demos/with-upload-file.js @@ -0,0 +1,21 @@ +const multer = require('multer') +const { router, server } = require('0http')({ + server: require('../src/server')() +}) + +const upload = multer({ + storage: multer.diskStorage({ + destination: __dirname, + filename: (req, file, cb) => cb(null, file.originalname) + }) +}) + +router.post('/upload', upload.single('file'), (req, res) => { + if (!req.file) { + res.statusCode = 400 + res.end('Failed to upload') + } + res.end('Success upload ' + req.file.originalname) +}) + +server.listen(3000, () => { }) diff --git a/package.json b/package.json index 5ceda51..eadf48b 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "body-parser": "^1.19.0", "chai": "^4.2.0", "mocha": "^7.2.0", + "multer": "^1.4.2", "nyc": "^15.1.0", "restana": "^4.8.1", "supertest": "^4.0.2" diff --git a/src/server.js b/src/server.js index e3c98dc..104ebe7 100644 --- a/src/server.js +++ b/src/server.js @@ -33,18 +33,21 @@ module.exports = (config = {}) => { const method = reqWrapper.method if (method !== 'HEAD') { // 0http's low checks also that method !== 'GET', but many users would send request body with GET, unfortunately + let buffer res.onData((bytes, isLast) => { - const chunk = Buffer.from(bytes) + if (!bytes.byteLength) return handler(reqWrapper, resWrapper) + let chunk = Buffer.from(bytes) if (isLast) { + if (buffer) chunk = Buffer.concat([buffer, chunk]) reqWrapper.push(chunk) reqWrapper.push(null) if (!res.finished) { return handler(reqWrapper, resWrapper) } - return + } else { + if (buffer) buffer = Buffer.concat([buffer, chunk]) + else buffer = Buffer.concat([chunk]) } - - return reqWrapper.push(chunk) }) } else if (!res.finished) { handler(reqWrapper, resWrapper) @@ -112,7 +115,7 @@ class HttpRequest extends Readable { } _read (size) { - return this.slice(0, size) + return this.slice ? this.slice(0, size) : size } }