From 6233760c6f4dab5a25785aff716bc8fd4344cdc1 Mon Sep 17 00:00:00 2001 From: ken Date: Tue, 27 Jun 2017 00:15:56 +0000 Subject: [PATCH] routing re-enabled --- main.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ skel.html | 4 ++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/main.js b/main.js index d767ef9..6a631af 100644 --- a/main.js +++ b/main.js @@ -9,9 +9,104 @@ */ const fs = require('fs') const ws = require('ws') +const path = require('path') const http = require('http') const https = require('https') const getport = require('get-port') const mime = require('mime') const opts = require('./opts.js') +const skelPage = fs.readFileSync('./skel.html', { encoding: 'utf8' }).split('') +const clientJS = fs.readFileSync(opts['client-js']) +const hostJS = fs.readFileSync(opts['host-js']) +const routes = {} + +const httpsOpts = (opts['no-tls'] ? + undefined : + { + key: fs.readFileSync(opts['ca-key']), + cert: fs.readFileSync(opts['ca-cert']) + }) + +const routeConnection = (request,response) => { + const serveFile = (fPath) => { + fs.readFile(fPath, { encoding: 'utf8' }, (err, data) => { + if (err || data == undefined) { + response.write(404) + response.end() + } + else { + response.write(200, mime.lookup(fPath)) + response.write(data) + response.end() + } + }) + } + const htArgv = request.url.slice(1).split("?") + console.log(htArgv) + let routePath = htArgv[0].split(path.sep) + let routeName = routePath[0] + if (routeName === '') + routeName = opts['index'] + if (routeName in opts['bindings']) { + const followBind = (dir, fPaths) => { + fs.readdir(dir, (err, file) => { + if (err) + serveFile(dir) + else if (fPaths.length == 0) + serveFile(`${dir}/index.html`) + else if (fPaths[0] !== '..' || path.normalize(`${dir}${path.sep}..`).includes(path.normalize(opts['bindings'][routeName]))) { + let nextFPath = fPaths.shift() + if (nextFPath in fPaths) + followBind(`${dir}${path.sep}${nextFPath}`, fPaths) + else { + response.writeHead(404) + response.end() + } + } + else { + console.log(`SEC: Ignored '..' in URL ${request.url}`) + console.log(request) + } + }) + } + followBind(opts['bindings'][routeName], htArgv[0].split(path.sep).slice(1)) + } + else if (routeName in routes) { + const route = routes[routeName] + response.writeHead(200, { 'Content-Type': 'text/html' }) + response.write(`${skelPage[0]}${clientJS}${skelPage[1]}`) + response.end() + route.socket.send(request.headers['x-forwarded-for'] || request.connection.remoteAddress) + } + else { + routes[htArgv[0]] = true + const newRoute = {} + newRoute.host = request.headers['x-forwarded-for'] || request.connection.remoteAddress + getport().then( (port) => { + newRoute.port = port + if (opts['no-tls']) + newRoute.httpd = http.createServer() + else + newRoute.httpd = https.createServer(httpsOpts) + newRoute.httpd.listen(newRoute.port) + newRoute.ws = new ws.Server( { server: newRoute.httpd } ) + newRoute.ws.on('connection', (ws) => { console.log("socket connected"); newRoute.socket = ws; ws.send("CONNECTED") } ) + newRoute.ws.on('message', (msg) => { console.log("Received message" + msg) }) + console.log("Listening for websocket " + newRoute.host + " on port " + newRoute.port) + routes[htArgv[0]] = newRoute + }).then(() => { + response.writeHead(200, { 'Content-Type': 'text/html' }) + response.write(skelPage[0] + 'const _strapp_port = \'' + newRoute.port + '\'\n' + hostJS + skelPage[1]) + response.end() + }) + } +} + +const router = ((opts['no-tls']) ? + http.createServer(routeConnection) : + https.createServer(httpsOpts, routeConnection)) + .listen(opts['port']) + +//TODO: if ("electron" in process.versions) open a local renderwindow, and route to it + diff --git a/skel.html b/skel.html index 967e8c1..0bf45ae 100644 --- a/skel.html +++ b/skel.html @@ -7,6 +7,8 @@ - + -- 2.18.0