UNPKG

2.31 kBJavaScriptView Raw
1/*
2 * pub-server serve-pages.js
3 *
4 * serves dynamically rendered pages
5 * with page http-headers, checks http methods
6 * also serves redirects
7 *
8 * copyright 2015, Jurgen Leschner - github.com/jldec - MIT license
9 */
10
11var debug = require('debug')('pub:server:pages');
12var u = require('pub-util');
13var mime = require('mime');
14var path = require('path');
15
16module.exports = function servePages(server) {
17
18 var generator = server.generator;
19 var opts = server.opts;
20
21 server.isPageAuthorized = isPageAuthorized;
22
23 server.app.use(pages);
24 server.app.use(redirects);
25
26 //--//--//--//--//--//--//--//--//--//--//--//--//--//
27
28 function pages(req, res, next) {
29
30 generator.getPage(req.url, function(err, page) {
31
32 if (err || !page || !checkMethod(req, page)) return next();
33
34 if (!isPageAuthorized(req, page)) {
35 if (!server.login || page.nologin) return next();
36 return server.login(req, res);
37 }
38
39 debug('page %s', page._href);
40
41 // make req and res available to dynamic pages
42 generator.req = req;
43 generator.res = res;
44
45 resHeaders(res, page)
46 res.send(generator.renderDoc(page));
47
48 });
49 }
50
51 function isPageAuthorized(req, page) {
52 return (!page.access && opts.publicPages) ||
53 (page.access === 'everyone') ||
54 (server.isAuthorized &&
55 server.isAuthorized(page.access, req.user));
56 }
57
58 function checkMethod(req, page) {
59 return page.postonly ? /POST/i.test(req.method) :
60 page.postandget ? /POST|GET|HEAD/i.test(req.method) :
61 /GET|HEAD/i.test(req.method);
62 }
63
64 function resHeaders(res, page) {
65 var headers = page['http-header'];
66 if (typeof headers === 'string') { headers = [ headers ]; }
67 u.each(headers, function(s) {
68 var m = s.match(/^\s*([^:]+?)\s*:\s*(\S.*?)\s*$/);
69 if (m) { res.set(m[1], m[2]); }
70 });
71
72 var ext = path.extname(page._href);
73 if (!ext || res.getHeader('Content-Type')) return;
74 res.set('Content-Type', mime.lookup(ext));
75 }
76
77 function redirects(req, res, next) {
78 var newUrl = generator.redirect(req.url); // returns {status:, url:} or null
79 if (!newUrl) return next();
80 debug('%s redirect %s to %s', newUrl.status, req.url, newUrl.url);
81 res.redirect(newUrl.status, newUrl.url);
82 }
83
84}
\No newline at end of file