]> git.cworth.org Git - obsolete/notmuch-web/blob - node_modules/express/node_modules/connect/lib/middleware/limit.js
Install the "express" node module via npm
[obsolete/notmuch-web] / node_modules / express / node_modules / connect / lib / middleware / limit.js
1
2 /*!
3  * Connect - limit
4  * Copyright(c) 2011 TJ Holowaychuk
5  * MIT Licensed
6  */
7
8 /**
9  * Limit request bodies to the given size in `bytes`.
10  *
11  * A string representation of the bytesize may also be passed,
12  * for example "5mb", "200kb", "1gb", etc.
13  *
14  * Examples:
15  *
16  *     var server = connect(
17  *       connect.limit('5.5mb')
18  *     ).listen(3000);
19  *
20  * TODO: pause EV_READ
21  *
22  * @param {Number|String} bytes
23  * @return {Function}
24  * @api public
25  */
26
27 module.exports = function limit(bytes){
28   if ('string' == typeof bytes) bytes = parse(bytes);
29   if ('number' != typeof bytes) throw new Error('limit() bytes required');
30   return function limit(req, res, next){
31     var received = 0
32       , len = req.headers['content-length']
33         ? parseInt(req.headers['content-length'], 10)
34         : null;
35
36     // deny the request
37     function deny() {
38       req.destroy();
39     }
40
41     // self-awareness
42     if (req._limit) return next();
43     req._limit = true;
44
45     // limit by content-length
46     if (len && len > bytes) deny();
47
48     // limit
49     req.on('data', function(chunk){
50       received += chunk.length;
51       if (received > bytes) deny();
52     });
53
54     next();
55   };
56 };
57
58 /**
59  * Parse byte `size` string.
60  *
61  * @param {String} size
62  * @return {Number}
63  * @api private
64  */
65
66 function parse(size) {
67   var parts = size.match(/^(\d+(?:\.\d+)?) *(kb|mb|gb)$/)
68     , n = parseFloat(parts[1])
69     , type = parts[2];
70
71   var map = {
72       kb: 1024
73     , mb: 1024 * 1024
74     , gb: 1024 * 1024 * 1024
75   };
76
77   return map[type] * n;
78 }