1
0
Fork 0
forked from svrjs/svrjs

Update to SVR.JS 3.11.0

This commit is contained in:
Dorian Niemiec 2023-11-12 20:18:43 +01:00
parent a755e32bc7
commit a63e1a893b
6 changed files with 97 additions and 47 deletions

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>SVR.JS 3.10.3</title> <title>SVR.JS 3.11.0</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style> <style>
@ -12,11 +12,11 @@
</style> </style>
</head> </head>
<body> <body>
<h1>Welcome to SVR.JS 3.10.3</h1> <h1>Welcome to SVR.JS 3.11.0</h1>
<br/> <br/>
<img src="/logo.png" style="width: 256px;" /> <img src="/logo.png" style="width: 256px;" />
<br/> <br/>
<p>If you see this page, that means, that the server is properly working. You can further configure the server and replace <i>index.html</i> and <i>tests.html</i> pages with custom ones.</p> <p>If you see this page that means that the server is working properly. You can further configure the server and replace <i>index.html</i> and <i>tests.html</i> pages with custom ones.</p>
<p>Default <i>config.json</i> looks like this:</p> <p>Default <i>config.json</i> looks like this:</p>
<div style="background-color: #e0e0e0; padding: 5px; text-align: left; display: inline-block;"> <div style="background-color: #e0e0e0; padding: 5px; text-align: left; display: inline-block;">
<code> <code>
@ -117,7 +117,10 @@
</div> </div>
<p>Changes:</p> <p>Changes:</p>
<ul> <ul>
<li>Fixed bug with non-standard code regex replacements</li> <li>SVR.JS now sends configuration file saving request to one random good worker instead of all workers to prevent configuration file corruption.</li>
<li>Fixed crashes due to destroyed HTTP/2 stream (Node.JS bug: <a href="https://github.com/nodejs/node/issues/24470">https://github.com/nodejs/node/issues/24470</a>)</li>
<li>Fixed language errors in HTTP error code descriptions, error console messages and the index page.</li>
<li>Updated the logo in the SVR.JS log viewer.</li>
</ul> </ul>
<br/> <br/>
<a href="/tests.html">Tests</a><br/> <a href="/tests.html">Tests</a><br/>

Binary file not shown.

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>SVR.JS 3.10.3 Licenses</title> <title>SVR.JS 3.11.0 Licenses</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style> <style>
@ -12,8 +12,8 @@
</style> </style>
</head> </head>
<body> <body>
<h1>SVR.JS 3.10.3 Licenses</h1> <h1>SVR.JS 3.11.0 Licenses</h1>
<h2>SVR.JS 3.10.3</h2> <h2>SVR.JS 3.11.0</h2>
<div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;"> <div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;">
MIT License<br/> MIT License<br/>
<br/> <br/>
@ -37,7 +37,7 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/>
SOFTWARE.<br/> SOFTWARE.<br/>
</div> </div>
<h2>Packages used by SVR.JS 3.10.3 and utilities</h2> <h2>Packages used by SVR.JS 3.11.0 and utilities</h2>
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;"> <div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
<div style="float: right;">License: MIT</div> <div style="float: right;">License: MIT</div>
<div style="font-size: 20px;"> <div style="font-size: 20px;">

File diff suppressed because one or more lines are too long

119
svr.js
View file

@ -81,7 +81,7 @@ function deleteFolderRecursive(path) {
} }
var os = require("os"); var os = require("os");
var version = "3.10.3"; var version = "3.11.0";
var singlethreaded = false; var singlethreaded = false;
if (process.versions) process.versions.svrjs = version; // Inject SVR.JS into process.versions if (process.versions) process.versions.svrjs = version; // Inject SVR.JS into process.versions
@ -1811,52 +1811,52 @@ forbiddenPaths.log = getInitializePath("./log");
// Error descriptions // Error descriptions
var serverErrorDescs = { var serverErrorDescs = {
200: "The request succeeded! :)", 200: "The request succeeded! :)",
201: "New resource has been created.", 201: "A new resource has been created.",
202: "The request has been accepted for processing, but the processing has not been completed.", 202: "The request has been accepted for processing, but the processing has not been completed.",
400: "The request you made is invalid.", 400: "The request you made is invalid.",
401: "You need to authenticate yourself in order to access the requested file.", 401: "You need to authenticate yourself in order to access the requested file.",
402: "You need to pay in order to access the requested file.", 402: "You need to pay in order to access the requested file.",
403: "You don't have access to the requested file.", 403: "You don't have access to the requested file.",
404: "The requested file doesn't exist. If you have typed URL manually, then please check the spelling.", 404: "The requested file doesn't exist. If you have typed the URL manually, then please check the spelling.",
405: "Method used to access the requested file isn't allowed.", 405: "Method used to access the requested file isn't allowed.",
406: "The request is capable of generating only not acceptable content.", 406: "The request is capable of generating only unacceptable content.",
407: "You need to authenticate yourself in order to use the proxy.", 407: "You need to authenticate yourself in order to use the proxy.",
408: "You have timed out.", 408: "You have timed out.",
409: "The request you sent conflicts with the current state of the server.", 409: "The request you sent conflicts with the current state of the server.",
410: "The requested file is permanently deleted.", 410: "The requested file is permanently deleted.",
411: "Content-Length property is required.", 411: "Content-Length property is required.",
412: "The server doesn't meet preconditions you put in the request.", 412: "The server doesn't meet the preconditions you put in the request.",
413: "The request you sent is too large.", 413: "The request you sent is too large.",
414: "URL you sent is too long.", 414: "The URL you sent is too long.",
415: "The media type of request you sent isn't supported by the server.", 415: "The media type of request you sent isn't supported by the server.",
416: "Content-Range you sent is unsatisfiable.", 416: "The requested content range (Content-Range header) you sent is unsatisfiable.",
417: "Expectation in Expect property couldn't be satisfied.", 417: "The expectation specified in the Expect property couldn't be satisfied.",
418: "The server (teapot) can't brew any coffee! ;)", 418: "The server (teapot) can't brew any coffee! ;)",
421: "The request you made isn't intended for this server.", 421: "The request you made isn't intended for this server.",
422: "The server couldn't process content sent by you.", 422: "The server couldn't process content sent by you.",
423: "The requested file is locked.", 423: "The requested file is locked.",
424: "The request depends on another failed request.", 424: "The request depends on another failed request.",
425: "The server is unwilling to risk processing a request that might be replayed.", 425: "The server is unwilling to risk processing a request that might be replayed.",
426: "You need to upgrade protocols you use to request a file.", 426: "You need to upgrade the protocols you use to request a file.",
428: "The request you sent needs to be conditional, but it isn't.", 428: "The request you sent needs to be conditional, but it isn't.",
429: "You sent too much requests to the server.", 429: "You sent too many requests to the server.",
431: "The request you sent contains headers, that are too large.", 431: "The request you sent contains headers that are too large.",
451: "The requested file isn't accessible for legal reasons.", 451: "The requested file isn't accessible for legal reasons.",
497: "You sent non-TLS request to the HTTPS server.", 497: "You sent a non-TLS request to the HTTPS server.",
500: "The server had an unexpected error. Below, the error stack is shown: </p><code>{stack}</code><p>Please contact with developer/administrator at <i>{contact}</i>.", 500: "The server had an unexpected error. Below, the error stack is shown: </p><code>{stack}</code><p>You may need to contact the server administrator at <i>{contact}</i>.",
501: "The request requires use of a function, which isn't currently implemented by the server.", 501: "The request requires the use of a function, which isn't currently implemented by the server.",
502: "The server had an error, while it was acting as a gateway.</p><p>Please contact with developer/administrator at <i>{contact}</i>.", 502: "The server had an error while it was acting as a gateway.</p><p>You may need to contact the server administrator at <i>{contact}</i>.",
503: "The service provided by the server is currently unavailable, possibly due to maintenance downtime or capacity problems. Please try again later.</p><p>Please contact with developer/administrator at <i>{contact}</i>.", 503: "The service provided by the server is currently unavailable, possibly due to maintenance downtime or capacity problems. Please try again later.</p><p>You may need to contact the server administrator at <i>{contact}</i>.",
504: "The server couldn't get response in time, while it was acting as a gateway.</p><p>Please contact with developer/administrator at <i>{contact}</i>.", 504: "The server couldn't get a response in time while it was acting as a gateway.</p><p>You may need to contact the server administrator at <i>{contact}</i>.",
505: "The server doesn't support HTTP version used in the request.", 505: "The server doesn't support the HTTP version used in the request.",
506: "Variant header is configured to be engaged in content negotiation.</p><p>Please contact with developer/administrator at <i>{contact}</i>.", 506: "The Variant header is configured to be engaged in content negotiation.</p><p>You may need to contact the server administrator at <i>{contact}</i>.",
507: "The server ran out of disk space neccessary to complete the request.", 507: "The server ran out of disk space necessary to complete the request.",
508: "The server detected an infinite loop while processing the request.", 508: "The server detected an infinite loop while processing the request.",
509: "The server has it's bandwidth limit exceeded.</p><p>Please contact with developer/administrator at <i>{contact}</i>.", 509: "The server has its bandwidth limit exceeded.</p><p>You may need to contact the server administrator at <i>{contact}</i>.",
510: "The server requires an extended HTTP request. The request you made isn't an extended HTTP request.", 510: "The server requires an extended HTTP request. The request you made isn't an extended HTTP request.",
511: "You need to authenticate yourself in order to get network access.", 511: "You need to authenticate yourself in order to get network access.",
598: "The server couldn't get response in time, while it was acting as a proxy.", 598: "The server couldn't get a response in time while it was acting as a proxy.",
599: "The server couldn't connect in time, while it was acting as a proxy." 599: "The server couldn't connect in time while it was acting as a proxy."
}; };
// Create server // Create server
@ -2798,7 +2798,11 @@ if (!cluster.isPrimary) {
delete table["connection"]; delete table["connection"];
delete table["keep-alive"]; delete table["keep-alive"];
delete table["upgrade"]; delete table["upgrade"];
return res.writeHeadNodeApi(a, table); if(res.stream && res.stream.destroyed) {
return false;
} else {
return res.writeHeadNodeApi(a, table);
}
}; };
res.setHeader = function (a, b) { res.setHeader = function (a, b) {
@ -4590,6 +4594,7 @@ function bruteForceListenerWrapper(worker) {
} }
var isWorkerHungUpBuff = true; var isWorkerHungUpBuff = true;
var isWorkerHungUpBuff2 = true;
function msgListener(msg) { function msgListener(msg) {
for (var i = 0; i < Object.keys(cluster.workers).length; i++) { for (var i = 0; i < Object.keys(cluster.workers).length; i++) {
@ -4605,12 +4610,14 @@ function msgListener(msg) {
// Do nothing! // Do nothing!
} else if (msg == "\x12KILLOK") { } else if (msg == "\x12KILLOK") {
if(typeof isWorkerHungUpBuff != "undefined") isWorkerHungUpBuff = false; if(typeof isWorkerHungUpBuff != "undefined") isWorkerHungUpBuff = false;
} else if (msg == "\x12PINGOK") {
if(typeof isWorkerHungUpBuff2 != "undefined") isWorkerHungUpBuff2 = false;
} else if (msg == "\x12KILLTERMMSG") { } else if (msg == "\x12KILLTERMMSG") {
serverconsole.locmessage("Terminating unused worker process..."); serverconsole.locmessage("Terminating unused worker process...");
} else if (msg == "\x12SAVEGOOD") { } else if (msg == "\x12SAVEGOOD") {
serverconsole.locmessage("Configuration saved."); serverconsole.locmessage("Configuration saved.");
} else if (msg.indexOf("\x12SAVEERR") == 0) { } else if (msg.indexOf("\x12SAVEERR") == 0) {
serverconsole.locwarnmessage("There was a problem, while saving configuration file. Reason: " + msg.substr(8)); serverconsole.locwarnmessage("There was a problem while saving configuration file. Reason: " + msg.substr(8));
} else if (msg == "\x12END") { } else if (msg == "\x12END") {
cluster.workers[Object.keys(cluster.workers)[0]].on("message", function (msg) { cluster.workers[Object.keys(cluster.workers)[0]].on("message", function (msg) {
if (msg.length >= 8 && msg.indexOf("\x12ERRLIST") == 0) { if (msg.length >= 8 && msg.indexOf("\x12ERRLIST") == 0) {
@ -4981,21 +4988,55 @@ function start(init) {
} else if (cluster.isPrimary) { } else if (cluster.isPrimary) {
setInterval(function () { setInterval(function () {
var allClusters = Object.keys(cluster.workers); var allClusters = Object.keys(cluster.workers);
for (var i = 0; i < allClusters.length; i++) { var goodWorkers = [];
function checkWorker(callback, _id) {
if(typeof _id === "undefined") _id = 0;
if(_id >= allClusters.length) {
callback();
return;
}
try { try {
if (cluster.workers[allClusters[i]]) { if (cluster.workers[allClusters[_id]]) {
cluster.workers[allClusters[i]].on("message", msgListener); isWorkerHungUpBuff2 = true;
cluster.workers[allClusters[i]].send("\x14SAVECONF"); cluster.workers[allClusters[_id]].on("message", msgListener);
cluster.workers[allClusters[_id]].send("\x14PINGPING");
setTimeout(function () {
if (isWorkerHungUpBuff2) {
checkWorker(callback, _id+1);
} else {
goodWorkers.push(allClusters[_id]);
checkWorker(callback, _id+1);
}
}, 250);
} else {
checkWorker(callback, _id+1);
} }
} catch (err) { } catch (err) {
if (cluster.workers[allClusters[i]]) { if (cluster.workers[allClusters[_id]]) {
cluster.workers[allClusters[i]].removeAllListeners("message"); cluster.workers[allClusters[_id]].removeAllListeners("message");
cluster.workers[allClusters[i]].on("message", bruteForceListenerWrapper(cluster.workers[allClusters[i]])); cluster.workers[allClusters[_id]].on("message", bruteForceListenerWrapper(cluster.workers[allClusters[_id]]));
cluster.workers[allClusters[i]].on("message", listenConnListener); cluster.workers[allClusters[_id]].on("message", listenConnListener);
} }
serverconsole.locwarnmessage("There was a problem, while saving configuration file. Reason: " + err.message); checkWorker(callback, _id+1);
} }
} }
checkWorker(function () {
var wN = Math.floor(Math.random() * goodWorkers.length); //Send a configuration saving message to a random worker.
try {
if (cluster.workers[goodWorkers[wN]]) {
isWorkerHungUpBuff2 = true;
cluster.workers[goodWorkers[wN]].on("message", msgListener);
cluster.workers[goodWorkers[wN]].send("\x14SAVECONF");
}
} catch (err) {
if (cluster.workers[goodWorkers[wN]]) {
cluster.workers[goodWorkers[wN]].removeAllListeners("message");
cluster.workers[goodWorkers[wN]].on("message", bruteForceListenerWrapper(cluster.workers[goodWorkers[wN]]));
cluster.workers[goodWorkers[wN]].on("message", listenConnListener);
}
serverconsole.locwarnmessage("There was a problem while saving configuration file. Reason: " + err.message);
}
});
}, 300000); }, 300000);
} }
if (!cluster.isPrimary) { if (!cluster.isPrimary) {
@ -5029,6 +5070,12 @@ function start(init) {
process.send("\x12END"); process.send("\x12END");
} }
// Refuse to send, when it's really exiting. Main process will treat the worker as hung up anyway... // Refuse to send, when it's really exiting. Main process will treat the worker as hung up anyway...
} else if (line == "\x14PINGPING") {
if(!reallyExiting) {
process.send("\x12PINGOK");
process.send("\x12END");
}
// Refuse to send, when it's really exiting. Main process will treat the worker as hung up anyway...
} else if (line == "\x14KILLREQ") { } else if (line == "\x14KILLREQ") {
if(reqcounter - reqcounterKillReq < 2) { if(reqcounter - reqcounterKillReq < 2) {
process.send("\x12KILLTERMMSG"); process.send("\x12KILLTERMMSG");
@ -5378,7 +5425,7 @@ function start(init) {
cluster.workers[goodWorkers[wN]].on("message", bruteForceListenerWrapper(cluster.workers[goodWorkers[wN]])); cluster.workers[goodWorkers[wN]].on("message", bruteForceListenerWrapper(cluster.workers[goodWorkers[wN]]));
cluster.workers[goodWorkers[wN]].on("message", listenConnListener); cluster.workers[goodWorkers[wN]].on("message", listenConnListener);
} }
serverconsole.locwarnmessage("There was a problem, while terminating unused worker process. Reason: " + err.message); serverconsole.locwarnmessage("There was a problem while terminating unused worker process. Reason: " + err.message);
} }
} }
}); });
@ -5472,7 +5519,7 @@ if (cluster.isPrimary || cluster.isPrimary === undefined) {
saveConfig(); saveConfig();
} }
} catch (err) { } catch (err) {
serverconsole.locwarnmessage("There was a problem, while saving configuration file. Reason: " + err.message); serverconsole.locwarnmessage("There was a problem while saving configuration file. Reason: " + err.message);
} }
try { try {
deleteFolderRecursive(__dirname + "/temp"); deleteFolderRecursive(__dirname + "/temp");

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>SVR.JS 3.10.3 Tests</title> <title>SVR.JS 3.11.0 Tests</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style> <style>
@ -12,7 +12,7 @@
</style> </style>
</head> </head>
<body> <body>
<h1>SVR.JS 3.10.3 Tests</h1> <h1>SVR.JS 3.11.0 Tests</h1>
<h2>Directory</h2> <h2>Directory</h2>
<iframe src="/testdir" width="50%" height="300px"></iframe> <iframe src="/testdir" width="50%" height="300px"></iframe>
<h2>Directory (with query)</h2> <h2>Directory (with query)</h2>