1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | var raw = require('raw-body');
|
7 | var inflate = require('inflation');
|
8 |
|
9 |
|
10 |
|
11 | var strictJSONReg = /^[\x20\x09\x0a\x0d]*(\[|\{)/;
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | module.exports = function(req, opts){
|
26 | req = req.req || req;
|
27 | opts = opts || {};
|
28 |
|
29 |
|
30 | var len = req.headers['content-length'];
|
31 | var encoding = req.headers['content-encoding'] || 'identity';
|
32 | if (len && encoding === 'identity') opts.length = len = ~~len;
|
33 | opts.encoding = opts.encoding || 'utf8';
|
34 | opts.limit = opts.limit || '1mb';
|
35 | var strict = opts.strict !== false;
|
36 |
|
37 |
|
38 | return Promise.resolve()
|
39 | .then(function() {
|
40 | return raw(inflate(req), opts);
|
41 | })
|
42 | .then(function(str) {
|
43 | try {
|
44 | return parse(str);
|
45 | } catch (err) {
|
46 | err.status = 400;
|
47 | err.body = str;
|
48 | throw err;
|
49 | }
|
50 | });
|
51 |
|
52 | function parse(str){
|
53 | if (!strict) return str ? JSON.parse(str) : str;
|
54 |
|
55 | if (!str) return {};
|
56 |
|
57 | if (!strictJSONReg.test(str)) {
|
58 | throw new Error('invalid JSON, only supports object and array');
|
59 | }
|
60 | return JSON.parse(str);
|
61 | }
|
62 | };
|