• Stars
    star
    186
  • Rank 206,495 (Top 5 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 11 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A very fast streaming multipart parser for node.js

Description

A very fast streaming multipart parser for node.js.

Benchmarks can be found here.

Requirements

Install

npm install dicer

Examples

  • Parse an HTTP form upload
const { inspect } = require('util');
const http = require('http');

const Dicer = require('dicer');

// Quick and dirty way to parse multipart boundary
const RE_BOUNDARY =
  /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i;
const 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>
`);
const PORT = 8080;

http.createServer((req, res) => {
  let m;
  if (req.method === 'POST'
      && req.headers['content-type']
      && (m = RE_BOUNDARY.exec(req.headers['content-type']))) {
    const d = new Dicer({ boundary: m[1] || m[2] });

    d.on('part', (p) => {
      console.log('New part!');
      p.on('header', (header) => {
        for (const h in header) {
          console.log(
            `Part header: k: ${inspect(h)}, v: ${inspect(header[h])}`
          );
        }
      });
      p.on('data', (data) => {
        console.log(`Part data: ${inspect(data.toString())}`);
      });
      p.on('end', () => {
        console.log('End of part\n');
      });
    });
    d.on('finish', () => {
      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, () => {
  console.log(`Listening for requests on port ${PORT}`);
});

API

Dicer is a Writable stream

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 Readable stream

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.

More Repositories

1

ssh2

SSH2 client and server modules written in pure JavaScript for node.js
JavaScript
5,493
star
2

busboy

A streaming parser for HTML form data for node.js
JavaScript
2,825
star
3

node-imap

An IMAP client module for node.js.
JavaScript
2,149
star
4

node-ftp

An FTP client module for node.js
JavaScript
1,128
star
5

mmmagic

An async libmagic binding for node.js for detecting content types by data inspection
C++
617
star
6

node-mariasql

A node.js binding to MariaDB's non-blocking (MySQL-compatible) client library
C++
485
star
7

socksv5

SOCKS protocol version 5 server and client implementations for node.js
JavaScript
400
star
8

node-ncurses

An ncurses binding for node.js
C++
385
star
9

cap

A cross-platform binding for performing packet capturing with node.js
JavaScript
360
star
10

ssh2-streams

SSH2 and SFTP client/server protocol streams for node.js
JavaScript
204
star
11

node-xxhash

An xxhash binding for node.js
C++
193
star
12

sipster

A pjsip/pjsua2 binding for node.js
C++
190
star
13

httpolyglot

Serve http and https connections over the same port with node.js
JavaScript
181
star
14

connect-busboy

Connect middleware for busboy
JavaScript
155
star
15

node-asterisk

An Asterisk module for node.js
JavaScript
96
star
16

spellcheck

An async hunspell binding for node.js
C++
82
star
17

node-nntp

An NNTP client module for node.js
JavaScript
74
star
18

streamsearch

Streaming Boyer-Moore-Horspool searching for node.js
JavaScript
69
star
19

node-rtp

An RTP module in pure JavaScript for node.js
JavaScript
59
star
20

node-oscar

An OSCAR protocol client module for node.js
JavaScript
54
star
21

cpu-features

A simple node.js binding to Google's cpu_features library for obtaining information about installed CPU(s)
C++
40
star
22

node-pcre

A pcre binding for node.js
C++
39
star
23

esqlite

An SQLite binding for node.js with built-in encryption, focused on simplicity and (async) performance
C++
36
star
24

base91.js

basE91 encoding/decoding for node.js and browsers
JavaScript
31
star
25

bellhop

A node.js module that exposes streams for doing Pubsub and RPC.
JavaScript
28
star
26

ssh-repl

SSH into your node.js process and access a REPL
JavaScript
26
star
27

groan

A PHP session file parser written in JavaScript
JavaScript
24
star
28

paclient

PulseAudio client written in pure JavaScript for node.js
JavaScript
23
star
29

pg2

A PostgreSQL driver for node.js that focuses on performance
JavaScript
21
star
30

pmq

A node.js addon for using POSIX message queues
C++
19
star
31

grappler

A minimalistic server for "comet" connections in Node.js.
JavaScript
19
star
32

reformed

A high-level form field handling and validation module for busboy
JavaScript
18
star
33

zup

A simple, fast template engine for node.js
JavaScript
15
star
34

express-optimized

A minimal, optimized version of Express
JavaScript
13
star
35

xfer

Simple binary TLV reader/writer for node.js
JavaScript
12
star
36

youknow

A realtime, multiplayer card game for node.js that supports multiple frontends
JavaScript
11
star
37

odroid-c2-minimal-debian-ubuntu

Fork of various scripts to setup a minimal debian/ubuntu installation for the odroid c2
Shell
8
star
38

print

A node.js module for communicating with printers
JavaScript
7
star
39

filebounce

A server for bouncing files from point A to point B
JavaScript
7
star
40

node-poormansmysql

MySQL driver module for node.js that executes queries using the mysql command-line client.
JavaScript
7
star
41

buffy

Access and manipulate multiple node.js Buffers as if they were one continuous Buffer
JavaScript
6
star
42

nodebench

Node.js Benchmark Results
HTML
6
star
43

xsys

A node.js binding to useful system-level functions
C++
5
star
44

speaky

A binding to the SVOX Pico engine (libttspico) for performing text-to-speech
C++
4
star
45

lrused

An LRU cache for node.js
JavaScript
4
star
46

conveyor

Feed multiple node.js streams sequentially into one stream
JavaScript
3
star
47

benchd

Benchmark JavaScript code across different node.js/io.js versions from the browser
JavaScript
3
star
48

beepjs

A BEEP protocol implementation for node.js
JavaScript
3
star
49

vermal

A VRML 1.0 push parser for node.js
JavaScript
2
star
50

datatables.sortpriorities

Display column sort orders in your Datatables table headers
JavaScript
1
star
51

build-addons

Build node.js addon binaries for releases using Github Actions
JavaScript
1
star
52

buildcheck

Build environment checking (a la autoconf) for node.js
JavaScript
1
star