not-modified
Version:
HTTP cache validator
47 lines (37 loc) • 1.17 kB
JavaScript
var crypto = require('crypto');
var fs = require('fs');
function notModified(req, res, mtime) {
var etag = (mtime - 0).toString(16);
return notModified.compare(req, res, etag);
}
notModified.compare = function(req, res, etag) {
res.setHeader('ETag', '"' + etag + '"');
var ifnonematch = req.headers['if-none-match'];
if (ifnonematch && ifnonematch.indexOf(etag) != -1) {
res.statusCode = 304;
return true;
}
return false;
};
notModified.ex = function(req, res, files, data, cb) {
if (!files) {
files = [];
} else if (files.constructor == String) {
files = [files];
}
var hash = crypto.createHash('md5');
files.map(function(file) {
hash.update(notModified.fileHash(file));
});
data && hash.update(JSON.stringify(data), 'utf8');
var etag = hash.digest('hex');
cb(null, notModified.compare(req, res, etag));
};
notModified.fileHash = function(file) {
if (notModified.fileHashCache[file])
return notModified.fileHashCache[file];
notModified.fileHashCache[file] = crypto.createHash('md5').update(fs.readFileSync(file)).digest();
return notModified.fileHashCache[file];
};
notModified.fileHashCache = {};
module.exports = notModified;