From dc4357d31515f533899ac102fe2b7d537c0d04a6 Mon Sep 17 00:00:00 2001 From: herudi Date: Thu, 27 May 2021 11:00:35 +0700 Subject: [PATCH 1/2] fix upload file --- .gitignore | 2 ++ demos/with-upload-file.js | 21 +++++++++++++++++++++ package.json | 1 + src/server.js | 12 ++++++++---- 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 demos/with-upload-file.js 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..cc3e5aa --- /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..66e3016 100644 --- a/src/server.js +++ b/src/server.js @@ -33,18 +33,22 @@ 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 +116,7 @@ class HttpRequest extends Readable { } _read (size) { - return this.slice(0, size) + return this.slice ? this.slice(0, size) : size } } From f4708e1fcb1f1b384e3ca21891f35940df53618f Mon Sep 17 00:00:00 2001 From: herudi Date: Thu, 27 May 2021 17:43:24 +0700 Subject: [PATCH 2/2] standard --fix --- demos/with-upload-file.js | 28 ++++++++++++++-------------- src/server.js | 3 +-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/demos/with-upload-file.js b/demos/with-upload-file.js index cc3e5aa..380fa9f 100644 --- a/demos/with-upload-file.js +++ b/demos/with-upload-file.js @@ -1,21 +1,21 @@ -const multer = require('multer'); +const multer = require('multer') const { router, server } = require('0http')({ - server: require('../src/server')() -}); + server: require('../src/server')() +}) -const upload = multer({ - storage: multer.diskStorage({ - destination: __dirname, - filename: (req, file, cb) => cb(null, file.originalname) - }) -}); +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); + if (!req.file) { + res.statusCode = 400 + res.end('Failed to upload') + } + res.end('Success upload ' + req.file.originalname) }) server.listen(3000, () => { }) diff --git a/src/server.js b/src/server.js index 66e3016..104ebe7 100644 --- a/src/server.js +++ b/src/server.js @@ -33,7 +33,7 @@ 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; + let buffer res.onData((bytes, isLast) => { if (!bytes.byteLength) return handler(reqWrapper, resWrapper) let chunk = Buffer.from(bytes) @@ -44,7 +44,6 @@ module.exports = (config = {}) => { if (!res.finished) { return handler(reqWrapper, resWrapper) } - return } else { if (buffer) buffer = Buffer.concat([buffer, chunk]) else buffer = Buffer.concat([chunk])