forked from svrjs/svrjs
Update to SVR.JS 3.11.0
This commit is contained in:
parent
a755e32bc7
commit
a63e1a893b
6 changed files with 97 additions and 47 deletions
11
index.html
11
index.html
|
@ -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.
|
@ -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
117
svr.js
117
svr.js
|
@ -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"];
|
||||||
|
if(res.stream && res.stream.destroyed) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
return res.writeHeadNodeApi(a, table);
|
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");
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Reference in a new issue