var delayed = function(req, res) { debug(req.path, 'waiting', script.delay); setTimeout(function() { debug(req.path, 'done waiting', script.delay); handler(req, res); }, u.ms(script.delay)); }
// only serve files in self.file$ function serve(req, res, next) { if (req.method !== 'GET' && req.method !== 'HEAD') return next(); // surprisingly (bug?) express does not auto-decode req.path var reqPath = decodeURI(req.path); var file$ = self.file$; // try straight match var spo = file$[reqPath]; if (!spo && !/\/$|\.[^\/]+$/.test(reqPath)) { // try adding trailing / and redirect if found if (self.trailingSlash) { var redir = reqPath + '/'; spo = file$[redir]; if (spo) { debug('static redirect %s %s', reqPath, redir); return res.redirect(302, redir); // use 302 to avoid browser redir caching } } // try extensions if (!spo && self.extensions) { for (var i=0; i<self.extensions.length; i++) { if (spo = file$[reqPath + self.extensions[i]]) break; } } } if (!spo) return next(); // give up if (self.noHtmlExtensions && !path.extname(spo.file)) { res.setHeader('Content-Type', 'text/html; charset=utf-8'); } debug('static %s%s', reqPath, (reqPath !== spo.file ? ' -> ' + spo.file : '')); var doit = function() { send(req, spo.file, spo.sp.sendOpts).pipe(res); } if (spo.sp.delay) return u.delay(doit, u.ms(spo.sp.delay)); doit(); }