123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /*!
- * Connect - favicon
- * Copyright(c) 2010 Sencha Inc.
- * Copyright(c) 2011 TJ Holowaychuk
- * MIT Licensed
- */
- /**
- * Module dependencies.
- */
- var crypto = require('crypto')
- , fs = require('fs');
- /**
- * Favicon cache.
- */
- var icon;
- /**
- * Return md5 hash of the given string and optional encoding,
- * defaulting to hex.
- *
- * utils.md5('wahoo');
- * // => "e493298061761236c96b02ea6aa8a2ad"
- *
- * @param {String} str
- * @param {String} encoding
- * @return {String}
- * @api public
- */
- exports.md5 = function (str, encoding) {
- return crypto
- .createHash('md5')
- .update(str)
- .digest(encoding || 'hex');
- };
- /**
- * By default serves the connect favicon, or the favicon
- * located by the given `path`.
- *
- * Options:
- *
- * - `maxAge` cache-control max-age directive, defaulting to 1 day
- *
- * Examples:
- *
- * connect.createServer(
- * connect.favicon()
- * );
- *
- * connect.createServer(
- * connect.favicon(__dirname + '/public/favicon.ico')
- * );
- *
- * @param {String} path
- * @param {Object} options
- * @return {Function}
- * @api public
- */
- module.exports = function favicon(path, options) {
- var options = options || {}
- , path = path || __dirname + '/../public/favicon.ico'
- , maxAge = options.maxAge || 86400000;
- return function favicon(req, res, next) {
- if ('/favicon.ico' == req.url) {
- if (icon) {
- res.writeHead(200, icon.headers);
- res.end(icon.body);
- } else {
- fs.readFile(path, function (err, buf) {
- if (err) return next(err);
- icon = {
- headers: {
- 'Content-Type': 'image/x-icon'
- , 'Content-Length': buf.length
- , 'ETag': '"' + exports.md5(buf) + '"'
- , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)
- },
- body: buf
- };
- res.writeHead(200, icon.headers);
- res.end(icon.body);
- });
- }
- } else {
- next();
- }
- };
- };
|