route.js 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. 'use strict';
  2. var pathFn = require('path');
  3. var mime = require('mime');
  4. module.exports = function(app) {
  5. var config = this.config;
  6. var args = this.env.args || {};
  7. var root = config.root;
  8. var route = this.route;
  9. if (args.s || args.static) return;
  10. app.use(root, function(req, res, next) {
  11. var method = req.method;
  12. if (method !== 'GET' && method !== 'HEAD') return next();
  13. var url = route.format(decodeURIComponent(req.url));
  14. var data = route.get(url);
  15. var extname = pathFn.extname(url);
  16. // When the URL is `foo/index.html` but users access `foo`, redirect to `foo/`.
  17. if (!data) {
  18. if (extname) return next();
  19. url = encodeURI(url);
  20. res.statusCode = 302;
  21. res.setHeader('Location', root + url + '/');
  22. res.end('Redirecting');
  23. return;
  24. }
  25. res.setHeader('Content-Type', extname ? mime.lookup(extname) : 'application/octet-stream');
  26. if (method === 'GET') {
  27. data.pipe(res).on('error', next);
  28. } else {
  29. res.end();
  30. }
  31. });
  32. };