UNPKG

2.35 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-2020, Jürgen 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');
15var ppath = path.posix || path;
16
17module.exports = function servePages(server) {
18
19 var generator = server.generator;
20 var opts = server.opts;
21
22 server.isPageAuthorized = isPageAuthorized;
23
24 server.app.use(pages);
25 server.app.use(redirects);
26
27 //--//--//--//--//--//--//--//--//--//--//--//--//--//
28
29 function pages(req, res, next) {
30
31 generator.getPage(req.url, function(err, page) {
32
33 if (err || !page || !checkMethod(req, page)) return next();
34
35 if (!isPageAuthorized(req, page)) {
36 if (!server.login || page.nologin) return next();
37 return server.login(req, res);
38 }
39
40 debug('page %s', page._href);
41
42 // make req and res available to dynamic pages
43 generator.req = req;
44 generator.res = res;
45
46 resHeaders(res, page);
47 res.send(generator.renderDoc(page));
48
49 });
50 }
51
52 function isPageAuthorized(req, page) {
53 return (!page.access && opts.publicPages) ||
54 (page.access === 'everyone') ||
55 (server.isAuthorized &&
56 server.isAuthorized(page.access, req.user));
57 }
58
59 function checkMethod(req, page) {
60 return page.postonly ? /POST/i.test(req.method) :
61 page.postandget ? /POST|GET|HEAD/i.test(req.method) :
62 /GET|HEAD/i.test(req.method);
63 }
64
65 function resHeaders(res, page) {
66 var headers = page['http-header'];
67 if (typeof headers === 'string') { headers = [ headers ]; }
68 u.each(headers, function(s) {
69 var m = s.match(/^\s*([^:]+?)\s*:\s*(\S.*?)\s*$/);
70 if (m) { res.set(m[1], m[2]); }
71 });
72
73 var ext = ppath.extname(page._href);
74 if (!ext || res.getHeader('Content-Type')) return;
75 res.set('Content-Type', mime.getType(ext));
76 }
77
78 function redirects(req, res, next) {
79 var newUrl = generator.redirect(req.url); // returns {status:, url:} or null
80 if (!newUrl) return next();
81 debug('%s redirect %s to %s', newUrl.status, req.url, newUrl.url);
82 res.redirect(newUrl.status, newUrl.url);
83 }
84
85};