mirror of
https://github.com/musix-org/musix-oss
synced 2025-06-17 01:16:00 +00:00
Modules
This commit is contained in:
16
node_modules/dicer/.travis.yml
generated
vendored
Normal file
16
node_modules/dicer/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
sudo: false
|
||||
language: cpp
|
||||
notifications:
|
||||
email: false
|
||||
env:
|
||||
matrix:
|
||||
- TRAVIS_NODE_VERSION="4"
|
||||
- TRAVIS_NODE_VERSION="6"
|
||||
- TRAVIS_NODE_VERSION="8"
|
||||
- TRAVIS_NODE_VERSION="10"
|
||||
install:
|
||||
- rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && source ~/.nvm/nvm.sh && nvm install $TRAVIS_NODE_VERSION
|
||||
- node --version
|
||||
- npm --version
|
||||
- npm install
|
||||
script: npm test
|
19
node_modules/dicer/LICENSE
generated
vendored
Normal file
19
node_modules/dicer/LICENSE
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
Copyright Brian White. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
122
node_modules/dicer/README.md
generated
vendored
Normal file
122
node_modules/dicer/README.md
generated
vendored
Normal file
@ -0,0 +1,122 @@
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
A very fast streaming multipart parser for node.js.
|
||||
|
||||
Benchmarks can be found [here](https://github.com/mscdex/dicer/wiki/Benchmarks).
|
||||
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
* [node.js](http://nodejs.org/) -- v4.5.0 or newer
|
||||
|
||||
|
||||
Install
|
||||
============
|
||||
|
||||
npm install dicer
|
||||
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
* Parse an HTTP form upload
|
||||
|
||||
```javascript
|
||||
var inspect = require('util').inspect,
|
||||
http = require('http');
|
||||
|
||||
var Dicer = require('dicer');
|
||||
|
||||
// quick and dirty way to parse multipart boundary
|
||||
var RE_BOUNDARY = /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i,
|
||||
HTML = Buffer.from('<html><head></head><body>\
|
||||
<form method="POST" enctype="multipart/form-data">\
|
||||
<input type="text" name="textfield"><br />\
|
||||
<input type="file" name="filefield"><br />\
|
||||
<input type="submit">\
|
||||
</form>\
|
||||
</body></html>'),
|
||||
PORT = 8080;
|
||||
|
||||
http.createServer(function(req, res) {
|
||||
var m;
|
||||
if (req.method === 'POST'
|
||||
&& req.headers['content-type']
|
||||
&& (m = RE_BOUNDARY.exec(req.headers['content-type']))) {
|
||||
var d = new Dicer({ boundary: m[1] || m[2] });
|
||||
|
||||
d.on('part', function(p) {
|
||||
console.log('New part!');
|
||||
p.on('header', function(header) {
|
||||
for (var h in header) {
|
||||
console.log('Part header: k: ' + inspect(h)
|
||||
+ ', v: ' + inspect(header[h]));
|
||||
}
|
||||
});
|
||||
p.on('data', function(data) {
|
||||
console.log('Part data: ' + inspect(data.toString()));
|
||||
});
|
||||
p.on('end', function() {
|
||||
console.log('End of part\n');
|
||||
});
|
||||
});
|
||||
d.on('finish', function() {
|
||||
console.log('End of parts');
|
||||
res.writeHead(200);
|
||||
res.end('Form submission successful!');
|
||||
});
|
||||
req.pipe(d);
|
||||
} else if (req.method === 'GET' && req.url === '/') {
|
||||
res.writeHead(200);
|
||||
res.end(HTML);
|
||||
} else {
|
||||
res.writeHead(404);
|
||||
res.end();
|
||||
}
|
||||
}).listen(PORT, function() {
|
||||
console.log('Listening for requests on port ' + PORT);
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
API
|
||||
===
|
||||
|
||||
_Dicer_ is a _WritableStream_
|
||||
|
||||
Dicer (special) events
|
||||
----------------------
|
||||
|
||||
* **finish**() - Emitted when all parts have been parsed and the Dicer instance has been ended.
|
||||
|
||||
* **part**(< _PartStream_ >stream) - Emitted when a new part has been found.
|
||||
|
||||
* **preamble**(< _PartStream_ >stream) - Emitted for preamble if you should happen to need it (can usually be ignored).
|
||||
|
||||
* **trailer**(< _Buffer_ >data) - Emitted when trailing data was found after the terminating boundary (as with the preamble, this can usually be ignored too).
|
||||
|
||||
|
||||
Dicer methods
|
||||
-------------
|
||||
|
||||
* **(constructor)**(< _object_ >config) - Creates and returns a new Dicer instance with the following valid `config` settings:
|
||||
|
||||
* **boundary** - _string_ - This is the boundary used to detect the beginning of a new part.
|
||||
|
||||
* **headerFirst** - _boolean_ - If true, preamble header parsing will be performed first.
|
||||
|
||||
* **maxHeaderPairs** - _integer_ - The maximum number of header key=>value pairs to parse **Default:** 2000 (same as node's http).
|
||||
|
||||
* **setBoundary**(< _string_ >boundary) - _(void)_ - Sets the boundary to use for parsing and performs some initialization needed for parsing. You should only need to use this if you set `headerFirst` to true in the constructor and are parsing the boundary from the preamble header.
|
||||
|
||||
|
||||
|
||||
_PartStream_ is a _ReadableStream_
|
||||
|
||||
PartStream (special) events
|
||||
---------------------------
|
||||
|
||||
* **header**(< _object_ >header) - An object containing the header for this particular part. Each property value is an _array_ of one or more string values.
|
63
node_modules/dicer/bench/dicer-bench-multipart-parser.js
generated
vendored
Normal file
63
node_modules/dicer/bench/dicer-bench-multipart-parser.js
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
var assert = require('assert');
|
||||
var Dicer = require('..'),
|
||||
boundary = '-----------------------------168072824752491622650073',
|
||||
d = new Dicer({ boundary: boundary }),
|
||||
mb = 100,
|
||||
buffer = createMultipartBuffer(boundary, mb * 1024 * 1024),
|
||||
callbacks =
|
||||
{ partBegin: -1,
|
||||
partEnd: -1,
|
||||
headerField: -1,
|
||||
headerValue: -1,
|
||||
partData: -1,
|
||||
end: -1,
|
||||
};
|
||||
|
||||
|
||||
d.on('part', function(p) {
|
||||
callbacks.partBegin++;
|
||||
p.on('header', function(header) {
|
||||
/*for (var h in header)
|
||||
console.log('Part header: k: ' + inspect(h) + ', v: ' + inspect(header[h]));*/
|
||||
});
|
||||
p.on('data', function(data) {
|
||||
callbacks.partData++;
|
||||
//console.log('Part data: ' + inspect(data.toString()));
|
||||
});
|
||||
p.on('end', function() {
|
||||
//console.log('End of part\n');
|
||||
callbacks.partEnd++;
|
||||
});
|
||||
});
|
||||
d.on('end', function() {
|
||||
//console.log('End of parts');
|
||||
callbacks.end++;
|
||||
});
|
||||
|
||||
var start = +new Date(),
|
||||
nparsed = d.write(buffer),
|
||||
duration = +new Date - start,
|
||||
mbPerSec = (mb / (duration / 1000)).toFixed(2);
|
||||
|
||||
console.log(mbPerSec+' mb/sec');
|
||||
|
||||
//assert.equal(nparsed, buffer.length);
|
||||
|
||||
function createMultipartBuffer(boundary, size) {
|
||||
var head =
|
||||
'--'+boundary+'\r\n'
|
||||
+ 'content-disposition: form-data; name="field1"\r\n'
|
||||
+ '\r\n'
|
||||
, tail = '\r\n--'+boundary+'--\r\n'
|
||||
, buffer = Buffer.allocUnsafe(size);
|
||||
|
||||
buffer.write(head, 'ascii', 0);
|
||||
buffer.write(tail, 'ascii', buffer.length - tail.length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
/*for (var k in callbacks) {
|
||||
assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]);
|
||||
}*/
|
||||
});
|
70
node_modules/dicer/bench/formidable-bench-multipart-parser.js
generated
vendored
Normal file
70
node_modules/dicer/bench/formidable-bench-multipart-parser.js
generated
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
var assert = require('assert');
|
||||
require('../node_modules/formidable/test/common');
|
||||
var multipartParser = require('../node_modules/formidable/lib/multipart_parser'),
|
||||
MultipartParser = multipartParser.MultipartParser,
|
||||
parser = new MultipartParser(),
|
||||
boundary = '-----------------------------168072824752491622650073',
|
||||
mb = 100,
|
||||
buffer = createMultipartBuffer(boundary, mb * 1024 * 1024),
|
||||
callbacks =
|
||||
{ partBegin: -1,
|
||||
partEnd: -1,
|
||||
headerField: -1,
|
||||
headerValue: -1,
|
||||
partData: -1,
|
||||
end: -1,
|
||||
};
|
||||
|
||||
|
||||
parser.initWithBoundary(boundary);
|
||||
parser.onHeaderField = function() {
|
||||
callbacks.headerField++;
|
||||
};
|
||||
|
||||
parser.onHeaderValue = function() {
|
||||
callbacks.headerValue++;
|
||||
};
|
||||
|
||||
parser.onPartBegin = function() {
|
||||
callbacks.partBegin++;
|
||||
};
|
||||
|
||||
parser.onPartData = function() {
|
||||
callbacks.partData++;
|
||||
};
|
||||
|
||||
parser.onPartEnd = function() {
|
||||
callbacks.partEnd++;
|
||||
};
|
||||
|
||||
parser.onEnd = function() {
|
||||
callbacks.end++;
|
||||
};
|
||||
|
||||
var start = +new Date(),
|
||||
nparsed = parser.write(buffer),
|
||||
duration = +new Date - start,
|
||||
mbPerSec = (mb / (duration / 1000)).toFixed(2);
|
||||
|
||||
console.log(mbPerSec+' mb/sec');
|
||||
|
||||
//assert.equal(nparsed, buffer.length);
|
||||
|
||||
function createMultipartBuffer(boundary, size) {
|
||||
var head =
|
||||
'--'+boundary+'\r\n'
|
||||
+ 'content-disposition: form-data; name="field1"\r\n'
|
||||
+ '\r\n'
|
||||
, tail = '\r\n--'+boundary+'--\r\n'
|
||||
, buffer = Buffer.allocUnsafe(size);
|
||||
|
||||
buffer.write(head, 'ascii', 0);
|
||||
buffer.write(tail, 'ascii', buffer.length - tail.length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
/*for (var k in callbacks) {
|
||||
assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]);
|
||||
}*/
|
||||
});
|
56
node_modules/dicer/bench/multipartser-bench-multipart-parser.js
generated
vendored
Normal file
56
node_modules/dicer/bench/multipartser-bench-multipart-parser.js
generated
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
var assert = require('assert');
|
||||
var multipartser = require('multipartser'),
|
||||
boundary = '-----------------------------168072824752491622650073',
|
||||
parser = multipartser(),
|
||||
mb = 100,
|
||||
buffer = createMultipartBuffer(boundary, mb * 1024 * 1024),
|
||||
callbacks =
|
||||
{ partBegin: -1,
|
||||
partEnd: -1,
|
||||
headerField: -1,
|
||||
headerValue: -1,
|
||||
partData: -1,
|
||||
end: -1,
|
||||
};
|
||||
|
||||
parser.boundary( boundary );
|
||||
|
||||
parser.on( 'part', function ( part ) {
|
||||
});
|
||||
|
||||
parser.on( 'end', function () {
|
||||
//console.log( 'completed parsing' );
|
||||
});
|
||||
|
||||
parser.on( 'error', function ( error ) {
|
||||
console.error( error );
|
||||
});
|
||||
|
||||
var start = +new Date(),
|
||||
nparsed = parser.data(buffer),
|
||||
nend = parser.end(),
|
||||
duration = +new Date - start,
|
||||
mbPerSec = (mb / (duration / 1000)).toFixed(2);
|
||||
|
||||
console.log(mbPerSec+' mb/sec');
|
||||
|
||||
//assert.equal(nparsed, buffer.length);
|
||||
|
||||
function createMultipartBuffer(boundary, size) {
|
||||
var head =
|
||||
'--'+boundary+'\r\n'
|
||||
+ 'content-disposition: form-data; name="field1"\r\n'
|
||||
+ '\r\n'
|
||||
, tail = '\r\n--'+boundary+'--\r\n'
|
||||
, buffer = Buffer.allocUnsafe(size);
|
||||
|
||||
buffer.write(head, 'ascii', 0);
|
||||
buffer.write(tail, 'ascii', buffer.length - tail.length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
/*for (var k in callbacks) {
|
||||
assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]);
|
||||
}*/
|
||||
});
|
76
node_modules/dicer/bench/multiparty-bench-multipart-parser.js
generated
vendored
Normal file
76
node_modules/dicer/bench/multiparty-bench-multipart-parser.js
generated
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
var assert = require('assert'),
|
||||
Form = require('multiparty').Form,
|
||||
boundary = '-----------------------------168072824752491622650073',
|
||||
mb = 100,
|
||||
buffer = createMultipartBuffer(boundary, mb * 1024 * 1024),
|
||||
callbacks =
|
||||
{ partBegin: -1,
|
||||
partEnd: -1,
|
||||
headerField: -1,
|
||||
headerValue: -1,
|
||||
partData: -1,
|
||||
end: -1,
|
||||
};
|
||||
|
||||
var form = new Form({ boundary: boundary });
|
||||
|
||||
hijack('onParseHeaderField', function() {
|
||||
callbacks.headerField++;
|
||||
});
|
||||
|
||||
hijack('onParseHeaderValue', function() {
|
||||
callbacks.headerValue++;
|
||||
});
|
||||
|
||||
hijack('onParsePartBegin', function() {
|
||||
callbacks.partBegin++;
|
||||
});
|
||||
|
||||
hijack('onParsePartData', function() {
|
||||
callbacks.partData++;
|
||||
});
|
||||
|
||||
hijack('onParsePartEnd', function() {
|
||||
callbacks.partEnd++;
|
||||
});
|
||||
|
||||
form.on('finish', function() {
|
||||
callbacks.end++;
|
||||
});
|
||||
|
||||
var start = new Date();
|
||||
form.write(buffer, function(err) {
|
||||
var duration = new Date() - start;
|
||||
assert.ifError(err);
|
||||
var mbPerSec = (mb / (duration / 1000)).toFixed(2);
|
||||
console.log(mbPerSec+' mb/sec');
|
||||
});
|
||||
|
||||
//assert.equal(nparsed, buffer.length);
|
||||
|
||||
function createMultipartBuffer(boundary, size) {
|
||||
var head =
|
||||
'--'+boundary+'\r\n'
|
||||
+ 'content-disposition: form-data; name="field1"\r\n'
|
||||
+ '\r\n'
|
||||
, tail = '\r\n--'+boundary+'--\r\n'
|
||||
, buffer = Buffer.allocUnsafe(size);
|
||||
|
||||
buffer.write(head, 'ascii', 0);
|
||||
buffer.write(tail, 'ascii', buffer.length - tail.length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
/*for (var k in callbacks) {
|
||||
assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]);
|
||||
}*/
|
||||
});
|
||||
|
||||
function hijack(name, fn) {
|
||||
var oldFn = form[name];
|
||||
form[name] = function() {
|
||||
fn();
|
||||
return oldFn.apply(this, arguments);
|
||||
};
|
||||
}
|
63
node_modules/dicer/bench/parted-bench-multipart-parser.js
generated
vendored
Normal file
63
node_modules/dicer/bench/parted-bench-multipart-parser.js
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
// A special, edited version of the multipart parser from parted is needed here
|
||||
// because otherwise it attempts to do some things above and beyond just parsing
|
||||
// -- like saving to disk and whatnot
|
||||
|
||||
var assert = require('assert');
|
||||
var Parser = require('./parted-multipart'),
|
||||
boundary = '-----------------------------168072824752491622650073',
|
||||
parser = new Parser('boundary=' + boundary),
|
||||
mb = 100,
|
||||
buffer = createMultipartBuffer(boundary, mb * 1024 * 1024),
|
||||
callbacks =
|
||||
{ partBegin: -1,
|
||||
partEnd: -1,
|
||||
headerField: -1,
|
||||
headerValue: -1,
|
||||
partData: -1,
|
||||
end: -1,
|
||||
};
|
||||
|
||||
|
||||
parser.on('header', function() {
|
||||
//callbacks.headerField++;
|
||||
});
|
||||
|
||||
parser.on('data', function() {
|
||||
//callbacks.partBegin++;
|
||||
});
|
||||
|
||||
parser.on('part', function() {
|
||||
|
||||
});
|
||||
|
||||
parser.on('end', function() {
|
||||
//callbacks.end++;
|
||||
});
|
||||
|
||||
var start = +new Date(),
|
||||
nparsed = parser.write(buffer),
|
||||
duration = +new Date - start,
|
||||
mbPerSec = (mb / (duration / 1000)).toFixed(2);
|
||||
|
||||
console.log(mbPerSec+' mb/sec');
|
||||
|
||||
//assert.equal(nparsed, buffer.length);
|
||||
|
||||
function createMultipartBuffer(boundary, size) {
|
||||
var head =
|
||||
'--'+boundary+'\r\n'
|
||||
+ 'content-disposition: form-data; name="field1"\r\n'
|
||||
+ '\r\n'
|
||||
, tail = '\r\n--'+boundary+'--\r\n'
|
||||
, buffer = Buffer.allocUnsafe(size);
|
||||
|
||||
buffer.write(head, 'ascii', 0);
|
||||
buffer.write(tail, 'ascii', buffer.length - tail.length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
/*for (var k in callbacks) {
|
||||
assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]);
|
||||
}*/
|
||||
});
|
485
node_modules/dicer/bench/parted-multipart.js
generated
vendored
Normal file
485
node_modules/dicer/bench/parted-multipart.js
generated
vendored
Normal file
@ -0,0 +1,485 @@
|
||||
/**
|
||||
* Parted (https://github.com/chjj/parted)
|
||||
* A streaming multipart state parser.
|
||||
* Copyright (c) 2011, Christopher Jeffrey. (MIT Licensed)
|
||||
*/
|
||||
|
||||
var fs = require('fs')
|
||||
, path = require('path')
|
||||
, EventEmitter = require('events').EventEmitter
|
||||
, StringDecoder = require('string_decoder').StringDecoder
|
||||
, set = require('qs').set
|
||||
, each = Array.prototype.forEach;
|
||||
|
||||
/**
|
||||
* Character Constants
|
||||
*/
|
||||
|
||||
var DASH = '-'.charCodeAt(0)
|
||||
, CR = '\r'.charCodeAt(0)
|
||||
, LF = '\n'.charCodeAt(0)
|
||||
, COLON = ':'.charCodeAt(0)
|
||||
, SPACE = ' '.charCodeAt(0);
|
||||
|
||||
/**
|
||||
* Parser
|
||||
*/
|
||||
|
||||
var Parser = function(type, options) {
|
||||
if (!(this instanceof Parser)) {
|
||||
return new Parser(type, options);
|
||||
}
|
||||
|
||||
EventEmitter.call(this);
|
||||
|
||||
this.writable = true;
|
||||
this.readable = true;
|
||||
|
||||
this.options = options || {};
|
||||
|
||||
var key = grab(type, 'boundary');
|
||||
if (!key) {
|
||||
return this._error('No boundary key found.');
|
||||
}
|
||||
|
||||
this.key = Buffer.allocUnsafe('\r\n--' + key);
|
||||
|
||||
this._key = {};
|
||||
each.call(this.key, function(ch) {
|
||||
this._key[ch] = true;
|
||||
}, this);
|
||||
|
||||
this.state = 'start';
|
||||
this.pending = 0;
|
||||
this.written = 0;
|
||||
this.writtenDisk = 0;
|
||||
this.buff = Buffer.allocUnsafe(200);
|
||||
|
||||
this.preamble = true;
|
||||
this.epilogue = false;
|
||||
|
||||
this._reset();
|
||||
};
|
||||
|
||||
Parser.prototype.__proto__ = EventEmitter.prototype;
|
||||
|
||||
/**
|
||||
* Parsing
|
||||
*/
|
||||
|
||||
Parser.prototype.write = function(data) {
|
||||
if (!this.writable
|
||||
|| this.epilogue) return;
|
||||
|
||||
try {
|
||||
this._parse(data);
|
||||
} catch (e) {
|
||||
this._error(e);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
Parser.prototype.end = function(data) {
|
||||
if (!this.writable) return;
|
||||
|
||||
if (data) this.write(data);
|
||||
|
||||
if (!this.epilogue) {
|
||||
return this._error('Message underflow.');
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
Parser.prototype._parse = function(data) {
|
||||
var i = 0
|
||||
, len = data.length
|
||||
, buff = this.buff
|
||||
, key = this.key
|
||||
, ch
|
||||
, val
|
||||
, j;
|
||||
|
||||
for (; i < len; i++) {
|
||||
if (this.pos >= 200) {
|
||||
return this._error('Potential buffer overflow.');
|
||||
}
|
||||
|
||||
ch = data[i];
|
||||
|
||||
switch (this.state) {
|
||||
case 'start':
|
||||
switch (ch) {
|
||||
case DASH:
|
||||
this.pos = 3;
|
||||
this.state = 'key';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'key':
|
||||
if (this.pos === key.length) {
|
||||
this.state = 'key_end';
|
||||
i--;
|
||||
} else if (ch !== key[this.pos]) {
|
||||
if (this.preamble) {
|
||||
this.state = 'start';
|
||||
i--;
|
||||
} else {
|
||||
this.state = 'body';
|
||||
val = this.pos - i;
|
||||
if (val > 0) {
|
||||
this._write(key.slice(0, val));
|
||||
}
|
||||
i--;
|
||||
}
|
||||
} else {
|
||||
this.pos++;
|
||||
}
|
||||
break;
|
||||
case 'key_end':
|
||||
switch (ch) {
|
||||
case CR:
|
||||
this.state = 'key_line_end';
|
||||
break;
|
||||
case DASH:
|
||||
this.state = 'key_dash_end';
|
||||
break;
|
||||
default:
|
||||
return this._error('Expected CR or DASH.');
|
||||
}
|
||||
break;
|
||||
case 'key_line_end':
|
||||
switch (ch) {
|
||||
case LF:
|
||||
if (this.preamble) {
|
||||
this.preamble = false;
|
||||
} else {
|
||||
this._finish();
|
||||
}
|
||||
this.state = 'header_name';
|
||||
this.pos = 0;
|
||||
break;
|
||||
default:
|
||||
return this._error('Expected CR.');
|
||||
}
|
||||
break;
|
||||
case 'key_dash_end':
|
||||
switch (ch) {
|
||||
case DASH:
|
||||
this.epilogue = true;
|
||||
this._finish();
|
||||
return;
|
||||
default:
|
||||
return this._error('Expected DASH.');
|
||||
}
|
||||
break;
|
||||
case 'header_name':
|
||||
switch (ch) {
|
||||
case COLON:
|
||||
this.header = buff.toString('ascii', 0, this.pos);
|
||||
this.pos = 0;
|
||||
this.state = 'header_val';
|
||||
break;
|
||||
default:
|
||||
buff[this.pos++] = ch | 32;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'header_val':
|
||||
switch (ch) {
|
||||
case CR:
|
||||
this.state = 'header_val_end';
|
||||
break;
|
||||
case SPACE:
|
||||
if (this.pos === 0) {
|
||||
break;
|
||||
}
|
||||
; // FALL-THROUGH
|
||||
default:
|
||||
buff[this.pos++] = ch;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'header_val_end':
|
||||
switch (ch) {
|
||||
case LF:
|
||||
val = buff.toString('ascii', 0, this.pos);
|
||||
this._header(this.header, val);
|
||||
this.pos = 0;
|
||||
this.state = 'header_end';
|
||||
break;
|
||||
default:
|
||||
return this._error('Expected LF.');
|
||||
}
|
||||
break;
|
||||
case 'header_end':
|
||||
switch (ch) {
|
||||
case CR:
|
||||
this.state = 'head_end';
|
||||
break;
|
||||
default:
|
||||
this.state = 'header_name';
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'head_end':
|
||||
switch (ch) {
|
||||
case LF:
|
||||
this.state = 'body';
|
||||
i++;
|
||||
if (i >= len) return;
|
||||
data = data.slice(i);
|
||||
i = -1;
|
||||
len = data.length;
|
||||
break;
|
||||
default:
|
||||
return this._error('Expected LF.');
|
||||
}
|
||||
break;
|
||||
case 'body':
|
||||
switch (ch) {
|
||||
case CR:
|
||||
if (i > 0) {
|
||||
this._write(data.slice(0, i));
|
||||
}
|
||||
this.pos = 1;
|
||||
this.state = 'key';
|
||||
data = data.slice(i);
|
||||
i = 0;
|
||||
len = data.length;
|
||||
break;
|
||||
default:
|
||||
// boyer-moore-like algorithm
|
||||
// at felixge's suggestion
|
||||
while ((j = i + key.length - 1) < len) {
|
||||
if (this._key[data[j]]) break;
|
||||
i = j;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.state === 'body') {
|
||||
this._write(data);
|
||||
}
|
||||
};
|
||||
|
||||
Parser.prototype._header = function(name, val) {
|
||||
/*if (name === 'content-disposition') {
|
||||
this.field = grab(val, 'name');
|
||||
this.file = grab(val, 'filename');
|
||||
|
||||
if (this.file) {
|
||||
this.data = stream(this.file, this.options.path);
|
||||
} else {
|
||||
this.decode = new StringDecoder('utf8');
|
||||
this.data = '';
|
||||
}
|
||||
}*/
|
||||
|
||||
return this.emit('header', name, val);
|
||||
};
|
||||
|
||||
Parser.prototype._write = function(data) {
|
||||
/*if (this.data == null) {
|
||||
return this._error('No disposition.');
|
||||
}
|
||||
|
||||
if (this.file) {
|
||||
this.data.write(data);
|
||||
this.writtenDisk += data.length;
|
||||
} else {
|
||||
this.data += this.decode.write(data);
|
||||
this.written += data.length;
|
||||
}*/
|
||||
|
||||
this.emit('data', data);
|
||||
};
|
||||
|
||||
Parser.prototype._reset = function() {
|
||||
this.pos = 0;
|
||||
this.decode = null;
|
||||
this.field = null;
|
||||
this.data = null;
|
||||
this.file = null;
|
||||
this.header = null;
|
||||
};
|
||||
|
||||
Parser.prototype._error = function(err) {
|
||||
this.destroy();
|
||||
this.emit('error', typeof err === 'string'
|
||||
? new Error(err)
|
||||
: err);
|
||||
};
|
||||
|
||||
Parser.prototype.destroy = function(err) {
|
||||
this.writable = false;
|
||||
this.readable = false;
|
||||
this._reset();
|
||||
};
|
||||
|
||||
Parser.prototype._finish = function() {
|
||||
var self = this
|
||||
, field = this.field
|
||||
, data = this.data
|
||||
, file = this.file
|
||||
, part;
|
||||
|
||||
this.pending++;
|
||||
|
||||
this._reset();
|
||||
|
||||
if (data && data.path) {
|
||||
part = data.path;
|
||||
data.end(next);
|
||||
} else {
|
||||
part = data;
|
||||
next();
|
||||
}
|
||||
|
||||
function next() {
|
||||
if (!self.readable) return;
|
||||
|
||||
self.pending--;
|
||||
|
||||
self.emit('part', field, part);
|
||||
|
||||
if (data && data.path) {
|
||||
self.emit('file', field, part, file);
|
||||
}
|
||||
|
||||
if (self.epilogue && !self.pending) {
|
||||
self.emit('end');
|
||||
self.destroy();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Uploads
|
||||
*/
|
||||
|
||||
Parser.root = process.platform === 'win32'
|
||||
? 'C:/Temp'
|
||||
: '/tmp';
|
||||
|
||||
/**
|
||||
* Middleware
|
||||
*/
|
||||
|
||||
Parser.middleware = function(options) {
|
||||
options = options || {};
|
||||
return function(req, res, next) {
|
||||
if (options.ensureBody) {
|
||||
req.body = {};
|
||||
}
|
||||
|
||||
if (req.method === 'GET'
|
||||
|| req.method === 'HEAD'
|
||||
|| req._multipart) return next();
|
||||
|
||||
req._multipart = true;
|
||||
|
||||
var type = req.headers['content-type'];
|
||||
|
||||
if (type) type = type.split(';')[0].trim().toLowerCase();
|
||||
|
||||
if (type === 'multipart/form-data') {
|
||||
Parser.handle(req, res, next, options);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Handler
|
||||
*/
|
||||
|
||||
Parser.handle = function(req, res, next, options) {
|
||||
var parser = new Parser(req.headers['content-type'], options)
|
||||
, diskLimit = options.diskLimit
|
||||
, limit = options.limit
|
||||
, parts = {}
|
||||
, files = {};
|
||||
|
||||
parser.on('error', function(err) {
|
||||
req.destroy();
|
||||
next(err);
|
||||
});
|
||||
|
||||
parser.on('part', function(field, part) {
|
||||
set(parts, field, part);
|
||||
});
|
||||
|
||||
parser.on('file', function(field, path, name) {
|
||||
set(files, field, {
|
||||
path: path,
|
||||
name: name,
|
||||
toString: function() {
|
||||
return path;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
parser.on('data', function() {
|
||||
if (this.writtenDisk > diskLimit || this.written > limit) {
|
||||
this.emit('error', new Error('Overflow.'));
|
||||
this.destroy();
|
||||
}
|
||||
});
|
||||
|
||||
parser.on('end', next);
|
||||
|
||||
req.body = parts;
|
||||
req.files = files;
|
||||
req.pipe(parser);
|
||||
};
|
||||
|
||||
/**
|
||||
* Helpers
|
||||
*/
|
||||
|
||||
var isWindows = process.platform === 'win32';
|
||||
|
||||
var stream = function(name, dir) {
|
||||
var ext = path.extname(name) || ''
|
||||
, name = path.basename(name, ext) || ''
|
||||
, dir = dir || Parser.root
|
||||
, tag;
|
||||
|
||||
tag = Math.random().toString(36).substring(2);
|
||||
|
||||
name = name.substring(0, 200) + '.' + tag;
|
||||
name = path.join(dir, name) + ext.substring(0, 6);
|
||||
name = name.replace(/\0/g, '');
|
||||
|
||||
if (isWindows) {
|
||||
name = name.replace(/[:*<>|"?]/g, '');
|
||||
}
|
||||
|
||||
return fs.createWriteStream(name);
|
||||
};
|
||||
|
||||
var grab = function(str, name) {
|
||||
if (!str) return;
|
||||
|
||||
var rx = new RegExp('\\b' + name + '\\s*=\\s*("[^"]+"|\'[^\']+\'|[^;,]+)', 'i')
|
||||
, cap = rx.exec(str);
|
||||
|
||||
if (cap) {
|
||||
return cap[1].trim().replace(/^['"]|['"]$/g, '');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose
|
||||
*/
|
||||
|
||||
module.exports = Parser;
|
239
node_modules/dicer/lib/Dicer.js
generated
vendored
Normal file
239
node_modules/dicer/lib/Dicer.js
generated
vendored
Normal file
@ -0,0 +1,239 @@
|
||||
var WritableStream = require('stream').Writable,
|
||||
inherits = require('util').inherits;
|
||||
|
||||
var StreamSearch = require('streamsearch');
|
||||
|
||||
var PartStream = require('./PartStream'),
|
||||
HeaderParser = require('./HeaderParser');
|
||||
|
||||
var DASH = 45,
|
||||
B_ONEDASH = Buffer.from('-'),
|
||||
B_CRLF = Buffer.from('\r\n'),
|
||||
EMPTY_FN = function() {};
|
||||
|
||||
function Dicer(cfg) {
|
||||
if (!(this instanceof Dicer))
|
||||
return new Dicer(cfg);
|
||||
WritableStream.call(this, cfg);
|
||||
|
||||
if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string'))
|
||||
throw new TypeError('Boundary required');
|
||||
|
||||
if (typeof cfg.boundary === 'string')
|
||||
this.setBoundary(cfg.boundary);
|
||||
else
|
||||
this._bparser = undefined;
|
||||
|
||||
this._headerFirst = cfg.headerFirst;
|
||||
|
||||
var self = this;
|
||||
|
||||
this._dashes = 0;
|
||||
this._parts = 0;
|
||||
this._finished = false;
|
||||
this._realFinish = false;
|
||||
this._isPreamble = true;
|
||||
this._justMatched = false;
|
||||
this._firstWrite = true;
|
||||
this._inHeader = true;
|
||||
this._part = undefined;
|
||||
this._cb = undefined;
|
||||
this._ignoreData = false;
|
||||
this._partOpts = (typeof cfg.partHwm === 'number'
|
||||
? { highWaterMark: cfg.partHwm }
|
||||
: {});
|
||||
this._pause = false;
|
||||
|
||||
this._hparser = new HeaderParser(cfg);
|
||||
this._hparser.on('header', function(header) {
|
||||
self._inHeader = false;
|
||||
self._part.emit('header', header);
|
||||
});
|
||||
|
||||
}
|
||||
inherits(Dicer, WritableStream);
|
||||
|
||||
Dicer.prototype.emit = function(ev) {
|
||||
if (ev === 'finish' && !this._realFinish) {
|
||||
if (!this._finished) {
|
||||
var self = this;
|
||||
process.nextTick(function() {
|
||||
self.emit('error', new Error('Unexpected end of multipart data'));
|
||||
if (self._part && !self._ignoreData) {
|
||||
var type = (self._isPreamble ? 'Preamble' : 'Part');
|
||||
self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'));
|
||||
self._part.push(null);
|
||||
process.nextTick(function() {
|
||||
self._realFinish = true;
|
||||
self.emit('finish');
|
||||
self._realFinish = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
self._realFinish = true;
|
||||
self.emit('finish');
|
||||
self._realFinish = false;
|
||||
});
|
||||
}
|
||||
} else
|
||||
WritableStream.prototype.emit.apply(this, arguments);
|
||||
};
|
||||
|
||||
Dicer.prototype._write = function(data, encoding, cb) {
|
||||
// ignore unexpected data (e.g. extra trailer data after finished)
|
||||
if (!this._hparser && !this._bparser)
|
||||
return cb();
|
||||
|
||||
if (this._headerFirst && this._isPreamble) {
|
||||
if (!this._part) {
|
||||
this._part = new PartStream(this._partOpts);
|
||||
if (this._events.preamble)
|
||||
this.emit('preamble', this._part);
|
||||
else
|
||||
this._ignore();
|
||||
}
|
||||
var r = this._hparser.push(data);
|
||||
if (!this._inHeader && r !== undefined && r < data.length)
|
||||
data = data.slice(r);
|
||||
else
|
||||
return cb();
|
||||
}
|
||||
|
||||
// allows for "easier" testing
|
||||
if (this._firstWrite) {
|
||||
this._bparser.push(B_CRLF);
|
||||
this._firstWrite = false;
|
||||
}
|
||||
|
||||
this._bparser.push(data);
|
||||
|
||||
if (this._pause)
|
||||
this._cb = cb;
|
||||
else
|
||||
cb();
|
||||
};
|
||||
|
||||
Dicer.prototype.reset = function() {
|
||||
this._part = undefined;
|
||||
this._bparser = undefined;
|
||||
this._hparser = undefined;
|
||||
};
|
||||
|
||||
Dicer.prototype.setBoundary = function(boundary) {
|
||||
var self = this;
|
||||
this._bparser = new StreamSearch('\r\n--' + boundary);
|
||||
this._bparser.on('info', function(isMatch, data, start, end) {
|
||||
self._oninfo(isMatch, data, start, end);
|
||||
});
|
||||
};
|
||||
|
||||
Dicer.prototype._ignore = function() {
|
||||
if (this._part && !this._ignoreData) {
|
||||
this._ignoreData = true;
|
||||
this._part.on('error', EMPTY_FN);
|
||||
// we must perform some kind of read on the stream even though we are
|
||||
// ignoring the data, otherwise node's Readable stream will not emit 'end'
|
||||
// after pushing null to the stream
|
||||
this._part.resume();
|
||||
}
|
||||
};
|
||||
|
||||
Dicer.prototype._oninfo = function(isMatch, data, start, end) {
|
||||
var buf, self = this, i = 0, r, ev, shouldWriteMore = true;
|
||||
|
||||
if (!this._part && this._justMatched && data) {
|
||||
while (this._dashes < 2 && (start + i) < end) {
|
||||
if (data[start + i] === DASH) {
|
||||
++i;
|
||||
++this._dashes;
|
||||
} else {
|
||||
if (this._dashes)
|
||||
buf = B_ONEDASH;
|
||||
this._dashes = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (this._dashes === 2) {
|
||||
if ((start + i) < end && this._events.trailer)
|
||||
this.emit('trailer', data.slice(start + i, end));
|
||||
this.reset();
|
||||
this._finished = true;
|
||||
// no more parts will be added
|
||||
if (self._parts === 0) {
|
||||
self._realFinish = true;
|
||||
self.emit('finish');
|
||||
self._realFinish = false;
|
||||
}
|
||||
}
|
||||
if (this._dashes)
|
||||
return;
|
||||
}
|
||||
if (this._justMatched)
|
||||
this._justMatched = false;
|
||||
if (!this._part) {
|
||||
this._part = new PartStream(this._partOpts);
|
||||
this._part._read = function(n) {
|
||||
self._unpause();
|
||||
};
|
||||
ev = this._isPreamble ? 'preamble' : 'part';
|
||||
if (this._events[ev])
|
||||
this.emit(ev, this._part);
|
||||
else
|
||||
this._ignore();
|
||||
if (!this._isPreamble)
|
||||
this._inHeader = true;
|
||||
}
|
||||
if (data && start < end && !this._ignoreData) {
|
||||
if (this._isPreamble || !this._inHeader) {
|
||||
if (buf)
|
||||
shouldWriteMore = this._part.push(buf);
|
||||
shouldWriteMore = this._part.push(data.slice(start, end));
|
||||
if (!shouldWriteMore)
|
||||
this._pause = true;
|
||||
} else if (!this._isPreamble && this._inHeader) {
|
||||
if (buf)
|
||||
this._hparser.push(buf);
|
||||
r = this._hparser.push(data.slice(start, end));
|
||||
if (!this._inHeader && r !== undefined && r < end)
|
||||
this._oninfo(false, data, start + r, end);
|
||||
}
|
||||
}
|
||||
if (isMatch) {
|
||||
this._hparser.reset();
|
||||
if (this._isPreamble)
|
||||
this._isPreamble = false;
|
||||
else {
|
||||
++this._parts;
|
||||
this._part.on('end', function() {
|
||||
if (--self._parts === 0) {
|
||||
if (self._finished) {
|
||||
self._realFinish = true;
|
||||
self.emit('finish');
|
||||
self._realFinish = false;
|
||||
} else {
|
||||
self._unpause();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
this._part.push(null);
|
||||
this._part = undefined;
|
||||
this._ignoreData = false;
|
||||
this._justMatched = true;
|
||||
this._dashes = 0;
|
||||
}
|
||||
};
|
||||
|
||||
Dicer.prototype._unpause = function() {
|
||||
if (!this._pause)
|
||||
return;
|
||||
|
||||
this._pause = false;
|
||||
if (this._cb) {
|
||||
var cb = this._cb;
|
||||
this._cb = undefined;
|
||||
cb();
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Dicer;
|
110
node_modules/dicer/lib/HeaderParser.js
generated
vendored
Normal file
110
node_modules/dicer/lib/HeaderParser.js
generated
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
var EventEmitter = require('events').EventEmitter,
|
||||
inherits = require('util').inherits;
|
||||
|
||||
var StreamSearch = require('streamsearch');
|
||||
|
||||
var B_DCRLF = Buffer.from('\r\n\r\n'),
|
||||
RE_CRLF = /\r\n/g,
|
||||
RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/,
|
||||
MAX_HEADER_PAIRS = 2000, // from node's http.js
|
||||
MAX_HEADER_SIZE = 80 * 1024; // from node's http_parser
|
||||
|
||||
function HeaderParser(cfg) {
|
||||
EventEmitter.call(this);
|
||||
|
||||
var self = this;
|
||||
this.nread = 0;
|
||||
this.maxed = false;
|
||||
this.npairs = 0;
|
||||
this.maxHeaderPairs = (cfg && typeof cfg.maxHeaderPairs === 'number'
|
||||
? cfg.maxHeaderPairs
|
||||
: MAX_HEADER_PAIRS);
|
||||
this.buffer = '';
|
||||
this.header = {};
|
||||
this.finished = false;
|
||||
this.ss = new StreamSearch(B_DCRLF);
|
||||
this.ss.on('info', function(isMatch, data, start, end) {
|
||||
if (data && !self.maxed) {
|
||||
if (self.nread + (end - start) > MAX_HEADER_SIZE) {
|
||||
end = (MAX_HEADER_SIZE - self.nread);
|
||||
self.nread = MAX_HEADER_SIZE;
|
||||
} else
|
||||
self.nread += (end - start);
|
||||
|
||||
if (self.nread === MAX_HEADER_SIZE)
|
||||
self.maxed = true;
|
||||
|
||||
self.buffer += data.toString('binary', start, end);
|
||||
}
|
||||
if (isMatch)
|
||||
self._finish();
|
||||
});
|
||||
}
|
||||
inherits(HeaderParser, EventEmitter);
|
||||
|
||||
HeaderParser.prototype.push = function(data) {
|
||||
var r = this.ss.push(data);
|
||||
if (this.finished)
|
||||
return r;
|
||||
};
|
||||
|
||||
HeaderParser.prototype.reset = function() {
|
||||
this.finished = false;
|
||||
this.buffer = '';
|
||||
this.header = {};
|
||||
this.ss.reset();
|
||||
};
|
||||
|
||||
HeaderParser.prototype._finish = function() {
|
||||
if (this.buffer)
|
||||
this._parseHeader();
|
||||
this.ss.matches = this.ss.maxMatches;
|
||||
var header = this.header;
|
||||
this.header = {};
|
||||
this.buffer = '';
|
||||
this.finished = true;
|
||||
this.nread = this.npairs = 0;
|
||||
this.maxed = false;
|
||||
this.emit('header', header);
|
||||
};
|
||||
|
||||
HeaderParser.prototype._parseHeader = function() {
|
||||
if (this.npairs === this.maxHeaderPairs)
|
||||
return;
|
||||
|
||||
var lines = this.buffer.split(RE_CRLF), len = lines.length, m, h,
|
||||
modded = false;
|
||||
|
||||
for (var i = 0; i < len; ++i) {
|
||||
if (lines[i].length === 0)
|
||||
continue;
|
||||
if (lines[i][0] === '\t' || lines[i][0] === ' ') {
|
||||
// folded header content
|
||||
// RFC2822 says to just remove the CRLF and not the whitespace following
|
||||
// it, so we follow the RFC and include the leading whitespace ...
|
||||
this.header[h][this.header[h].length - 1] += lines[i];
|
||||
} else {
|
||||
m = RE_HDR.exec(lines[i]);
|
||||
if (m) {
|
||||
h = m[1].toLowerCase();
|
||||
if (m[2]) {
|
||||
if (this.header[h] === undefined)
|
||||
this.header[h] = [m[2]];
|
||||
else
|
||||
this.header[h].push(m[2]);
|
||||
} else
|
||||
this.header[h] = [''];
|
||||
if (++this.npairs === this.maxHeaderPairs)
|
||||
break;
|
||||
} else {
|
||||
this.buffer = lines[i];
|
||||
modded = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!modded)
|
||||
this.buffer = '';
|
||||
};
|
||||
|
||||
module.exports = HeaderParser;
|
11
node_modules/dicer/lib/PartStream.js
generated
vendored
Normal file
11
node_modules/dicer/lib/PartStream.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
var inherits = require('util').inherits,
|
||||
ReadableStream = require('stream').Readable;
|
||||
|
||||
function PartStream(opts) {
|
||||
ReadableStream.call(this, opts);
|
||||
}
|
||||
inherits(PartStream, ReadableStream);
|
||||
|
||||
PartStream.prototype._read = function(n) {};
|
||||
|
||||
module.exports = PartStream;
|
69
node_modules/dicer/package.json
generated
vendored
Normal file
69
node_modules/dicer/package.json
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"dicer@0.3.0",
|
||||
"C:\\Users\\matia\\Musix"
|
||||
]
|
||||
],
|
||||
"_from": "dicer@0.3.0",
|
||||
"_id": "dicer@0.3.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
|
||||
"_location": "/dicer",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "dicer@0.3.0",
|
||||
"name": "dicer",
|
||||
"escapedName": "dicer",
|
||||
"rawSpec": "0.3.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "0.3.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/firebase-admin"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
|
||||
"_spec": "0.3.0",
|
||||
"_where": "C:\\Users\\matia\\Musix",
|
||||
"author": {
|
||||
"name": "Brian White",
|
||||
"email": "mscdex@mscdex.net"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/mscdex/dicer/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"streamsearch": "0.1.2"
|
||||
},
|
||||
"description": "A very fast streaming multipart parser for node.js",
|
||||
"engines": {
|
||||
"node": ">=4.5.0"
|
||||
},
|
||||
"homepage": "https://github.com/mscdex/dicer#readme",
|
||||
"keywords": [
|
||||
"parser",
|
||||
"parse",
|
||||
"parsing",
|
||||
"multipart",
|
||||
"form-data",
|
||||
"streaming"
|
||||
],
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://github.com/mscdex/dicer/raw/master/LICENSE"
|
||||
}
|
||||
],
|
||||
"main": "./lib/Dicer",
|
||||
"name": "dicer",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/mscdex/dicer.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "node test/test.js"
|
||||
},
|
||||
"version": "0.3.0"
|
||||
}
|
31
node_modules/dicer/test/fixtures/many-noend/original
generated
vendored
Normal file
31
node_modules/dicer/test/fixtures/many-noend/original
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="_method"
|
||||
|
||||
put
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[blog]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[public_email]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[interests]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[bio]"
|
||||
|
||||
hello
|
||||
|
||||
"quote"
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="commit"
|
||||
|
||||
Save
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="media"; filename=""
|
||||
Content-Type: application/octet-stream
|
||||
|
||||
|
1
node_modules/dicer/test/fixtures/many-noend/part1
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part1
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
put
|
1
node_modules/dicer/test/fixtures/many-noend/part1.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part1.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"_method\""]}
|
0
node_modules/dicer/test/fixtures/many-noend/part2
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many-noend/part2
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part2.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part2.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[blog]\""]}
|
0
node_modules/dicer/test/fixtures/many-noend/part3
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many-noend/part3
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part3.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part3.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[public_email]\""]}
|
0
node_modules/dicer/test/fixtures/many-noend/part4
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many-noend/part4
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part4.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part4.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[interests]\""]}
|
3
node_modules/dicer/test/fixtures/many-noend/part5
generated
vendored
Normal file
3
node_modules/dicer/test/fixtures/many-noend/part5
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
hello
|
||||
|
||||
"quote"
|
1
node_modules/dicer/test/fixtures/many-noend/part5.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part5.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[bio]\""]}
|
1
node_modules/dicer/test/fixtures/many-noend/part6
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part6
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
Save
|
1
node_modules/dicer/test/fixtures/many-noend/part6.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-noend/part6.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"commit\""]}
|
2
node_modules/dicer/test/fixtures/many-noend/part7.header
generated
vendored
Normal file
2
node_modules/dicer/test/fixtures/many-noend/part7.header
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
{"content-disposition": ["form-data; name=\"media\"; filename=\"\""],
|
||||
"content-type": ["application/octet-stream"]}
|
32
node_modules/dicer/test/fixtures/many-wrongboundary/original
generated
vendored
Normal file
32
node_modules/dicer/test/fixtures/many-wrongboundary/original
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="_method"
|
||||
|
||||
put
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[blog]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[public_email]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[interests]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[bio]"
|
||||
|
||||
hello
|
||||
|
||||
"quote"
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="media"; filename=""
|
||||
Content-Type: application/octet-stream
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="commit"
|
||||
|
||||
Save
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR--
|
33
node_modules/dicer/test/fixtures/many-wrongboundary/preamble
generated
vendored
Normal file
33
node_modules/dicer/test/fixtures/many-wrongboundary/preamble
generated
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="_method"
|
||||
|
||||
put
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[blog]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[public_email]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[interests]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[bio]"
|
||||
|
||||
hello
|
||||
|
||||
"quote"
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="media"; filename=""
|
||||
Content-Type: application/octet-stream
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="commit"
|
||||
|
||||
Save
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR--
|
1
node_modules/dicer/test/fixtures/many-wrongboundary/preamble.error
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many-wrongboundary/preamble.error
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
Preamble terminated early due to unexpected end of multipart data
|
32
node_modules/dicer/test/fixtures/many/original
generated
vendored
Normal file
32
node_modules/dicer/test/fixtures/many/original
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="_method"
|
||||
|
||||
put
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[blog]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[public_email]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[interests]"
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="profile[bio]"
|
||||
|
||||
hello
|
||||
|
||||
"quote"
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="media"; filename=""
|
||||
Content-Type: application/octet-stream
|
||||
|
||||
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR
|
||||
Content-Disposition: form-data; name="commit"
|
||||
|
||||
Save
|
||||
------WebKitFormBoundaryWLHCs9qmcJJoyjKR--
|
1
node_modules/dicer/test/fixtures/many/part1
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part1
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
put
|
1
node_modules/dicer/test/fixtures/many/part1.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part1.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"_method\""]}
|
0
node_modules/dicer/test/fixtures/many/part2
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many/part2
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part2.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part2.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[blog]\""]}
|
0
node_modules/dicer/test/fixtures/many/part3
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many/part3
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part3.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part3.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[public_email]\""]}
|
0
node_modules/dicer/test/fixtures/many/part4
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many/part4
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part4.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part4.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[interests]\""]}
|
3
node_modules/dicer/test/fixtures/many/part5
generated
vendored
Normal file
3
node_modules/dicer/test/fixtures/many/part5
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
hello
|
||||
|
||||
"quote"
|
1
node_modules/dicer/test/fixtures/many/part5.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part5.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"profile[bio]\""]}
|
0
node_modules/dicer/test/fixtures/many/part6
generated
vendored
Normal file
0
node_modules/dicer/test/fixtures/many/part6
generated
vendored
Normal file
2
node_modules/dicer/test/fixtures/many/part6.header
generated
vendored
Normal file
2
node_modules/dicer/test/fixtures/many/part6.header
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
{"content-disposition": ["form-data; name=\"media\"; filename=\"\""],
|
||||
"content-type": ["application/octet-stream"]}
|
1
node_modules/dicer/test/fixtures/many/part7
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part7
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
Save
|
1
node_modules/dicer/test/fixtures/many/part7.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/many/part7.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"commit\""]}
|
24
node_modules/dicer/test/fixtures/nested-full/original
generated
vendored
Normal file
24
node_modules/dicer/test/fixtures/nested-full/original
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
User-Agent: foo bar baz
|
||||
Content-Type: multipart/form-data; boundary=AaB03x
|
||||
|
||||
--AaB03x
|
||||
Content-Disposition: form-data; name="foo"
|
||||
|
||||
bar
|
||||
--AaB03x
|
||||
Content-Disposition: form-data; name="files"
|
||||
Content-Type: multipart/mixed, boundary=BbC04y
|
||||
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="file.txt"
|
||||
Content-Type: text/plain
|
||||
|
||||
contents
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="flowers.jpg"
|
||||
Content-Type: image/jpeg
|
||||
Content-Transfer-Encoding: binary
|
||||
|
||||
contents
|
||||
--BbC04y--
|
||||
--AaB03x--
|
1
node_modules/dicer/test/fixtures/nested-full/part1
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/nested-full/part1
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
bar
|
1
node_modules/dicer/test/fixtures/nested-full/part1.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/nested-full/part1.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"foo\""]}
|
12
node_modules/dicer/test/fixtures/nested-full/part2
generated
vendored
Normal file
12
node_modules/dicer/test/fixtures/nested-full/part2
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="file.txt"
|
||||
Content-Type: text/plain
|
||||
|
||||
contents
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="flowers.jpg"
|
||||
Content-Type: image/jpeg
|
||||
Content-Transfer-Encoding: binary
|
||||
|
||||
contents
|
||||
--BbC04y--
|
2
node_modules/dicer/test/fixtures/nested-full/part2.header
generated
vendored
Normal file
2
node_modules/dicer/test/fixtures/nested-full/part2.header
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
{"content-disposition": ["form-data; name=\"files\""],
|
||||
"content-type": ["multipart/mixed, boundary=BbC04y"]}
|
2
node_modules/dicer/test/fixtures/nested-full/preamble.header
generated
vendored
Normal file
2
node_modules/dicer/test/fixtures/nested-full/preamble.header
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
{"user-agent": ["foo bar baz"],
|
||||
"content-type": ["multipart/form-data; boundary=AaB03x"]}
|
21
node_modules/dicer/test/fixtures/nested/original
generated
vendored
Normal file
21
node_modules/dicer/test/fixtures/nested/original
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
--AaB03x
|
||||
Content-Disposition: form-data; name="foo"
|
||||
|
||||
bar
|
||||
--AaB03x
|
||||
Content-Disposition: form-data; name="files"
|
||||
Content-Type: multipart/mixed, boundary=BbC04y
|
||||
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="file.txt"
|
||||
Content-Type: text/plain
|
||||
|
||||
contents
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="flowers.jpg"
|
||||
Content-Type: image/jpeg
|
||||
Content-Transfer-Encoding: binary
|
||||
|
||||
contents
|
||||
--BbC04y--
|
||||
--AaB03x--
|
1
node_modules/dicer/test/fixtures/nested/part1
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/nested/part1
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
bar
|
1
node_modules/dicer/test/fixtures/nested/part1.header
generated
vendored
Normal file
1
node_modules/dicer/test/fixtures/nested/part1.header
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"content-disposition": ["form-data; name=\"foo\""]}
|
12
node_modules/dicer/test/fixtures/nested/part2
generated
vendored
Normal file
12
node_modules/dicer/test/fixtures/nested/part2
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="file.txt"
|
||||
Content-Type: text/plain
|
||||
|
||||
contents
|
||||
--BbC04y
|
||||
Content-Disposition: attachment; filename="flowers.jpg"
|
||||
Content-Type: image/jpeg
|
||||
Content-Transfer-Encoding: binary
|
||||
|
||||
contents
|
||||
--BbC04y--
|
2
node_modules/dicer/test/fixtures/nested/part2.header
generated
vendored
Normal file
2
node_modules/dicer/test/fixtures/nested/part2.header
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
{"content-disposition": ["form-data; name=\"files\""],
|
||||
"content-type": ["multipart/mixed, boundary=BbC04y"]}
|
87
node_modules/dicer/test/test-endfinish.js
generated
vendored
Normal file
87
node_modules/dicer/test/test-endfinish.js
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
var Dicer = require('..');
|
||||
var assert = require('assert');
|
||||
|
||||
var CRLF = '\r\n';
|
||||
var boundary = 'boundary';
|
||||
|
||||
var writeSep = '--' + boundary;
|
||||
|
||||
var writePart = [
|
||||
writeSep,
|
||||
'Content-Type: text/plain',
|
||||
'Content-Length: 0'
|
||||
].join(CRLF)
|
||||
+ CRLF + CRLF
|
||||
+ 'some data' + CRLF;
|
||||
|
||||
var writeEnd = '--' + CRLF;
|
||||
|
||||
var firedEnd = false;
|
||||
var firedFinish = false;
|
||||
|
||||
var dicer = new Dicer({boundary: boundary});
|
||||
dicer.on('part', partListener);
|
||||
dicer.on('finish', finishListener);
|
||||
dicer.write(writePart+writeSep);
|
||||
|
||||
function partListener(partReadStream) {
|
||||
partReadStream.on('data', function(){});
|
||||
partReadStream.on('end', partEndListener);
|
||||
}
|
||||
function partEndListener() {
|
||||
firedEnd = true;
|
||||
setImmediate(afterEnd);
|
||||
}
|
||||
function afterEnd() {
|
||||
dicer.end(writeEnd);
|
||||
setImmediate(afterWrite);
|
||||
}
|
||||
function finishListener() {
|
||||
assert(firedEnd, 'Failed to end before finishing');
|
||||
firedFinish = true;
|
||||
test2();
|
||||
}
|
||||
function afterWrite() {
|
||||
assert(firedFinish, 'Failed to finish');
|
||||
}
|
||||
|
||||
var isPausePush = true;
|
||||
|
||||
var firedPauseCallback = false;
|
||||
var firedPauseFinish = false;
|
||||
|
||||
var dicer2 = null;
|
||||
|
||||
function test2() {
|
||||
dicer2 = new Dicer({boundary: boundary});
|
||||
dicer2.on('part', pausePartListener);
|
||||
dicer2.on('finish', pauseFinish);
|
||||
dicer2.write(writePart+writeSep, 'utf8', pausePartCallback);
|
||||
setImmediate(pauseAfterWrite);
|
||||
}
|
||||
function pausePartListener(partReadStream) {
|
||||
partReadStream.on('data', function(){});
|
||||
partReadStream.on('end', function(){});
|
||||
var realPush = partReadStream.push;
|
||||
partReadStream.push = function fakePush() {
|
||||
realPush.apply(partReadStream, arguments);
|
||||
if (!isPausePush)
|
||||
return true;
|
||||
isPausePush = false;
|
||||
return false;
|
||||
};
|
||||
}
|
||||
function pauseAfterWrite() {
|
||||
dicer2.end(writeEnd);
|
||||
setImmediate(pauseAfterEnd);
|
||||
}
|
||||
function pauseAfterEnd() {
|
||||
assert(firedPauseCallback, 'Failed to call callback after pause');
|
||||
assert(firedPauseFinish, 'Failed to finish after pause');
|
||||
}
|
||||
function pauseFinish() {
|
||||
firedPauseFinish = true;
|
||||
}
|
||||
function pausePartCallback() {
|
||||
firedPauseCallback = true;
|
||||
}
|
68
node_modules/dicer/test/test-headerparser.js
generated
vendored
Normal file
68
node_modules/dicer/test/test-headerparser.js
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
var assert = require('assert'),
|
||||
path = require('path');
|
||||
|
||||
var HeaderParser = require('../lib/HeaderParser');
|
||||
|
||||
var DCRLF = '\r\n\r\n',
|
||||
MAXED_BUFFER = Buffer.allocUnsafe(128 * 1024);
|
||||
MAXED_BUFFER.fill(0x41); // 'A'
|
||||
|
||||
var group = path.basename(__filename, '.js') + '/';
|
||||
|
||||
[
|
||||
{ source: DCRLF,
|
||||
expected: {},
|
||||
what: 'No header'
|
||||
},
|
||||
{ source: ['Content-Type:\t text/plain',
|
||||
'Content-Length:0'
|
||||
].join('\r\n') + DCRLF,
|
||||
expected: {'content-type': [' text/plain'], 'content-length': ['0']},
|
||||
what: 'Value spacing'
|
||||
},
|
||||
{ source: ['Content-Type:\r\n text/plain',
|
||||
'Foo:\r\n bar\r\n baz',
|
||||
].join('\r\n') + DCRLF,
|
||||
expected: {'content-type': [' text/plain'], 'foo': [' bar baz']},
|
||||
what: 'Folded values'
|
||||
},
|
||||
{ source: ['Content-Type:',
|
||||
'Foo: ',
|
||||
].join('\r\n') + DCRLF,
|
||||
expected: {'content-type': [''], 'foo': ['']},
|
||||
what: 'Empty values'
|
||||
},
|
||||
{ source: MAXED_BUFFER.toString('ascii') + DCRLF,
|
||||
expected: {},
|
||||
what: 'Max header size (single chunk)'
|
||||
},
|
||||
{ source: ['ABCDEFGHIJ', MAXED_BUFFER.toString('ascii'), DCRLF],
|
||||
expected: {},
|
||||
what: 'Max header size (multiple chunks #1)'
|
||||
},
|
||||
{ source: [MAXED_BUFFER.toString('ascii'), MAXED_BUFFER.toString('ascii'), DCRLF],
|
||||
expected: {},
|
||||
what: 'Max header size (multiple chunk #2)'
|
||||
},
|
||||
].forEach(function(v) {
|
||||
var parser = new HeaderParser(),
|
||||
fired = false;
|
||||
|
||||
parser.on('header', function(header) {
|
||||
assert(!fired, makeMsg(v.what, 'Header event fired more than once'));
|
||||
fired = true;
|
||||
assert.deepEqual(header,
|
||||
v.expected,
|
||||
makeMsg(v.what, 'Parsed result mismatch'));
|
||||
});
|
||||
if (!Array.isArray(v.source))
|
||||
v.source = [v.source];
|
||||
v.source.forEach(function(s) {
|
||||
parser.push(s);
|
||||
});
|
||||
assert(fired, makeMsg(v.what, 'Did not receive header from parser'));
|
||||
});
|
||||
|
||||
function makeMsg(what, msg) {
|
||||
return '[' + group + what + ']: ' + msg;
|
||||
}
|
148
node_modules/dicer/test/test-multipart-extra-trailer.js
generated
vendored
Normal file
148
node_modules/dicer/test/test-multipart-extra-trailer.js
generated
vendored
Normal file
@ -0,0 +1,148 @@
|
||||
var Dicer = require('..');
|
||||
var assert = require('assert'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
inspect = require('util').inspect;
|
||||
|
||||
var FIXTURES_ROOT = __dirname + '/fixtures/';
|
||||
|
||||
var t = 0,
|
||||
group = path.basename(__filename, '.js') + '/';
|
||||
|
||||
var tests = [
|
||||
{ source: 'many',
|
||||
opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
|
||||
chsize: 16,
|
||||
nparts: 7,
|
||||
what: 'Extra trailer data pushed after finished'
|
||||
},
|
||||
];
|
||||
|
||||
function next() {
|
||||
if (t === tests.length)
|
||||
return;
|
||||
var v = tests[t],
|
||||
fixtureBase = FIXTURES_ROOT + v.source,
|
||||
fd,
|
||||
n = 0,
|
||||
buffer = Buffer.allocUnsafe(v.chsize),
|
||||
state = { parts: [] };
|
||||
|
||||
fd = fs.openSync(fixtureBase + '/original', 'r');
|
||||
|
||||
var dicer = new Dicer(v.opts),
|
||||
error,
|
||||
partErrors = 0,
|
||||
finishes = 0;
|
||||
|
||||
dicer.on('part', function(p) {
|
||||
var part = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
|
||||
p.on('header', function(h) {
|
||||
part.header = h;
|
||||
}).on('data', function(data) {
|
||||
// make a copy because we are using readSync which re-uses a buffer ...
|
||||
var copy = Buffer.allocUnsafe(data.length);
|
||||
data.copy(copy);
|
||||
data = copy;
|
||||
if (!part.body)
|
||||
part.body = [ data ];
|
||||
else
|
||||
part.body.push(data);
|
||||
part.bodylen += data.length;
|
||||
}).on('error', function(err) {
|
||||
part.error = err;
|
||||
++partErrors;
|
||||
}).on('end', function() {
|
||||
if (part.body)
|
||||
part.body = Buffer.concat(part.body, part.bodylen);
|
||||
state.parts.push(part);
|
||||
});
|
||||
}).on('error', function(err) {
|
||||
error = err;
|
||||
}).on('finish', function() {
|
||||
assert(finishes++ === 0, makeMsg(v.what, 'finish emitted multiple times'));
|
||||
|
||||
if (v.dicerError)
|
||||
assert(error !== undefined, makeMsg(v.what, 'Expected error'));
|
||||
else
|
||||
assert(error === undefined, makeMsg(v.what, 'Unexpected error'));
|
||||
|
||||
if (v.events && v.events.indexOf('part') > -1) {
|
||||
assert.equal(state.parts.length,
|
||||
v.nparts,
|
||||
makeMsg(v.what,
|
||||
'Part count mismatch:\nActual: '
|
||||
+ state.parts.length
|
||||
+ '\nExpected: '
|
||||
+ v.nparts));
|
||||
|
||||
if (!v.npartErrors)
|
||||
v.npartErrors = 0;
|
||||
assert.equal(partErrors,
|
||||
v.npartErrors,
|
||||
makeMsg(v.what,
|
||||
'Part errors mismatch:\nActual: '
|
||||
+ partErrors
|
||||
+ '\nExpected: '
|
||||
+ v.npartErrors));
|
||||
|
||||
for (var i = 0, header, body; i < v.nparts; ++i) {
|
||||
if (fs.existsSync(fixtureBase + '/part' + (i+1))) {
|
||||
body = fs.readFileSync(fixtureBase + '/part' + (i+1));
|
||||
if (body.length === 0)
|
||||
body = undefined;
|
||||
} else
|
||||
body = undefined;
|
||||
assert.deepEqual(state.parts[i].body,
|
||||
body,
|
||||
makeMsg(v.what,
|
||||
'Part #' + (i+1) + ' body mismatch'));
|
||||
if (fs.existsSync(fixtureBase + '/part' + (i+1) + '.header')) {
|
||||
header = fs.readFileSync(fixtureBase
|
||||
+ '/part' + (i+1) + '.header', 'binary');
|
||||
header = JSON.parse(header);
|
||||
} else
|
||||
header = undefined;
|
||||
assert.deepEqual(state.parts[i].header,
|
||||
header,
|
||||
makeMsg(v.what,
|
||||
'Part #' + (i+1)
|
||||
+ ' parsed header mismatch:\nActual: '
|
||||
+ inspect(state.parts[i].header)
|
||||
+ '\nExpected: '
|
||||
+ inspect(header)));
|
||||
}
|
||||
}
|
||||
++t;
|
||||
next();
|
||||
});
|
||||
|
||||
while (true) {
|
||||
n = fs.readSync(fd, buffer, 0, buffer.length, null);
|
||||
if (n === 0) {
|
||||
setTimeout(function() {
|
||||
dicer.write('\r\n\r\n\r\n');
|
||||
dicer.end();
|
||||
}, 50);
|
||||
break;
|
||||
}
|
||||
dicer.write(n === buffer.length ? buffer : buffer.slice(0, n));
|
||||
}
|
||||
fs.closeSync(fd);
|
||||
}
|
||||
next();
|
||||
|
||||
function makeMsg(what, msg) {
|
||||
return '[' + group + what + ']: ' + msg;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
assert(t === tests.length,
|
||||
makeMsg('_exit', 'Only ran ' + t + '/' + tests.length + ' tests'));
|
||||
});
|
228
node_modules/dicer/test/test-multipart-nolisteners.js
generated
vendored
Normal file
228
node_modules/dicer/test/test-multipart-nolisteners.js
generated
vendored
Normal file
@ -0,0 +1,228 @@
|
||||
var Dicer = require('..');
|
||||
var assert = require('assert'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
inspect = require('util').inspect;
|
||||
|
||||
var FIXTURES_ROOT = __dirname + '/fixtures/';
|
||||
|
||||
var t = 0,
|
||||
group = path.basename(__filename, '.js') + '/';
|
||||
|
||||
var tests = [
|
||||
{ source: 'many',
|
||||
opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
|
||||
chsize: 16,
|
||||
nparts: 0,
|
||||
what: 'No preamble or part listeners'
|
||||
},
|
||||
];
|
||||
|
||||
function next() {
|
||||
if (t === tests.length)
|
||||
return;
|
||||
var v = tests[t],
|
||||
fixtureBase = FIXTURES_ROOT + v.source,
|
||||
fd,
|
||||
n = 0,
|
||||
buffer = Buffer.allocUnsafe(v.chsize),
|
||||
state = { done: false, parts: [], preamble: undefined };
|
||||
|
||||
fd = fs.openSync(fixtureBase + '/original', 'r');
|
||||
|
||||
var dicer = new Dicer(v.opts),
|
||||
error,
|
||||
partErrors = 0,
|
||||
finishes = 0;
|
||||
|
||||
if (v.events && v.events.indexOf('preamble') > -1) {
|
||||
dicer.on('preamble', function(p) {
|
||||
var preamble = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
|
||||
p.on('header', function(h) {
|
||||
preamble.header = h;
|
||||
}).on('data', function(data) {
|
||||
// make a copy because we are using readSync which re-uses a buffer ...
|
||||
var copy = Buffer.allocUnsafe(data.length);
|
||||
data.copy(copy);
|
||||
data = copy;
|
||||
if (!preamble.body)
|
||||
preamble.body = [ data ];
|
||||
else
|
||||
preamble.body.push(data);
|
||||
preamble.bodylen += data.length;
|
||||
}).on('error', function(err) {
|
||||
preamble.error = err;
|
||||
}).on('end', function() {
|
||||
if (preamble.body)
|
||||
preamble.body = Buffer.concat(preamble.body, preamble.bodylen);
|
||||
if (preamble.body || preamble.header)
|
||||
state.preamble = preamble;
|
||||
});
|
||||
});
|
||||
}
|
||||
if (v.events && v.events.indexOf('part') > -1) {
|
||||
dicer.on('part', function(p) {
|
||||
var part = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
|
||||
p.on('header', function(h) {
|
||||
part.header = h;
|
||||
}).on('data', function(data) {
|
||||
// make a copy because we are using readSync which re-uses a buffer ...
|
||||
var copy = Buffer.allocUnsafe(data.length);
|
||||
data.copy(copy);
|
||||
data = copy;
|
||||
if (!part.body)
|
||||
part.body = [ data ];
|
||||
else
|
||||
part.body.push(data);
|
||||
part.bodylen += data.length;
|
||||
}).on('error', function(err) {
|
||||
part.error = err;
|
||||
++partErrors;
|
||||
}).on('end', function() {
|
||||
if (part.body)
|
||||
part.body = Buffer.concat(part.body, part.bodylen);
|
||||
state.parts.push(part);
|
||||
});
|
||||
});
|
||||
}
|
||||
dicer.on('error', function(err) {
|
||||
error = err;
|
||||
}).on('finish', function() {
|
||||
assert(finishes++ === 0, makeMsg(v.what, 'finish emitted multiple times'));
|
||||
|
||||
if (v.dicerError)
|
||||
assert(error !== undefined, makeMsg(v.what, 'Expected error'));
|
||||
else
|
||||
assert(error === undefined, makeMsg(v.what, 'Unexpected error'));
|
||||
|
||||
if (v.events && v.events.indexOf('preamble') > -1) {
|
||||
var preamble;
|
||||
if (fs.existsSync(fixtureBase + '/preamble')) {
|
||||
var prebody = fs.readFileSync(fixtureBase + '/preamble');
|
||||
if (prebody.length) {
|
||||
preamble = {
|
||||
body: prebody,
|
||||
bodylen: prebody.length,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
}
|
||||
}
|
||||
if (fs.existsSync(fixtureBase + '/preamble.header')) {
|
||||
var prehead = JSON.parse(fs.readFileSync(fixtureBase
|
||||
+ '/preamble.header', 'binary'));
|
||||
if (!preamble) {
|
||||
preamble = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: prehead
|
||||
};
|
||||
} else
|
||||
preamble.header = prehead;
|
||||
}
|
||||
if (fs.existsSync(fixtureBase + '/preamble.error')) {
|
||||
var err = new Error(fs.readFileSync(fixtureBase
|
||||
+ '/preamble.error', 'binary'));
|
||||
if (!preamble) {
|
||||
preamble = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: err,
|
||||
header: undefined
|
||||
};
|
||||
} else
|
||||
preamble.error = err;
|
||||
}
|
||||
|
||||
assert.deepEqual(state.preamble,
|
||||
preamble,
|
||||
makeMsg(v.what,
|
||||
'Preamble mismatch:\nActual:'
|
||||
+ inspect(state.preamble)
|
||||
+ '\nExpected: '
|
||||
+ inspect(preamble)));
|
||||
}
|
||||
|
||||
if (v.events && v.events.indexOf('part') > -1) {
|
||||
assert.equal(state.parts.length,
|
||||
v.nparts,
|
||||
makeMsg(v.what,
|
||||
'Part count mismatch:\nActual: '
|
||||
+ state.parts.length
|
||||
+ '\nExpected: '
|
||||
+ v.nparts));
|
||||
|
||||
if (!v.npartErrors)
|
||||
v.npartErrors = 0;
|
||||
assert.equal(partErrors,
|
||||
v.npartErrors,
|
||||
makeMsg(v.what,
|
||||
'Part errors mismatch:\nActual: '
|
||||
+ partErrors
|
||||
+ '\nExpected: '
|
||||
+ v.npartErrors));
|
||||
|
||||
for (var i = 0, header, body; i < v.nparts; ++i) {
|
||||
if (fs.existsSync(fixtureBase + '/part' + (i+1))) {
|
||||
body = fs.readFileSync(fixtureBase + '/part' + (i+1));
|
||||
if (body.length === 0)
|
||||
body = undefined;
|
||||
} else
|
||||
body = undefined;
|
||||
assert.deepEqual(state.parts[i].body,
|
||||
body,
|
||||
makeMsg(v.what,
|
||||
'Part #' + (i+1) + ' body mismatch'));
|
||||
if (fs.existsSync(fixtureBase + '/part' + (i+1) + '.header')) {
|
||||
header = fs.readFileSync(fixtureBase
|
||||
+ '/part' + (i+1) + '.header', 'binary');
|
||||
header = JSON.parse(header);
|
||||
} else
|
||||
header = undefined;
|
||||
assert.deepEqual(state.parts[i].header,
|
||||
header,
|
||||
makeMsg(v.what,
|
||||
'Part #' + (i+1)
|
||||
+ ' parsed header mismatch:\nActual: '
|
||||
+ inspect(state.parts[i].header)
|
||||
+ '\nExpected: '
|
||||
+ inspect(header)));
|
||||
}
|
||||
}
|
||||
++t;
|
||||
next();
|
||||
});
|
||||
|
||||
while (true) {
|
||||
n = fs.readSync(fd, buffer, 0, buffer.length, null);
|
||||
if (n === 0) {
|
||||
dicer.end();
|
||||
break;
|
||||
}
|
||||
dicer.write(n === buffer.length ? buffer : buffer.slice(0, n));
|
||||
}
|
||||
fs.closeSync(fd);
|
||||
}
|
||||
next();
|
||||
|
||||
function makeMsg(what, msg) {
|
||||
return '[' + group + what + ']: ' + msg;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
assert(t === tests.length,
|
||||
makeMsg('_exit', 'Only ran ' + t + '/' + tests.length + ' tests'));
|
||||
});
|
240
node_modules/dicer/test/test-multipart.js
generated
vendored
Normal file
240
node_modules/dicer/test/test-multipart.js
generated
vendored
Normal file
@ -0,0 +1,240 @@
|
||||
var Dicer = require('..');
|
||||
var assert = require('assert'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
inspect = require('util').inspect;
|
||||
|
||||
var FIXTURES_ROOT = __dirname + '/fixtures/';
|
||||
|
||||
var t = 0,
|
||||
group = path.basename(__filename, '.js') + '/';
|
||||
|
||||
var tests = [
|
||||
{ source: 'nested',
|
||||
opts: { boundary: 'AaB03x' },
|
||||
chsize: 32,
|
||||
nparts: 2,
|
||||
what: 'One nested multipart'
|
||||
},
|
||||
{ source: 'many',
|
||||
opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
|
||||
chsize: 16,
|
||||
nparts: 7,
|
||||
what: 'Many parts'
|
||||
},
|
||||
{ source: 'many-wrongboundary',
|
||||
opts: { boundary: 'LOLOLOL' },
|
||||
chsize: 8,
|
||||
nparts: 0,
|
||||
dicerError: true,
|
||||
what: 'Many parts, wrong boundary'
|
||||
},
|
||||
{ source: 'many-noend',
|
||||
opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
|
||||
chsize: 16,
|
||||
nparts: 7,
|
||||
npartErrors: 1,
|
||||
dicerError: true,
|
||||
what: 'Many parts, end boundary missing, 1 file open'
|
||||
},
|
||||
{ source: 'nested-full',
|
||||
opts: { boundary: 'AaB03x', headerFirst: true },
|
||||
chsize: 32,
|
||||
nparts: 2,
|
||||
what: 'One nested multipart with preceding header'
|
||||
},
|
||||
{ source: 'nested-full',
|
||||
opts: { headerFirst: true },
|
||||
chsize: 32,
|
||||
nparts: 2,
|
||||
setBoundary: 'AaB03x',
|
||||
what: 'One nested multipart with preceding header, using setBoundary'
|
||||
},
|
||||
];
|
||||
|
||||
function next() {
|
||||
if (t === tests.length)
|
||||
return;
|
||||
var v = tests[t],
|
||||
fixtureBase = FIXTURES_ROOT + v.source,
|
||||
n = 0,
|
||||
buffer = Buffer.allocUnsafe(v.chsize),
|
||||
state = { parts: [], preamble: undefined };
|
||||
|
||||
var dicer = new Dicer(v.opts),
|
||||
error,
|
||||
partErrors = 0,
|
||||
finishes = 0;
|
||||
|
||||
dicer.on('preamble', function(p) {
|
||||
var preamble = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
|
||||
p.on('header', function(h) {
|
||||
preamble.header = h;
|
||||
if (v.setBoundary)
|
||||
dicer.setBoundary(v.setBoundary);
|
||||
}).on('data', function(data) {
|
||||
// make a copy because we are using readSync which re-uses a buffer ...
|
||||
var copy = Buffer.allocUnsafe(data.length);
|
||||
data.copy(copy);
|
||||
data = copy;
|
||||
if (!preamble.body)
|
||||
preamble.body = [ data ];
|
||||
else
|
||||
preamble.body.push(data);
|
||||
preamble.bodylen += data.length;
|
||||
}).on('error', function(err) {
|
||||
preamble.error = err;
|
||||
}).on('end', function() {
|
||||
if (preamble.body)
|
||||
preamble.body = Buffer.concat(preamble.body, preamble.bodylen);
|
||||
if (preamble.body || preamble.header)
|
||||
state.preamble = preamble;
|
||||
});
|
||||
});
|
||||
dicer.on('part', function(p) {
|
||||
var part = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
|
||||
p.on('header', function(h) {
|
||||
part.header = h;
|
||||
}).on('data', function(data) {
|
||||
if (!part.body)
|
||||
part.body = [ data ];
|
||||
else
|
||||
part.body.push(data);
|
||||
part.bodylen += data.length;
|
||||
}).on('error', function(err) {
|
||||
part.error = err;
|
||||
++partErrors;
|
||||
}).on('end', function() {
|
||||
if (part.body)
|
||||
part.body = Buffer.concat(part.body, part.bodylen);
|
||||
state.parts.push(part);
|
||||
});
|
||||
}).on('error', function(err) {
|
||||
error = err;
|
||||
}).on('finish', function() {
|
||||
assert(finishes++ === 0, makeMsg(v.what, 'finish emitted multiple times'));
|
||||
|
||||
if (v.dicerError)
|
||||
assert(error !== undefined, makeMsg(v.what, 'Expected error'));
|
||||
else
|
||||
assert(error === undefined, makeMsg(v.what, 'Unexpected error: ' + error));
|
||||
|
||||
var preamble;
|
||||
if (fs.existsSync(fixtureBase + '/preamble')) {
|
||||
var prebody = fs.readFileSync(fixtureBase + '/preamble');
|
||||
if (prebody.length) {
|
||||
preamble = {
|
||||
body: prebody,
|
||||
bodylen: prebody.length,
|
||||
error: undefined,
|
||||
header: undefined
|
||||
};
|
||||
}
|
||||
}
|
||||
if (fs.existsSync(fixtureBase + '/preamble.header')) {
|
||||
var prehead = JSON.parse(fs.readFileSync(fixtureBase
|
||||
+ '/preamble.header', 'binary'));
|
||||
if (!preamble) {
|
||||
preamble = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: undefined,
|
||||
header: prehead
|
||||
};
|
||||
} else
|
||||
preamble.header = prehead;
|
||||
}
|
||||
if (fs.existsSync(fixtureBase + '/preamble.error')) {
|
||||
var err = new Error(fs.readFileSync(fixtureBase
|
||||
+ '/preamble.error', 'binary'));
|
||||
if (!preamble) {
|
||||
preamble = {
|
||||
body: undefined,
|
||||
bodylen: 0,
|
||||
error: err,
|
||||
header: undefined
|
||||
};
|
||||
} else
|
||||
preamble.error = err;
|
||||
}
|
||||
|
||||
assert.deepEqual(state.preamble,
|
||||
preamble,
|
||||
makeMsg(v.what,
|
||||
'Preamble mismatch:\nActual:'
|
||||
+ inspect(state.preamble)
|
||||
+ '\nExpected: '
|
||||
+ inspect(preamble)));
|
||||
|
||||
assert.equal(state.parts.length,
|
||||
v.nparts,
|
||||
makeMsg(v.what,
|
||||
'Part count mismatch:\nActual: '
|
||||
+ state.parts.length
|
||||
+ '\nExpected: '
|
||||
+ v.nparts));
|
||||
|
||||
if (!v.npartErrors)
|
||||
v.npartErrors = 0;
|
||||
assert.equal(partErrors,
|
||||
v.npartErrors,
|
||||
makeMsg(v.what,
|
||||
'Part errors mismatch:\nActual: '
|
||||
+ partErrors
|
||||
+ '\nExpected: '
|
||||
+ v.npartErrors));
|
||||
|
||||
for (var i = 0, header, body; i < v.nparts; ++i) {
|
||||
if (fs.existsSync(fixtureBase + '/part' + (i+1))) {
|
||||
body = fs.readFileSync(fixtureBase + '/part' + (i+1));
|
||||
if (body.length === 0)
|
||||
body = undefined;
|
||||
} else
|
||||
body = undefined;
|
||||
assert.deepEqual(state.parts[i].body,
|
||||
body,
|
||||
makeMsg(v.what,
|
||||
'Part #' + (i+1) + ' body mismatch'));
|
||||
if (fs.existsSync(fixtureBase + '/part' + (i+1) + '.header')) {
|
||||
header = fs.readFileSync(fixtureBase
|
||||
+ '/part' + (i+1) + '.header', 'binary');
|
||||
header = JSON.parse(header);
|
||||
} else
|
||||
header = undefined;
|
||||
assert.deepEqual(state.parts[i].header,
|
||||
header,
|
||||
makeMsg(v.what,
|
||||
'Part #' + (i+1)
|
||||
+ ' parsed header mismatch:\nActual: '
|
||||
+ inspect(state.parts[i].header)
|
||||
+ '\nExpected: '
|
||||
+ inspect(header)));
|
||||
}
|
||||
++t;
|
||||
next();
|
||||
});
|
||||
|
||||
fs.createReadStream(fixtureBase + '/original').pipe(dicer);
|
||||
}
|
||||
next();
|
||||
|
||||
function makeMsg(what, msg) {
|
||||
return '[' + group + what + ']: ' + msg;
|
||||
}
|
||||
|
||||
process.on('exit', function() {
|
||||
assert(t === tests.length,
|
||||
makeMsg('_exit', 'Only ran ' + t + '/' + tests.length + ' tests'));
|
||||
});
|
4
node_modules/dicer/test/test.js
generated
vendored
Normal file
4
node_modules/dicer/test/test.js
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
require('fs').readdirSync(__dirname).forEach(function(f) {
|
||||
if (f.substr(0, 5) === 'test-')
|
||||
require('./' + f);
|
||||
});
|
Reference in New Issue
Block a user