diff --git a/assets/serverSideScript.js b/assets/serverSideScript.js new file mode 100644 index 0000000..730e4b1 --- /dev/null +++ b/assets/serverSideScript.js @@ -0,0 +1,98 @@ +//Server-side Javascript (Node.js) +//This implementation uses Node.js, which powers SVR.JS. +//This implementation contains elements specific for SVR.JS mods: +// req - A server request instance +// res - A server response instance +// serverconsole - A console output object for SVR.JS +// responseEnd - Response ending method of SVR.JS +// href - Request URL without query +// ext - File extension of requested file +// uobject - Request URL object +// search - Request URL queries +// defaultPage - An index page location (deprecated, always returns 'index.html') +// users - A list of users (deprecated) +// page404 - 404 Not Found page location +// head - A head of server response +// foot - A foot of server response +// fd - Currently unused +// elseCallback - Method summoning SVR.JS internal callbacks +// callServerError - Method to end with server error +// getCustomHeaders - Method to get headers defined in config.json file +// origHref - Original request URL without query (before URL rewriting) +// redirect - Method to redirect. +// parsePostData - Method to parse POST data. +// authUser - Authenticated HTTP user. +//Along with elements added by this implementation: +// disableEndElseCallbackExecute - Determines execution of elseCallback on end +// filterHeaders - Removes invalid HTTP/1.0 headers +// customvar1, customvar2, customvar3, customvar4 - Custom variables +//Built-in libraries: +// http +// https +// readline +// os +// url +// hexstrbase64 +// fs +// path +// crypto +// stream +//If you send response remember and don't use disableEndElseCallbackExecute, use "return;", or else SVR.JS will crash. +//If you use proxy, use filterHeaders to remove HTTP/2.0 headers, which are invalid in HTTP/1.0. +//If you type no code, elseCallback is executed. +//Below we have example script, which serves dynamic content. +disableEndElseCallbackExecute = true; //Avoid crashing on async. +var headers = getCustomHeaders(); //Headers +if(!fs.existsSync(__dirname + "/../temp/requestCounter")) { + fs.writeFileSync(__dirname + "/../temp/requestCounter","0"); //Reset counter +} +headers["Content-Type"] = 'text/html; charset=utf-8' //HTML output +if(href == "/hello.svr") { + fs.readFile(__dirname + "/../temp/requestCounter", (err,data) => { + if(err) throw err; + var requestCounter = parseInt(data.toString()); //Counter + fs.writeFile(__dirname + "/../temp/requestCounter",(requestCounter + 1).toString(),() => { + //Increase value of counter + }); + res.writeHead(200, "OK", headers); //Write Head + res.end("
This is a test from server-side JavaScript. This test is executed " + requestCounter.toString() + " times from taking server up." + (req.headers.origin == undefined ? "" : " This request is done from a proxy.") + "
SVR.JS/" + configJSON.version + ' (' + os.platform()[0].toUpperCase() + os.platform().slice(1) + ')' + (req.headers.host == undefined ? "" : " on " + req.headers.host) + "
"); //Write response + serverconsole.resmessage("Client successfully recieved content."); //Log into SVR.JS + return; //Prevent SVR.JS from crashing + }); +} else if(href == "/proxy.svr") { + callServerError(403,"SVR.JS-exampleproxy"); //Server error + serverconsole.errmessage("Client fails to recieve content."); //Log into SVR.JS +} else if(href.indexOf("/proxy.svr/") == 0) { + var hn = href.split("/")[2]; //Hostname + if(hn != "this" && !(req.socket.realRemoteAddress ? req.socket.realRemoteAddress : req.socket.remoteAddress).match(/^(?:localhost$|::1$|f[c-d][0-9a-f]{2}:|(?:::ffff:)?(?:(?:127|10)\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|192\.168\.[0-9]{1,3}\.[0-9]{1,3}|172\.(?:1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3})$)/i) ) { + //Prevent open proxy + callServerError(403,"SVR.JS-exampleproxy"); //Server error + serverconsole.errmessage("Client fails to recieve content."); //Log into SVR.JS + return; + } + var hdrs = req.headers; + hdrs["Host"] = (hn == "this" ? req.headers.host : hn); + hdrs["Origin"] = (req.headers.host == undefined ? "" : req.headers.host); + var options = { + hostname: (hn == "this" ? req.headers.host.split(":")[0] : hn.split(":")[0]), + port: (hn == "this" ? req.headers.host.split(":")[1] : (hn.split(":")[1] == undefined ? 80 : hn.split(":")[1])), + path: req.url.replace("/proxy.svr/" + hn,""), + method: req.method, + headers: filterHeaders(hdrs) + }; + var proxy = http.request(options, function (sres) { + res.writeHead(sres.statusCode, sres.headers) + sres.pipe(res, { + end: true + }); + }); + proxy.on("error",(ex) => { + callServerError(500,"SVR.JS-exampleproxy",ex.stack); //Server error + serverconsole.errmessage("Client fails to recieve content."); //Log into SVR.JS + }); + req.pipe(proxy, { + end: true + }); +} else { + elseCallback(); //Load SVR.JS internal callbacks +}