From 58fc45fc79855a14334a73c6e8c162ce542e2ba2 Mon Sep 17 00:00:00 2001 From: svrjs Date: Wed, 2 Aug 2023 14:33:36 +0200 Subject: [PATCH] Make it work for PHP-CGI --- index.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++---------- mod.info | 2 +- 2 files changed, 81 insertions(+), 17 deletions(-) diff --git a/index.js b/index.js index 0aca650..98c5262 100644 --- a/index.js +++ b/index.js @@ -172,8 +172,10 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e } else if (bheaders[0].indexOf(":") == -1) { var heada = bheaders.shift(); var hso = heada.split(" "); - code = hso[0]; - if (hso[1] !== undefined) msg = heada.split(" ").splice(1).join(" "); + if (hso[0].match(/^[0-9]{3}$/)) { + code = hso[0]; + if (hso[1] !== undefined) msg = heada.split(" ").splice(1).join(" "); + } } for (var i = 0; i < bheaders.length; i++) { var headerp = bheaders[i].split(": "); @@ -256,9 +258,11 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e if (nEnv["QUERY_STRING"] == undefined || nEnv["QUERY_STRING"] == "undefined") nEnv["QUERY_STRING"] = ""; nEnv["SERVER_SOFTWARE"] = software; nEnv["SERVER_PROTOCOL"] = "HTTP/" + req.httpVersion; - nEnv["SERVER_PORT"] = port; - nEnv["SERVER_ADDR"] = pubip.replace(/^::ffff:/i, ""); - if (nEnv["SERVER_ADDR"].indexOf(":") != -1) nEnv["SERVER_ADDR"] = "[" + nEnv["SERVER_ADDR"] + "]"; + if (pubip && (port !== null && port !== undefined)) { + nEnv["SERVER_PORT"] = port; + nEnv["SERVER_ADDR"] = pubip.replace(/^::ffff:/i, ""); + if (nEnv["SERVER_ADDR"].indexOf(":") != -1) nEnv["SERVER_ADDR"] = "[" + nEnv["SERVER_ADDR"] + "]"; + } nEnv["SERVER_NAME"] = req.headers.host; nEnv["DOCUMENT_ROOT"] = process.cwd(); nEnv["PATH_INFO"] = decodeURI(b); @@ -267,7 +271,7 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e nEnv["GATEWAY_INTERFACE"] = "CGI/1.1"; nEnv["REQUEST_URI"] = req.url; nEnv["REMOTE_ADDR"] = (req.socket.realRemoteAddress ? req.socket.realRemoteAddress : ((req.headers["x-forwarded-for"] && configJSON.enableIPSpoofing) ? req.headers["x-forwarded-for"].split(",")[0].replace(/ /g, "") : req.socket.remoteAddress)).replace(/^::ffff:/i, ""); - nEnv["REMOTE_PORT"] = (req.socket.realRemotePort ? req.socket.realRemotePort : req.socket.remoteAddress); + nEnv["REMOTE_PORT"] = (req.socket.realRemotePort ? req.socket.realRemotePort : req.socket.remotePort); nEnv["SCRIPT_NAME"] = a; nEnv["SCRIPT_FILENAME"] = (process.cwd() + (require("os").platform == "win32" ? a.replace(/\//g, "\\") : a)).replace((require("os").platform == "win32" ? /\\\\/g : /\/\//g), (require("os").platform == "win32" ? "\\" : "/")); if (req.headers["content-type"]) nEnv["CONTENT_TYPE"] = req.headers["content-type"]; @@ -284,13 +288,62 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e if (href.indexOf("/cgi-bin") == 0) { fs.stat("." + href, function (err, stats) { - if (err && err.code == "ENOENT") { - var invokeElseCallback = false; - try { - invokeElseCallback = stats.isFile(); - } catch (ex) {} - if (invokeElseCallback) { - elseCallback(); + if (!err) { + if (!stats.isFile()) { + fs.stat("." + href + "/index.php", function (e2, s2) { + if (!e2 && s2.isFile()) { + try { + executeCGIWithEnv( + (href + "/index.php").replace(/\/+/g, "/"), + "", + req, + res, + req.socket.localAddress, + req.socket.localPort, + getCustomHeaders ? + getCustomHeaders()["Server"] + + " RedBrick/" + + version : + "SVR.JS/" + + configJSON.version + + " (" + + os.platform()[0].toUpperCase() + + os.platform().slice(1) + + "; Node.JS/" + + process.version + + ") RedBrick/" + + version, + bheaders + ); + } catch (ex) { + if (!callServerError) { + res.writeHead(500, "Internal Server Error", abheaders); + res.write( + "500 Internal Server Error

500 Internal Server Error

A server had unexpected exception. Below, the stack trace of the error is shown:

" + + ex.stack.replace(/\r\n/g, "
").replace(/\n/g, "
").replace(/\r/g, "
").replace(/ /g, " ") + + "

Please contact the developer/administrator of the website.

SVR.JS " + + configJSON.version + + " (" + + os.platform()[0].toUpperCase() + + os.platform().slice(1) + + "; Node.JS/" + + process.version + + ") RedBrick/" + + version + + " " + + (req.headers.host == undefined ? "" : " on " + req.headers.host) + + "

" + ); + res.end(); + } else { + callServerError(500, "RedBrick/" + version, ex); + } + } + } else { + + elseCallback(); + } + }); } else { try { executeCGIWithEnv( @@ -340,7 +393,7 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e } } } - } else if (!err || (err && err.code == "ENOTDIR")) { + } else if (err && err.code == "ENOTDIR") { function checkPath(pth, cb, a) { // Function to check the path of the file and execute CGI script var cpth = pth.split("/"); @@ -358,8 +411,17 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e rpth: (a !== undefined ? "/" + a : "") }) } else { - b.unshift(cpth.pop()); - return checkPath(cpth.join("/"), cb, b.join("/")); + fs.stat(pth + "/index.php", function (e2, s2) { + if (!e2 && s2.isFile()) { + cb({ + fpth: (pth + "/index.php").replace(/\/+/g, "/"), + rpth: (a !== undefined ? "/" + a : "") + }) + } else { + b.unshift(cpth.pop()); + return checkPath(cpth.join("/"), cb, b.join("/")); + } + }); } }); } @@ -416,6 +478,8 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e } } }); + } else if (err && err.code == "ENOENT") { + elseCallback(); //Invoke default error handler } else { if (!callServerError) { res.writeHead(500, "Internal Server Error", abheaders); diff --git a/mod.info b/mod.info index 03e333a..6684297 100755 --- a/mod.info +++ b/mod.info @@ -1,4 +1,4 @@ { "name": "DorianTech RedBrick CGI engine for SVR.JS", - "version": "2.2.0" + "version": "2.3.0" }