Skip to content

Commit

Permalink
re-use caching logic
Browse files Browse the repository at this point in the history
  • Loading branch information
Raynos committed Feb 9, 2015
1 parent 69fa1ed commit 0b40557
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 40 deletions.
65 changes: 27 additions & 38 deletions index.js
@@ -1,58 +1,47 @@
var rawBody = require("raw-body")
var cache = require("continuable-cache")

var parseArguments = require("./parse-arguments.js")

var ONE_MB = 1024 * 1024
var RAW_BODY_EVENT = '__rawBodyRead__';
var THUNK_KEY = '__npm_body_thunk_cache__';

module.exports = body

function parseBodyThunk(req, res, opts) {
return function thunk(callback) {
var limit = "limit" in opts ? opts.limit : ONE_MB
var contentLength = req.headers ?
Number(req.headers["content-length"]) : null;

rawBody(req, {
limit: limit,
length: contentLength,
encoding: "encoding" in opts ? opts.encoding : true
}, callback);
};
}

function body(req, res, opts, callback) {
var args = parseArguments(req, res, opts, callback)
req = args.req
res = args.res
opts = args.opts
callback = args.callback

if (!callback) {
return body.bind(null, req, res, opts)
}

var limit = "limit" in opts ? opts.limit : ONE_MB
var contentLength = req.headers ?
Number(req.headers["content-length"]) : null;
var thunk;

if (opts.cache) {
if (req.__rawBody__) {
process.nextTick(function() {
callback(null, req.__rawBody__);
});
return;
}

if (req.listeners(RAW_BODY_EVENT).length > 0) {
req.on(RAW_BODY_EVENT, callback);
return;
}
var thunk = req[THUNK_KEY] ||
cache(parseBodyThunk(req, res, opts));
req[THUNK_KEY] = thunk;
} else {
thunk = parseBodyThunk(req, res, opts);
}

if (!callback) {
return thunk;
}

req.on(RAW_BODY_EVENT, callback);

rawBody(req, {
limit: limit,
length: contentLength,
encoding: "encoding" in opts ? opts.encoding : true
}, function onRawBody(err, string) {
if (!err && opts.cache) {
Object.defineProperty(req, '__rawBody__', {
configurable: true,
enumerable: false,
value: string
});
}

// Cleanup regardless of cache option
req.emit(RAW_BODY_EVENT, err, string);
req.removeAllListeners(RAW_BODY_EVENT);
});
thunk(callback);
}
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -17,6 +17,7 @@
"email": "raynos2@gmail.com"
},
"dependencies": {
"continuable-cache": "^0.3.1",
"error": "~2.0.4",
"raw-body": "~1.1.0",
"safe-json-parse": "~1.0.1"
Expand Down
4 changes: 2 additions & 2 deletions test/unit.js
Expand Up @@ -15,8 +15,8 @@ test('caching works', function t(assert) {

var done = after(2, assert.end.bind(assert));

body(request, response, { cache: true }, function onBody() {
assert.equal(request.__rawBody__, 'thisbody', 'raw body has been set');
body(request, response, { cache: true }, function onBody(err, body) {
assert.equal(body, 'thisbody', 'raw body has been set');
assert.pass('body is parsed');
done();
});
Expand Down

0 comments on commit 0b40557

Please sign in to comment.