/**
* Return all body data from a request.
* @param {http.ClientRequest} req
+ * @param {Number=} maximumBodySize
*/
- async bodyData(req) {
+ async bodyData(req, maximumBodySize) {
const _scope = _fileScope('bodyData');
return new Promise((resolve, reject) => {
const body = [];
- req.on('data', (chunk) => body.push(chunk));
+ let length = 0;
+ req.on('data', (chunk) => {
+ body.push(chunk);
+ length += Buffer.byteLength(chunk);
+ if (maximumBodySize && length > maximumBodySize) {
+ this.logger.debug(_scope, 'body data exceeded limit', { length, maximumBodySize });
+ reject(new ResponseError(Enum.ErrorResponse.RequestEntityTooLarge));
+ }
+ });
req.on('end', () => resolve(Buffer.concat(body).toString()));
req.on('error', (e) => {
this.logger.error(_scope, 'failed', { error: e });
statusCode: 410,
errorMessage: 'Gone',
},
+ RequestEntityTooLarge: {
+ statusCode: 413,
+ errorMessage: 'Request Entity Too Large',
+ },
UnsupportedMediaType: {
statusCode: 415,
errorMessage: 'Unsupported Media Type',
assert.strictEqual(e, 'foo');
}
});
+ it('limits size', async function () {
+ const p = dingus.bodyData(res, 8);
+ resEvents['data'](Buffer.from('foobar'));
+ resEvents['data'](Buffer.from('bazquux'));
+ try {
+ await p;
+ assert.fail(noExpectedException);
+ } catch (e) {
+ assert.strictEqual(e.statusCode, 413);
+ }
+ });
}); // bodyData
describe('ingestBody', function () {