123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- 'use strict';
- function createMultipartBuffers(boundary, sizes) {
- const bufs = [];
- for (let i = 0; i < sizes.length; ++i) {
- const mb = sizes[i] * 1024 * 1024;
- bufs.push(Buffer.from([
- `--${boundary}`,
- `content-disposition: form-data; name="field${i + 1}"`,
- '',
- '0'.repeat(mb),
- '',
- ].join('\r\n')));
- }
- bufs.push(Buffer.from([
- `--${boundary}--`,
- '',
- ].join('\r\n')));
- return bufs;
- }
- const boundary = '-----------------------------168072824752491622650073';
- const buffers = createMultipartBuffers(boundary, (new Array(100)).fill(1));
- const calls = {
- partBegin: 0,
- headerField: 0,
- headerValue: 0,
- headerEnd: 0,
- headersEnd: 0,
- partData: 0,
- partEnd: 0,
- end: 0,
- };
- const moduleName = process.argv[2];
- switch (moduleName) {
- case 'busboy': {
- const busboy = require('busboy');
- const parser = busboy({
- limits: {
- fieldSizeLimit: Infinity,
- },
- headers: {
- 'content-type': `multipart/form-data; boundary=${boundary}`,
- },
- });
- parser.on('field', (name, val, info) => {
- ++calls.partBegin;
- ++calls.partData;
- ++calls.partEnd;
- }).on('close', () => {
- ++calls.end;
- console.timeEnd(moduleName);
- });
- console.time(moduleName);
- for (const buf of buffers)
- parser.write(buf);
- break;
- }
- case 'formidable': {
- const { MultipartParser } = require('formidable');
- const parser = new MultipartParser();
- parser.initWithBoundary(boundary);
- parser.on('data', ({ name }) => {
- ++calls[name];
- if (name === 'end')
- console.timeEnd(moduleName);
- });
- console.time(moduleName);
- for (const buf of buffers)
- parser.write(buf);
- break;
- }
- case 'multiparty': {
- const { Readable } = require('stream');
- const { Form } = require('multiparty');
- const form = new Form({
- maxFieldsSize: Infinity,
- maxFields: Infinity,
- maxFilesSize: Infinity,
- autoFields: false,
- autoFiles: false,
- });
- const req = new Readable({ read: () => {} });
- req.headers = {
- 'content-type': `multipart/form-data; boundary=${boundary}`,
- };
- function hijack(name, fn) {
- const oldFn = form[name];
- form[name] = function() {
- fn();
- return oldFn.apply(this, arguments);
- };
- }
- hijack('onParseHeaderField', () => {
- ++calls.headerField;
- });
- hijack('onParseHeaderValue', () => {
- ++calls.headerValue;
- });
- hijack('onParsePartBegin', () => {
- ++calls.partBegin;
- });
- hijack('onParsePartData', () => {
- ++calls.partData;
- });
- hijack('onParsePartEnd', () => {
- ++calls.partEnd;
- });
- form.on('close', () => {
- ++calls.end;
- console.timeEnd(moduleName);
- }).on('part', (p) => p.resume());
- console.time(moduleName);
- form.parse(req);
- for (const buf of buffers)
- req.push(buf);
- req.push(null);
- break;
- }
- default:
- if (moduleName === undefined)
- console.error('Missing parser module name');
- else
- console.error(`Invalid parser module name: ${moduleName}`);
- process.exit(1);
- }
|