forked from svrjs/svrjs
Removed blocking calls from directory listing function
This commit is contained in:
parent
b51ac3e171
commit
34fdd89d37
1 changed files with 241 additions and 185 deletions
78
svr.js
78
svr.js
|
@ -3850,18 +3850,72 @@ if (!cluster.isPrimary) {
|
||||||
customHeaders["Content-Type"] = "text/html; charset=utf-8";
|
customHeaders["Content-Type"] = "text/html; charset=utf-8";
|
||||||
res.writeHead(200, http.STATUS_CODES[200], customHeaders);
|
res.writeHead(200, http.STATUS_CODES[200], customHeaders);
|
||||||
|
|
||||||
// Read custom header and footer content (if available)
|
var customDirListingHeader = "";
|
||||||
var customDirListingHeader = fs.existsSync(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/")) ?
|
var customDirListingFooter = "";
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/")).toString() :
|
|
||||||
(fs.existsSync(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/")) && (os.platform != "win32" || href != "/")) ?
|
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/")).toString() :
|
|
||||||
"";
|
|
||||||
var customDirListingFooter = fs.existsSync(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/")) ?
|
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/")).toString() :
|
|
||||||
(fs.existsSync(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/")) && (os.platform != "win32" || href != "/")) ?
|
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/")).toString() :
|
|
||||||
"";
|
|
||||||
|
|
||||||
|
function getCustomDirListingHeader(callback) {
|
||||||
|
fs.readFile(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/"), function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
if (err.code == "ENOENT" || err.code == "EISDIR") {
|
||||||
|
if (os.platform != "win32" || href != "/") {
|
||||||
|
fs.readFile(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/"), function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
if (err.code == "ENOENT" || err.code == "EISDIR") {
|
||||||
|
callback();
|
||||||
|
} else {
|
||||||
|
callServerError(500, err);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
customDirListingHeader = data.toString();
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
callServerError(500, err);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
customDirListingHeader = data.toString();
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCustomDirListingFooter(callback) {
|
||||||
|
fs.readFile(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/"), function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
if (err.code == "ENOENT" || err.code == "EISDIR") {
|
||||||
|
if (os.platform != "win32" || href != "/") {
|
||||||
|
fs.readFile(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/"), function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
if (err.code == "ENOENT" || err.code == "EISDIR") {
|
||||||
|
callback();
|
||||||
|
} else {
|
||||||
|
callServerError(500, err);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
customDirListingFooter = data.toString();
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
callServerError(500, err);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
customDirListingFooter = data.toString();
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read custom header and footer content (if available)
|
||||||
|
getCustomDirListingHeader(function () {
|
||||||
|
getCustomDirListingFooter(function () {
|
||||||
// Check if custom header has HTML tag
|
// Check if custom header has HTML tag
|
||||||
var headerHasHTMLTag = customDirListingHeader.replace(/<!--(?:(?:(?!--\>)[\s\S])*|)(?:-->|$)/g, "").match(/<html(?![a-zA-Z0-9])(?:"(?:\\(?:[\s\S]|$)|[^\\"])*(?:"|$)|'(?:\\(?:[\s\S]|$)|[^\\'])*(?:'|$)|[^'">])*(?:>|$)/i);
|
var headerHasHTMLTag = customDirListingHeader.replace(/<!--(?:(?:(?!--\>)[\s\S])*|)(?:-->|$)/g, "").match(/<html(?![a-zA-Z0-9])(?:"(?:\\(?:[\s\S]|$)|[^\\"])*(?:"|$)|'(?:\\(?:[\s\S]|$)|[^\\'])*(?:'|$)|[^'">])*(?:>|$)/i);
|
||||||
|
|
||||||
|
@ -4045,6 +4099,8 @@ if (!cluster.isPrimary) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
// Directory listing is disabled, call 403 Forbidden error
|
// Directory listing is disabled, call 403 Forbidden error
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
|
|
Reference in a new issue