diff --git a/lib/types/multipart.js b/lib/types/multipart.js index b6d8e8b..6390518 100644 --- a/lib/types/multipart.js +++ b/lib/types/multipart.js @@ -12,7 +12,8 @@ var Dicer = require('dicer'); var parseParams = require('../utils').parseParams, decodeText = require('../utils').decodeText, - basename = require('../utils').basename; + basename = require('../utils').basename, + getLimit = require('../utils').getLimit; var RE_BOUNDARY = /^boundary$/i, RE_FIELD = /^form-data$/i, @@ -57,21 +58,11 @@ function Multipart(boy, cfg) { if (typeof boundary !== 'string') throw new Error('Multipart: Boundary not found'); - var fieldSizeLimit = (limits && typeof limits.fieldSize === 'number' - ? limits.fieldSize - : 1 * 1024 * 1024), - fileSizeLimit = (limits && typeof limits.fileSize === 'number' - ? limits.fileSize - : Infinity), - filesLimit = (limits && typeof limits.files === 'number' - ? limits.files - : Infinity), - fieldsLimit = (limits && typeof limits.fields === 'number' - ? limits.fields - : Infinity), - partsLimit = (limits && typeof limits.parts === 'number' - ? limits.parts - : Infinity); + var fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024), + fileSizeLimit = getLimit(limits, 'fileSize', Infinity), + filesLimit = getLimit(limits, 'files', Infinity), + fieldsLimit = getLimit(limits, 'fields', Infinity), + partsLimit = getLimit(limits, 'parts', Infinity); var nfiles = 0, nfields = 0, diff --git a/lib/types/urlencoded.js b/lib/types/urlencoded.js index 361c804..0f61330 100644 --- a/lib/types/urlencoded.js +++ b/lib/types/urlencoded.js @@ -1,5 +1,6 @@ var Decoder = require('../utils').Decoder, - decodeText = require('../utils').decodeText; + decodeText = require('../utils').decodeText, + getLimit = require('../utils').getLimit; var RE_CHARSET = /^charset$/i; @@ -12,15 +13,9 @@ function UrlEncoded(boy, cfg) { parsedConType = cfg.parsedConType; this.boy = boy; - this.fieldSizeLimit = (limits && typeof limits.fieldSize === 'number' - ? limits.fieldSize - : 1 * 1024 * 1024); - this.fieldNameSizeLimit = (limits && typeof limits.fieldNameSize === 'number' - ? limits.fieldNameSize - : 100); - this.fieldsLimit = (limits && typeof limits.fields === 'number' - ? limits.fields - : Infinity); + this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024); + this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100); + this.fieldsLimit = getLimit(limits, 'fields', Infinity); var charset; for (var i = 0, len = parsedConType.length; i < len; ++i) { diff --git a/lib/utils.js b/lib/utils.js index 57d745f..c2a0f9d 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -170,3 +170,22 @@ function basename(path) { return (path === '..' || path === '.' ? '' : path); } exports.basename = basename; + + +function getLimit(limits, name, defaultLimit) { + if (!limits) + return defaultLimit; + + var limit = limits[name]; + // Intentional double equals + if (limit == undefined) + return defaultLimit; + + // Ensure limit is a number and is not NaN + if (typeof limit !== 'number' || limit !== limit) { + throw new Error('Limit ' + name + ' is not a valid number'); + } + + return limit; +} +exports.getLimit = getLimit; diff --git a/test/test-utils-get-limit.js b/test/test-utils-get-limit.js new file mode 100644 index 0000000..2d1c7fe --- /dev/null +++ b/test/test-utils-get-limit.js @@ -0,0 +1,22 @@ +var getLimit = require('../lib/utils').getLimit; + +var assert = require('assert'); + +assert.strictEqual(getLimit(undefined, 'fieldSize', 1), 1); +assert.strictEqual(getLimit(undefined, 'fileSize', Infinity), Infinity); + +assert.strictEqual(getLimit({}, 'fieldSize', 1), 1); +assert.strictEqual(getLimit({}, 'fileSize', Infinity), Infinity); +assert.strictEqual(getLimit({ fieldSize: null }, 'fieldSize', 1), 1); +assert.strictEqual(getLimit({ fileSize: null }, 'fileSize', Infinity), Infinity); + +assert.strictEqual(getLimit({ fieldSize: 0 }, 'fieldSize', 1), 0); +assert.strictEqual(getLimit({ fileSize: 2 }, 'fileSize', 1), 2); + +assert.throws(function() { + getLimit({ fieldSize: '1' }, 'fieldSize', 1); +}, /^Error: Limit fieldSize is not a valid number$/); + +assert.throws(function() { + getLimit({ fieldSize: NaN }, 'fieldSize', 1); +}, /^Error: Limit fieldSize is not a valid number$/);