1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | 'use strict';
|
7 |
|
8 | var fs = require('fs');
|
9 | var path = require('path');
|
10 | var URL = require('url');
|
11 | var defaults = require('../constants').defaults;
|
12 |
|
13 | var MIME_TYPE = {
|
14 | 'html': 'text/html',
|
15 | 'js': 'text/javascript'
|
16 | };
|
17 |
|
18 | var resolvePath = function (file) {
|
19 | return path.resolve(__dirname, file);
|
20 | };
|
21 |
|
22 | var assets = {
|
23 | 'end_of_popup_response.html': fs.readFileSync(resolvePath('./end_of_popup_response.html')).toString(),
|
24 | 'end_of_popup_response.js': fs.readFileSync(resolvePath('./end_of_popup_response.js')).toString(),
|
25 | 'end_of_redirect_response.html': fs.readFileSync(resolvePath('./end_of_redirect_response.html')).toString(),
|
26 | 'end_of_redirect_response.js': fs.readFileSync(resolvePath('./end_of_redirect_response.js')).toString()
|
27 | };
|
28 |
|
29 | var escape = function (s) {
|
30 | if (s) {
|
31 | return s.replace(/&/g, '&').
|
32 | replace(/</g, '<').
|
33 | replace(/>/g, '>').
|
34 | replace(/\'/g, '"').
|
35 | replace(/\'/g, ''').
|
36 | replace(/\//g, '/');
|
37 | }
|
38 | return s;
|
39 | };
|
40 |
|
41 | var escapeConfigs = function (configs) {
|
42 | Object.keys(configs).forEach(function (field) {
|
43 | var s = configs[field];
|
44 | if (typeof s === 'string') {
|
45 | configs[field] = escape(s);
|
46 | }
|
47 | });
|
48 | return configs;
|
49 | };
|
50 |
|
51 | var rootUrlPrefix;
|
52 |
|
53 | module.exports = {
|
54 | assets: assets,
|
55 | replaceRootUrlPrefix: function (prefix) {
|
56 | rootUrlPrefix = prefix || '';
|
57 | rootUrlPrefix += defaults.assetsUri;
|
58 | Object.keys(assets).filter(function (name) {
|
59 | return /\.html$/.test(name);
|
60 | }).forEach(function (name) {
|
61 | assets[name] = assets[name].replace(/##ROOT_URL_PATH_PREFIX##/, rootUrlPrefix);
|
62 | });
|
63 | return rootUrlPrefix;
|
64 | },
|
65 | getTemplate: function (loginStyle, configs) {
|
66 | var html = loginStyle === 'popup' ? 'end_of_popup_response' : 'end_of_redirect_response';
|
67 | return assets[html + '.html']
|
68 | .replace(/##CONFIG##/, JSON.stringify(escapeConfigs(configs)));
|
69 | },
|
70 | middleware: function () {
|
71 | var assetsPathname = URL.parse(rootUrlPrefix).pathname;
|
72 | return function (req, res, next) {
|
73 | var urlObj = URL.parse(req.url);
|
74 | if (!new RegExp(`^${assetsPathname}\/\\w+\.js$`).test(urlObj.pathname) ||
|
75 | req.method.toUpperCase() !== 'GET') {
|
76 | return next();
|
77 | }
|
78 |
|
79 | var filename = /(\w+\.\w+)$/.exec(req.url)[1];
|
80 |
|
81 | var ext = path.extname(filename);
|
82 | ext = ext ? ext.slice(1) : 'unknown';
|
83 |
|
84 | var assetsText = assets[filename];
|
85 |
|
86 | if (!assetsText) {
|
87 | assetsText = '<h1>500</h1>服务器内部错误!';
|
88 | } else {
|
89 | res.writeHead(200, {'content-type': MIME_TYPE[ext] || 'text/plain'});
|
90 | }
|
91 |
|
92 | res.end(assetsText);
|
93 | };
|
94 | }
|
95 | };
|