|
|
/*! * Connect - static * Copyright(c) 2010 Sencha Inc. * Copyright(c) 2011 TJ Holowaychuk * MIT Licensed */
/** * Module dependencies. */
var send = require('send') , utils = require('../utils') , parse = utils.parseUrl , url = require('url');
/** * Static: * * Static file server with the given `root` path. * * Examples: * * var oneDay = 86400000; * * connect() * .use(connect.static(__dirname + '/public')) * * connect() * .use(connect.static(__dirname + '/public', { maxAge: oneDay })) * * Options: * * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0 * - `hidden` Allow transfer of hidden files. defaults to false * - `redirect` Redirect to trailing "/" when the pathname is a dir. defaults to true * - `index` Default file name, defaults to 'index.html' * * @param {String} root * @param {Object} options * @return {Function} * @api public */
exports = module.exports = function(root, options){ options = options || {};
// root required
if (!root) throw new Error('static() root path required');
// default redirect
var redirect = false !== options.redirect;
return function static(req, res, next) { if ('GET' != req.method && 'HEAD' != req.method) return next(); var path = parse(req).pathname; var pause = utils.pause(req);
function resume() { next(); pause.resume(); }
function directory() { if (!redirect) return resume(); var pathname = url.parse(req.originalUrl).pathname; res.statusCode = 301; res.setHeader('Location', pathname + '/'); res.end('Redirecting to ' + utils.escape(pathname) + '/'); }
function error(err) { if (404 == err.status) return resume(); next(err); }
send(req, path) .maxage(options.maxAge || 0) .root(root) .index(options.index || 'index.html') .hidden(options.hidden) .on('error', error) .on('directory', directory) .pipe(res); }; };
/** * Expose mime module. * * If you wish to extend the mime table use this * reference to the "mime" module in the npm registry. */
exports.mime = send.mime;
|