1 | 'use strict';
|
2 |
|
3 | const assert = require('assert');
|
4 | const { inspect } = require('util');
|
5 |
|
6 | const { mustCall } = require(`${__dirname}/common.js`);
|
7 |
|
8 | const busboy = require('..');
|
9 |
|
10 | const input = Buffer.from([
|
11 | '-----------------------------paZqsnEHRufoShdX6fh0lUhXBP4k',
|
12 | 'Content-Disposition: form-data; '
|
13 | + 'name="upload_file_0"; filename="テスト.dat"',
|
14 | 'Content-Type: application/octet-stream',
|
15 | '',
|
16 | 'A'.repeat(1023),
|
17 | '-----------------------------paZqsnEHRufoShdX6fh0lUhXBP4k--'
|
18 | ].join('\r\n'));
|
19 | const boundary = '---------------------------paZqsnEHRufoShdX6fh0lUhXBP4k';
|
20 | const expected = [
|
21 | { type: 'file',
|
22 | name: 'upload_file_0',
|
23 | data: Buffer.from('A'.repeat(1023)),
|
24 | info: {
|
25 | filename: 'テスト.dat',
|
26 | encoding: '7bit',
|
27 | mimeType: 'application/octet-stream',
|
28 | },
|
29 | limited: false,
|
30 | },
|
31 | ];
|
32 | const bb = busboy({
|
33 | defParamCharset: 'utf8',
|
34 | headers: {
|
35 | 'content-type': `multipart/form-data; boundary=${boundary}`,
|
36 | }
|
37 | });
|
38 | const results = [];
|
39 |
|
40 | bb.on('field', (name, val, info) => {
|
41 | results.push({ type: 'field', name, val, info });
|
42 | });
|
43 |
|
44 | bb.on('file', (name, stream, info) => {
|
45 | const data = [];
|
46 | let nb = 0;
|
47 | const file = {
|
48 | type: 'file',
|
49 | name,
|
50 | data: null,
|
51 | info,
|
52 | limited: false,
|
53 | };
|
54 | results.push(file);
|
55 | stream.on('data', (d) => {
|
56 | data.push(d);
|
57 | nb += d.length;
|
58 | }).on('limit', () => {
|
59 | file.limited = true;
|
60 | }).on('close', () => {
|
61 | file.data = Buffer.concat(data, nb);
|
62 | assert.strictEqual(stream.truncated, file.limited);
|
63 | }).once('error', (err) => {
|
64 | file.err = err.message;
|
65 | });
|
66 | });
|
67 |
|
68 | bb.on('error', (err) => {
|
69 | results.push({ error: err.message });
|
70 | });
|
71 |
|
72 | bb.on('partsLimit', () => {
|
73 | results.push('partsLimit');
|
74 | });
|
75 |
|
76 | bb.on('filesLimit', () => {
|
77 | results.push('filesLimit');
|
78 | });
|
79 |
|
80 | bb.on('fieldsLimit', () => {
|
81 | results.push('fieldsLimit');
|
82 | });
|
83 |
|
84 | bb.on('close', mustCall(() => {
|
85 | assert.deepStrictEqual(
|
86 | results,
|
87 | expected,
|
88 | 'Results mismatch.\n'
|
89 | + `Parsed: ${inspect(results)}\n`
|
90 | + `Expected: ${inspect(expected)}`
|
91 | );
|
92 | }));
|
93 |
|
94 | bb.end(input);
|