middleware
Version:
ERROR: No README.md file found!
74 lines (64 loc) • 2.19 kB
JavaScript
var path = require('path'),
fs = require('fs'),
url = require('url'),
utils = require('./utils')
module.exports = function (dir, prefix) {
return function (request, response, next) {
var filename,
pathname = url.parse(request.url).pathname;
pathname = pathname.replace(/\.\.+/g, '.');
if (prefix) {
var index = pathname.indexOf(prefix);
if (index > -1) {
filename = pathname.slice(prefix.length);
} else {
return next();
}
} else {
filename = pathname;
}
// Serve the file :)
filename = path.join(dir, filename);
fs.stat(filename, function (error, stat) {
// Go to the next layer if we can't serve anything.
if (error) {
return next();
} else if (!stat.isFile()) {
return next();
}
if (request.headers['if-modified-since']) {
var if_modified_since = new Date(request.headers['if-modified-since']);
if (stat.mtime.getTime() <= if_modified_since.getTime()) {
response.writeHead(304, utils.mergeDefaultHeaders({
'Expires': new Date(Date.now() + 31536000000).toUTCString(),
'Cache-Control': 'public max-age=' + 31536000
}));
return response.end();
}
}
// Stream the file
var headers = utils.mergeDefaultHeaders({
'Content-Type': utils.mime.type(filename),
'Content-Length': stat.size,
'Last-Modified': stat.mtime.toUTCString(),
'Expires': new Date(Date.now() + 31536000000).toUTCString(),
'Cache-Control': 'public max-age=' + 31536000
}), read_opts = {
bufferSize: 1024 * 64
};
if (request.headers['range']) {
read_opts = utils.setRangeHeaders(request, stat, headers);
response.writeHead(206, headers);
} else {
response.writeHead(200, headers);
}
if (request.method === 'HEAD') return response.end();
var file_stream = fs.createReadStream(filename, read_opts);
file_stream.addListener('error', function (error) {
file_stream.end();
next(error);
});
file_stream.pipe(response);
});
};
};