diff --git a/CHANGELOG.md b/CHANGELOG.md index 14c3d2d..51e30ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.0-alpha.7 (WIP) + +* End requests with an error when parsing posted body contents fail + ## 1.4.0-alpha.6 (2024-09-11) * Don't flatten objects when updating records, it causes too many issues diff --git a/lib/core/alchemy.js b/lib/core/alchemy.js index 3b371f4..7ca43c4 100644 --- a/lib/core/alchemy.js +++ b/lib/core/alchemy.js @@ -1750,7 +1750,7 @@ Alchemy.setMethod(function addAppcacheEntry(entry) { * * @author Jelle De Loecker * @since 1.1.0 - * @version 1.3.18 + * @version 1.4.0 * * @param {IncomingMessage} req * @param {OutgoingMessage} res Optional @@ -1787,14 +1787,24 @@ Alchemy.setMethod(function parseRequestBody(req, res, callback) { form.parse(req, function parsedMultipart(err, form_fields, form_files) { - var fields = {}, - files = {}, - key; + if (err) { - if (err && req.conduit && req.conduit.aborted) { - return callback(null); + // Ignore the error if the request was already aborted + if (conduit?.aborted) { + return callback(null); + } + + if (conduit) { + return conduit.error(err); + } + + return callback(err); } + let fields = {}, + files = {}, + key; + // Since formidable v3, all the fields are now arrays. // We already had a lot of logic to deal with this, // so we just have to un-array everything @@ -1811,18 +1821,12 @@ Alchemy.setMethod(function parseRequestBody(req, res, callback) { Object.setFormPath(files, key, form_files[key]); } - if (err) { - log.error('Error parsing multipart POST', {err: err}); - req.body = {}; - req.files = {}; - } else { - req.body = fields; - req.files = files; + req.body = fields; + req.files = files; - if (conduit) { - conduit.setRequestBody(fields); - conduit.setRequestFiles(files); - } + if (conduit) { + conduit.setRequestBody(fields); + conduit.setRequestFiles(files); } callback(null, fields); @@ -1836,22 +1840,27 @@ Alchemy.setMethod(function parseRequestBody(req, res, callback) { this.url_form_body(req, res, function parsedBody(err) { - if (err && req.conduit && req.conduit.aborted) { - return callback(null); + if (err) { + + // Ignore the error if the request was already aborted + if (conduit?.aborted) { + return callback(null); + } + + if (conduit) { + return conduit.error(err); + } + + return callback(err); } // You can't send files using a regular post req.files = {}; - if (err) { - log.error('Error parsing x-www-form-urlencoded body data', {err: err}); - req.body = {}; - } else { - req.body = req.body; + req.body = req.body; - if (conduit) { - conduit.setRequestBody(req.body); - } + if (conduit) { + conduit.setRequestBody(req.body); } callback(null, req.body); @@ -1861,25 +1870,30 @@ Alchemy.setMethod(function parseRequestBody(req, res, callback) { } // Any other encoded data (like JSON) - this.any_body(req, function parsedBody(err, body) { + this.any_body(req, res, function parsedBody(err, body) { function handleResponse(err, body) { - if (err && req.conduit && req.conduit.aborted) { - return callback(null); + + if (err) { + + // Ignore the error if the request was already aborted + if (conduit?.aborted) { + return callback(null); + } + + if (conduit) { + return conduit.error(err); + } + + return callback(err); } - + // You can't send files using a regular post req.files = {}; + req.body = body; - if (err) { - log.error('Error parsing body data', {err: err}); - req.body = {}; - } else { - req.body = body; - - if (conduit) { - conduit.setRequestBody(body); - } + if (conduit) { + conduit.setRequestBody(body); } callback(null, req.body); diff --git a/package.json b/package.json index 02b8388..ea950be 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "alchemymvc", "description": "MVC framework for Node.js", - "version": "1.4.0-alpha.6", + "version": "1.4.0-alpha.7", "author": "Jelle De Loecker ", "keywords": [ "alchemy",