1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | var debug = require('debug')('pub:server:pages');
|
12 | var u = require('pub-util');
|
13 | var mime = require('mime');
|
14 | var path = require('path');
|
15 | var ppath = path.posix || path;
|
16 |
|
17 | module.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 |
|
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);
|
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 | };
|