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 |
|
16 | module.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 |
|
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);
|
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 |