use arrays instead of maps
This commit is contained in:
parent
0103ae02d4
commit
df8cb8d96f
|
@ -48,32 +48,51 @@
|
||||||
<div class="input-group" ng-init="siteconf = vm.config.global">
|
<div class="input-group" ng-init="siteconf = vm.config.global">
|
||||||
<h1>Global Settings:</h1>
|
<h1>Global Settings:</h1>
|
||||||
<br/>
|
<br/>
|
||||||
<div ng-repeat="(pathname, modules) in siteconf.paths">Pathname:
|
<div ng-repeat="path in siteconf.paths">Pathname:
|
||||||
<input class="form-control" ng-model="pathname" />
|
<input class="form-control" ng-model="path.$id" />
|
||||||
<div ng-repeat="(modulename, module) in modules">Modulename: {{modulename}}
|
<div ng-repeat="module in path.modules">Modulename: {{module.$id}}
|
||||||
<div ng-repeat="target in modules">Target:
|
<div ng-repeat="(key, value) in module">{{key}}:
|
||||||
<input class="form-control" ng-model="target" />
|
<input class="form-control" ng-model="value" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1>Per-Domain Settings:</h1>
|
<h1>Per-Domain Settings:</h1>
|
||||||
<div class="input-group" ng-repeat="(sitename, siteconf) in vm.config.sites">
|
<div class="input-group" ng-repeat="siteconf in vm.config.sites">
|
||||||
<label>Hostname:</label> <input class="form-control" ng-model="sitename" />
|
<label>Hostname:</label> <input class="form-control" ng-model="sitename" />
|
||||||
<br/>
|
<br/>
|
||||||
<div ng-repeat="(pathname, modules) in siteconf.paths">Pathname:
|
<div ng-repeat="path in siteconf.paths">Pathname:
|
||||||
<input class="form-control" ng-model="pathname" />
|
<input class="form-control" ng-model="path.$id" />
|
||||||
<div ng-repeat="(modulename, module) in modules">Modulename: {{modulename}}
|
<div ng-repeat="module in path.modules">Modulename: {{module.$id}}
|
||||||
<div ng-repeat="target in modules">Target:
|
<div ng-repeat="(key, value) in module">{{key}}:
|
||||||
<input class="form-control" ng-model="target" />
|
<input class="form-control" ng-model="value" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<pre><code ng-bind="vm.config | json">{{vm.config}}</code></pre>
|
<div class="input-group" ng-init="defaultsconf = vm.config.defaults">
|
||||||
|
<h1>Fallback Settings:</h1>
|
||||||
|
<br/>
|
||||||
|
<div ng-repeat="path in defaultsconf.paths">Pathname:
|
||||||
|
<input class="form-control" ng-model="path.$id" />
|
||||||
|
<div ng-repeat="module in path.modules">Modulename: {{module.$id}}
|
||||||
|
<div ng-repeat="(key, value) in module">{{key}}:
|
||||||
|
<input class="form-control" ng-model="value" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ng-if="!vm._showvmconfig">
|
||||||
|
<button class="btn-link" ng-click="vm._showvmconfig = true">show config as json</button>
|
||||||
|
</div>
|
||||||
|
<div ng-if="vm._showvmconfig">
|
||||||
|
<button class="btn-link" ng-click="vm._showvmconfig = false">hide config</button>
|
||||||
|
<pre><code ng-bind="vm.config | json">{{vm.config}}</code></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -94,20 +94,10 @@ function createServer(port, _delete_me_, content, opts) {
|
||||||
var app = require('../lib/app.js');
|
var app = require('../lib/app.js');
|
||||||
|
|
||||||
var directive = {
|
var directive = {
|
||||||
content: content
|
global: opts.global
|
||||||
, livereload: opts.livereload
|
|
||||||
, global: {
|
|
||||||
greenlock: { email: opts.email, tos: opts.tos }
|
|
||||||
, rvpn: { email: opts.email, tos: opts.tos }
|
|
||||||
, paths: {
|
|
||||||
'/assets/': { serve: [ opts.assetsPath ] }
|
|
||||||
// TODO figure this b out
|
|
||||||
, '/.well-known/': { serve: [ path.resolve(opts.assetsPath, 'well-known') ] }
|
|
||||||
, '/': { serve: [ opts.webRoot ], indexes: [ opts.webRoot ] }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
, sites: opts.sites
|
, sites: opts.sites
|
||||||
, expressApp: opts.expressApp
|
, defaults: opts.defaults
|
||||||
|
, cwd: process.cwd()
|
||||||
};
|
};
|
||||||
var server;
|
var server;
|
||||||
var insecureServer;
|
var insecureServer;
|
||||||
|
@ -260,13 +250,15 @@ function run() {
|
||||||
var argv = minimist(process.argv.slice(2));
|
var argv = minimist(process.argv.slice(2));
|
||||||
var port = parseInt(argv.p || argv.port || argv._[0], 10) || httpsPort;
|
var port = parseInt(argv.p || argv.port || argv._[0], 10) || httpsPort;
|
||||||
var livereload = argv.livereload;
|
var livereload = argv.livereload;
|
||||||
var defaultWebRoot = path.resolve(argv['default-web-root'] || argv.d || argv._[1] || process.cwd());
|
var defaultWebRoot = path.normalize(argv['default-web-root'] || argv.d || argv._[1] || '.');
|
||||||
|
var assetsPath = path.join(__dirname, '..', 'packages', 'assets');
|
||||||
var content = argv.c;
|
var content = argv.c;
|
||||||
var letsencryptHost = argv['letsencrypt-certs'];
|
var letsencryptHost = argv['letsencrypt-certs'];
|
||||||
var yaml = require('js-yaml');
|
var yaml = require('js-yaml');
|
||||||
var fs = PromiseA.promisifyAll(require('fs'));
|
var fs = PromiseA.promisifyAll(require('fs'));
|
||||||
var configFile = argv.c || argv.conf || argv.config;
|
var configFile = argv.c || argv.conf || argv.config;
|
||||||
var config;
|
var config;
|
||||||
|
console.log('defaultWebRoot', defaultWebRoot);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
config = fs.readFileSync(configFile || 'Goldilocks.yml');
|
config = fs.readFileSync(configFile || 'Goldilocks.yml');
|
||||||
|
@ -383,7 +375,8 @@ function run() {
|
||||||
|
|
||||||
|
|
||||||
opts.cwd = process.cwd();
|
opts.cwd = process.cwd();
|
||||||
opts.sites = {};
|
opts.sites = [];
|
||||||
|
opts.sites._map = {};
|
||||||
|
|
||||||
if (argv.sites) {
|
if (argv.sites) {
|
||||||
opts._externalHost = false;
|
opts._externalHost = false;
|
||||||
|
@ -394,48 +387,86 @@ function run() {
|
||||||
|
|
||||||
opts._externalHost = opts._externalHost || !/(^|\.)localhost\./.test(servername);
|
opts._externalHost = opts._externalHost || !/(^|\.)localhost\./.test(servername);
|
||||||
// TODO allow reverse proxy
|
// TODO allow reverse proxy
|
||||||
if (!opts.sites[servername]) {
|
if (!opts.sites._map[servername]) {
|
||||||
opts.sites[servername] = { paths: {} };
|
opts.sites._map[servername] = { $id: servername, paths: [] };
|
||||||
|
opts.sites._map[servername].paths._map = {};
|
||||||
|
opts.sites.push(opts.sites._map[servername]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nameparts.length) {
|
if (!nameparts.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opts.sites[servername].paths['/']) {
|
if (!opts.sites._map[servername].paths._map['/']) {
|
||||||
opts.sites[servername].paths['/'] = {};
|
opts.sites._map[servername].paths._map['/'] = { $id: '/', modules: [] };
|
||||||
|
opts.sites._map[servername].paths.push(opts.sites._map[servername].paths._map['/']);
|
||||||
}
|
}
|
||||||
|
|
||||||
modules = opts.sites[servername].paths['/'];
|
modules = opts.sites._map[servername].paths._map['/'].modules;
|
||||||
modules.serve = nameparts;
|
modules.push({
|
||||||
modules.indexes = nameparts;
|
$id: 'serve'
|
||||||
|
, paths: nameparts
|
||||||
|
});
|
||||||
|
modules.push({
|
||||||
|
$id: 'indexes'
|
||||||
|
, paths: nameparts
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.groups = {};
|
opts.groups = [];
|
||||||
|
|
||||||
// 'packages', 'assets', 'com.daplie.caddy'
|
// 'packages', 'assets', 'com.daplie.caddy'
|
||||||
opts.sites['localhost.alpha.daplie.me'] = {
|
opts.global = {
|
||||||
|
modules: [ // TODO uh-oh we've got a mixed bag of modules (various types), a true map
|
||||||
|
{ $id: 'greenlock', email: opts.email, tos: opts.tos }
|
||||||
|
, { $id: 'rvpn', email: opts.email, tos: opts.tos }
|
||||||
|
, { $id: 'content', content: content }
|
||||||
|
, { $id: 'livereload', on: opts.livereload }
|
||||||
|
, { $id: 'app', path: opts.expressApp }
|
||||||
|
]
|
||||||
|
, paths: [
|
||||||
|
{ $id: '/assets/', modules: [ { $id: 'serve', paths: [ assetsPath ] } ] }
|
||||||
|
// TODO figure this b out
|
||||||
|
, { $id: '/.well-known/', modules: [
|
||||||
|
{ $id: 'serve', paths: [ path.join(assetsPath, 'well-known') ] }
|
||||||
|
] }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
opts.defaults = {
|
||||||
|
modules: []
|
||||||
|
, paths: [
|
||||||
|
{ $id: '/', modules: [
|
||||||
|
{ $id: 'serve', paths: [ defaultWebRoot ] }
|
||||||
|
, { $id: 'indexes', paths: [ defaultWebRoot ] }
|
||||||
|
] }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
opts.sites.push({
|
||||||
// greenlock: {}
|
// greenlock: {}
|
||||||
paths: {
|
$id: 'localhost.alpha.daplie.me'
|
||||||
'/': { serve: [ path.resolve(__dirname, '..', 'admin', 'public') ] }
|
, paths: [
|
||||||
, '/api/': { app: path.join(__dirname, 'admin') }
|
{ $id: '/', modules: [
|
||||||
}
|
{ $id: 'serve', paths: [ path.resolve(__dirname, '..', 'admin', 'public') ] }
|
||||||
};
|
] }
|
||||||
opts.sites['localhost.daplie.invalid'] = {
|
, { $id: '/api/', modules: [
|
||||||
paths: {
|
{ $id: 'app', path: path.join(__dirname, 'admin') }
|
||||||
'/': { serve: [ path.resolve(__dirname, '..', 'admin', 'public') ] }
|
] }
|
||||||
, '/api/': { app: path.join(__dirname, 'admin') }
|
]
|
||||||
}
|
});
|
||||||
};
|
opts.sites.push({
|
||||||
opts.assetsPath = path.join(__dirname, '..', 'packages', 'assets');
|
$id: 'localhost.daplie.invalid'
|
||||||
opts.webRoot = defaultWebRoot;
|
, paths: [
|
||||||
|
{ $id: '/', modules: [ { $id: 'serve', paths: [ path.resolve(__dirname, '..', 'admin', 'public') ] } ] }
|
||||||
|
, { $id: '/api/', modules: [ { $id: 'app', path: path.join(__dirname, 'admin') } ] }
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
// ifaces
|
// ifaces
|
||||||
opts.ifaces = require('../lib/local-ip.js').find();
|
opts.ifaces = require('../lib/local-ip.js').find();
|
||||||
|
|
||||||
// TODO use arrays in all things
|
// TODO use arrays in all things
|
||||||
opts._old_server_name = Object.keys(opts.sites)[0];
|
opts._old_server_name = opts.sites[0].$id;
|
||||||
opts.pubdir = defaultWebRoot.replace(/(:hostname|:servername).*/, '');
|
opts.pubdir = defaultWebRoot.replace(/(:hostname|:servername).*/, '');
|
||||||
|
|
||||||
if (argv.p || argv.port || argv._[0]) {
|
if (argv.p || argv.port || argv._[0]) {
|
||||||
|
@ -454,7 +485,7 @@ function run() {
|
||||||
opts.livereload = livereload;
|
opts.livereload = livereload;
|
||||||
|
|
||||||
if (argv['express-app']) {
|
if (argv['express-app']) {
|
||||||
opts.expressApp = require(path.resolve(process.cwd(), argv['express-app']));
|
opts.expressApp = require(argv['express-app']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts.email || opts._externalHost) {
|
if (opts.email || opts._externalHost) {
|
||||||
|
|
115
lib/app.js
115
lib/app.js
|
@ -81,6 +81,69 @@ module.exports = function (opts) {
|
||||||
|
|
||||||
app = express();
|
app = express();
|
||||||
|
|
||||||
|
if (!opts.sites) {
|
||||||
|
opts.sites = [];
|
||||||
|
}
|
||||||
|
opts.sites._map = {};
|
||||||
|
opts.sites.forEach(function (site) {
|
||||||
|
|
||||||
|
if (!opts.sites._map[site.$id]) {
|
||||||
|
opts.sites._map[site.$id] = site;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!site.paths) {
|
||||||
|
site.paths = [];
|
||||||
|
}
|
||||||
|
if (!site.paths._map) {
|
||||||
|
site.paths._map = {};
|
||||||
|
}
|
||||||
|
site.paths.forEach(function (path) {
|
||||||
|
|
||||||
|
site.paths._map[path.$id] = path;
|
||||||
|
|
||||||
|
if (!path.modules) {
|
||||||
|
path.modules = [];
|
||||||
|
}
|
||||||
|
if (!path.modules._map) {
|
||||||
|
path.modules._map = {};
|
||||||
|
}
|
||||||
|
path.modules.forEach(function (module) {
|
||||||
|
|
||||||
|
path.modules._map[module.$id] = module;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function mapMap(el, i, arr) {
|
||||||
|
arr._map[el.$id] = el;
|
||||||
|
}
|
||||||
|
opts.global.modules._map = {};
|
||||||
|
opts.global.modules.forEach(mapMap);
|
||||||
|
opts.global.paths._map = {};
|
||||||
|
opts.global.paths.forEach(function (path, i, arr) {
|
||||||
|
mapMap(path, i, arr);
|
||||||
|
//opts.global.paths._map[path.$id] = path;
|
||||||
|
path.modules._map = {};
|
||||||
|
path.modules.forEach(mapMap);
|
||||||
|
});
|
||||||
|
opts.sites.forEach(function (site) {
|
||||||
|
site.paths._map = {};
|
||||||
|
site.paths.forEach(function (path, i, arr) {
|
||||||
|
mapMap(path, i, arr);
|
||||||
|
//site.paths._map[path.$id] = path;
|
||||||
|
path.modules._map = {};
|
||||||
|
path.modules.forEach(mapMap);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
opts.defaults.modules._map = {};
|
||||||
|
opts.defaults.modules.forEach(mapMap);
|
||||||
|
opts.defaults.paths._map = {};
|
||||||
|
opts.defaults.paths.forEach(function (path, i, arr) {
|
||||||
|
mapMap(path, i, arr);
|
||||||
|
//opts.global.paths._map[path.$id] = path;
|
||||||
|
path.modules._map = {};
|
||||||
|
path.modules.forEach(mapMap);
|
||||||
|
});
|
||||||
return app.use('/', function (req, res, next) {
|
return app.use('/', function (req, res, next) {
|
||||||
if (!req.headers.host) {
|
if (!req.headers.host) {
|
||||||
next(new Error('missing HTTP Host header'));
|
next(new Error('missing HTTP Host header'));
|
||||||
|
@ -112,21 +175,22 @@ module.exports = function (opts) {
|
||||||
var hostname = (host||'').split(':')[0].toLowerCase();
|
var hostname = (host||'').split(':')[0].toLowerCase();
|
||||||
|
|
||||||
console.log('opts.global', opts.global);
|
console.log('opts.global', opts.global);
|
||||||
var sites = [ opts.global || {}, opts.sites[hostname] || {}, opts.defer || {} ];
|
var sites = [ opts.global || null, opts.sites._map[hostname] || null, opts.defaults || null ];
|
||||||
var loadables = {
|
var loadables = {
|
||||||
serve: function (config, hostname, pathname, req, res, next) {
|
serve: function (config, hostname, pathname, req, res, next) {
|
||||||
config = config.slice(0);
|
|
||||||
var originalUrl = req.url;
|
var originalUrl = req.url;
|
||||||
|
var dirpaths = config.paths.slice(0);
|
||||||
|
|
||||||
function nextServe() {
|
function nextServe() {
|
||||||
var dirname = config.pop();
|
var dirname = dirpaths.pop();
|
||||||
console.log('[serve]', req.url, hostname, pathname, dirname);
|
|
||||||
if (!dirname) {
|
if (!dirname) {
|
||||||
req.url = originalUrl;
|
req.url = originalUrl;
|
||||||
next();
|
next();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('[serve]', req.url, hostname, pathname, dirname);
|
||||||
|
dirname = path.resolve(opts.cwd, dirname.replace(/:hostname/, hostname));
|
||||||
if (!serveStaticMap[dirname]) {
|
if (!serveStaticMap[dirname]) {
|
||||||
serveStaticMap[dirname] = serveStatic(dirname);
|
serveStaticMap[dirname] = serveStatic(dirname);
|
||||||
}
|
}
|
||||||
|
@ -138,18 +202,19 @@ module.exports = function (opts) {
|
||||||
nextServe();
|
nextServe();
|
||||||
}
|
}
|
||||||
, indexes: function (config, hostname, pathname, req, res, next) {
|
, indexes: function (config, hostname, pathname, req, res, next) {
|
||||||
config = config.slice(0);
|
|
||||||
var originalUrl = req.url;
|
var originalUrl = req.url;
|
||||||
|
var dirpaths = config.paths.slice(0);
|
||||||
|
|
||||||
function nextIndex() {
|
function nextIndex() {
|
||||||
var dirname = config.pop();
|
var dirname = dirpaths.pop();
|
||||||
console.log('[indexes]', req.url, hostname, pathname, dirname);
|
|
||||||
if (!dirname) {
|
if (!dirname) {
|
||||||
req.url = originalUrl;
|
req.url = originalUrl;
|
||||||
next();
|
next();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('[indexes]', req.url, hostname, pathname, dirname);
|
||||||
|
dirname = path.resolve(opts.cwd, dirname.replace(/:hostname/, hostname));
|
||||||
if (!serveStaticMap[dirname]) {
|
if (!serveStaticMap[dirname]) {
|
||||||
serveIndexMap[dirname] = serveIndex(dirname);
|
serveIndexMap[dirname] = serveIndex(dirname);
|
||||||
}
|
}
|
||||||
|
@ -159,18 +224,26 @@ module.exports = function (opts) {
|
||||||
req.url = req.url.substr(pathname.length - 1);
|
req.url = req.url.substr(pathname.length - 1);
|
||||||
nextIndex();
|
nextIndex();
|
||||||
}
|
}
|
||||||
|
, app: function (config, hostname, pathname, req, res, next) {
|
||||||
|
//var appfile = path.resolve(/*process.cwd(), */config.path.replace(/:hostname/, hostname));
|
||||||
|
var appfile = config.path.replace(/:hostname/, hostname);
|
||||||
|
var app = require(appfile);
|
||||||
|
app(req, res, next);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function runModule(config, hostname, pathname, modulename, req, res, next) {
|
function runModule(module, hostname, pathname, modulename, req, res, next) {
|
||||||
if (!loadables[modulename]) {
|
if (!loadables[modulename]) {
|
||||||
next(new Error("no module '" + modulename + "' found"));
|
next(new Error("no module '" + modulename + "' found"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loadables[modulename](config, hostname, pathname, req, res, next);
|
loadables[modulename](module, hostname, pathname, req, res, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
function iterModules(modules, hostname, pathname, req, res, next) {
|
function iterModules(modules, hostname, pathname, req, res, next) {
|
||||||
var modulenames = Object.keys(modules);
|
console.log('modules');
|
||||||
|
console.log(modules);
|
||||||
|
var modulenames = Object.keys(modules._map);
|
||||||
|
|
||||||
function nextModule() {
|
function nextModule() {
|
||||||
var modulename = modulenames.pop();
|
var modulename = modulenames.pop();
|
||||||
|
@ -180,14 +253,17 @@ module.exports = function (opts) {
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('modules', modules);
|
console.log('modules', modules);
|
||||||
runModule(modules[modulename], hostname, pathname, modulename, req, res, nextModule);
|
runModule(modules._map[modulename], hostname, pathname, modulename, req, res, nextModule);
|
||||||
}
|
}
|
||||||
|
|
||||||
nextModule();
|
nextModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
function iterPaths(site, hostname, req, res, next) {
|
function iterPaths(site, hostname, req, res, next) {
|
||||||
var pathnames = Object.keys(site.paths || {});
|
console.log('site', hostname);
|
||||||
|
console.log(site);
|
||||||
|
var pathnames = Object.keys(site.paths._map);
|
||||||
|
console.log('pathnames', pathnames);
|
||||||
pathnames = pathnames.filter(function (pathname) {
|
pathnames = pathnames.filter(function (pathname) {
|
||||||
// TODO ensure that pathname has trailing /
|
// TODO ensure that pathname has trailing /
|
||||||
return (0 === req.url.indexOf(pathname));
|
return (0 === req.url.indexOf(pathname));
|
||||||
|
@ -196,27 +272,34 @@ module.exports = function (opts) {
|
||||||
pathnames.sort(function (a, b) {
|
pathnames.sort(function (a, b) {
|
||||||
return b.length - a.length;
|
return b.length - a.length;
|
||||||
});
|
});
|
||||||
|
console.log('pathnames', pathnames);
|
||||||
|
|
||||||
function nextPath() {
|
function nextPath() {
|
||||||
var pathname = pathnames.pop();
|
var pathname = pathnames.shift();
|
||||||
if (!pathname) {
|
if (!pathname) {
|
||||||
next();
|
next();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('iterPaths', hostname, pathname, req.url);
|
console.log('iterPaths', hostname, pathname, req.url);
|
||||||
iterModules(site.paths[pathname], hostname, pathname, req, res, nextPath);
|
iterModules(site.paths._map[pathname].modules, hostname, pathname, req, res, nextPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
nextPath();
|
nextPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextSite() {
|
function nextSite() {
|
||||||
var site = sites.pop();
|
console.log('hostname', hostname, sites);
|
||||||
if (!site) {
|
var site;
|
||||||
|
if (!sites.length) {
|
||||||
next(); // 404
|
next(); // 404
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
site = sites.shift();
|
||||||
|
if (!site) {
|
||||||
|
nextSite();
|
||||||
|
return;
|
||||||
|
}
|
||||||
iterPaths(site, hostname, req, res, nextSite);
|
iterPaths(site, hostname, req, res, nextSite);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue