Update to SVR.JS 3.14.4
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7 KiB After Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.5 KiB |
|
@ -3,7 +3,7 @@
|
||||||
"port": 80,
|
"port": 80,
|
||||||
"pubport": 80,
|
"pubport": 80,
|
||||||
"page404": "404.html",
|
"page404": "404.html",
|
||||||
"timestamp": 1701600932028,
|
"timestamp": 1709477722479,
|
||||||
"blacklist": [],
|
"blacklist": [],
|
||||||
"nonStandardCodes": [],
|
"nonStandardCodes": [],
|
||||||
"enableCompression": true,
|
"enableCompression": true,
|
||||||
|
@ -58,5 +58,6 @@
|
||||||
"useWebRootServerSideScript": true,
|
"useWebRootServerSideScript": true,
|
||||||
"exposeModsInErrorPages": true,
|
"exposeModsInErrorPages": true,
|
||||||
"disableTrailingSlashRedirects": false,
|
"disableTrailingSlashRedirects": false,
|
||||||
"environmentVariables": {}
|
"environmentVariables": {},
|
||||||
|
"allowDoubleSlashes": false
|
||||||
}
|
}
|
||||||
|
|
149
index.html
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>SVR.JS 3.14.3</title>
|
<title>SVR.JS 3.14.4</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,89 +12,90 @@
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Welcome to SVR.JS 3.14.3</h1>
|
<h1>Welcome to SVR.JS 3.14.4</h1>
|
||||||
<br/>
|
<br/>
|
||||||
<img src="/logo.png" style="width: 256px;" />
|
<img src="/logo.png" style="width: 256px; max-width: 100%;" />
|
||||||
<br/>
|
<br/>
|
||||||
<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>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;">
|
<code style="background-color: #e0e0e0; padding: 5px; text-align: left; display: block; display: inline-block;">
|
||||||
<code>
|
<pre style="margin: 0.2em; white-space: pre-wrap; overflow-wrap: break-word; word-wrap: break-word; word-break: break-all; word-break: break-word">{
|
||||||
{<br/>
|
"users": [],
|
||||||
"users": [],<br/>
|
"port": 80,
|
||||||
"port": 80,<br/>
|
"pubport": 80,
|
||||||
"pubport": 80,<br/>
|
"page404": "404.html",
|
||||||
"page404": "404.html",<br/>
|
"timestamp": 1709477722479,
|
||||||
"timestamp": 1701600932028,<br/>
|
"blacklist": [],
|
||||||
"blacklist": [],<br/>
|
"nonStandardCodes": [],
|
||||||
"nonStandardCodes": [],<br/>
|
"enableCompression": true,
|
||||||
"enableCompression": true,<br/>
|
"customHeaders": {},
|
||||||
"customHeaders": {},<br/>
|
"enableHTTP2": false,
|
||||||
"enableHTTP2": false,<br/>
|
"enableLogging": true,
|
||||||
"enableLogging": true,<br/>
|
"enableDirectoryListing": true,
|
||||||
"enableDirectoryListing": true,<br/>
|
"enableDirectoryListingWithDefaultHead": false,
|
||||||
"enableDirectoryListingWithDefaultHead": false,<br/>
|
"serverAdministratorEmail": "[no contact information]",
|
||||||
"serverAdministratorEmail": "[no contact information]",<br/>
|
"stackHidden": false,
|
||||||
"stackHidden": false,<br/>
|
"enableRemoteLogBrowsing": false,
|
||||||
"enableRemoteLogBrowsing": false,<br/>
|
"exposeServerVersion": true,
|
||||||
"exposeServerVersion": true,<br/>
|
"disableServerSideScriptExpose": true,
|
||||||
"disableServerSideScriptExpose": true,<br/>
|
"rewriteMap": [
|
||||||
"rewriteMap": [<br/>
|
{
|
||||||
{<br/>
|
"definingRegex": "/^\\/serverSideScript\\.js(?:$|[#?])/",
|
||||||
"definingRegex": "/^\\/serverSideScript\\.js(?:$|[#?])/",<br/>
|
"replacements": [
|
||||||
"replacements": [<br/>
|
{
|
||||||
{<br/>
|
"regex": "/^\\/serverSideScript\\.js($|[#?])/",
|
||||||
"regex": "/^\\/serverSideScript\\.js($|[#?])/",<br/>
|
"replacement": "/NONEXISTENT_PAGE$1"
|
||||||
"replacement": "/NONEXISTENT_PAGE$1"<br/>
|
|
||||||
}<br/>
|
|
||||||
]<br/>
|
|
||||||
},<br/>
|
|
||||||
{<br/>
|
|
||||||
"definingRegex": "/^\\/testdir_rewritten(?:$|[\\/?#])/",<br/>
|
|
||||||
"replacements": [<br/>
|
|
||||||
{<br/>
|
|
||||||
"regex": "/^\\/testdir_rewritten($|[\\/?#])/",<br/>
|
|
||||||
"replacement": "/testdir$1"<br/>
|
|
||||||
}<br/>
|
|
||||||
]<br/>
|
|
||||||
}<br/>
|
|
||||||
],<br/>
|
|
||||||
"allowStatus": true,<br/>
|
|
||||||
"dontCompress": [<br/>
|
|
||||||
"/.*\\.ipxe$/",<br/>
|
|
||||||
"/.*\\.img$/",<br/>
|
|
||||||
"/.*\\.iso$/",<br/>
|
|
||||||
"/.*\\.png$/",<br/>
|
|
||||||
"/.*\\.jpg$/",<br/>
|
|
||||||
"/.*\\.webp$/"<br/>
|
|
||||||
],<br/>
|
|
||||||
"enableIPSpoofing": false,<br/>
|
|
||||||
"secure": false,<br/>
|
|
||||||
"sni": {},<br/>
|
|
||||||
"disableNonEncryptedServer": false,<br/>
|
|
||||||
"disableToHTTPSRedirect": false,<br/>
|
|
||||||
"enableETag": true,<br/>
|
|
||||||
"disableUnusedWorkerTermination": false,<br/>
|
|
||||||
"rewriteDirtyURLs": true,<br/>
|
|
||||||
"errorPages": [],<br/>
|
|
||||||
"useWebRootServerSideScript": true,<br/>
|
|
||||||
"exposeModsInErrorPages": true,<br/>
|
|
||||||
"disableTrailingSlashRedirects": false,<br/>
|
|
||||||
"environmentVariables": {}<br/>
|
|
||||||
}
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"definingRegex": "/^\\/testdir_rewritten(?:$|[\\/?#])/",
|
||||||
|
"replacements": [
|
||||||
|
{
|
||||||
|
"regex": "/^\\/testdir_rewritten($|[\\/?#])/",
|
||||||
|
"replacement": "/testdir$1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"allowStatus": true,
|
||||||
|
"dontCompress": [
|
||||||
|
"/.*\\.ipxe$/",
|
||||||
|
"/.*\\.img$/",
|
||||||
|
"/.*\\.iso$/",
|
||||||
|
"/.*\\.png$/",
|
||||||
|
"/.*\\.jpg$/",
|
||||||
|
"/.*\\.webp$/"
|
||||||
|
],
|
||||||
|
"enableIPSpoofing": false,
|
||||||
|
"secure": false,
|
||||||
|
"sni": {},
|
||||||
|
"disableNonEncryptedServer": false,
|
||||||
|
"disableToHTTPSRedirect": false,
|
||||||
|
"enableETag": true,
|
||||||
|
"disableUnusedWorkerTermination": false,
|
||||||
|
"rewriteDirtyURLs": true,
|
||||||
|
"errorPages": [],
|
||||||
|
"useWebRootServerSideScript": true,
|
||||||
|
"exposeModsInErrorPages": true,
|
||||||
|
"disableTrailingSlashRedirects": false,
|
||||||
|
"environmentVariables": {},
|
||||||
|
"allowDoubleSlashes": false
|
||||||
|
}</pre>
|
||||||
</code>
|
</code>
|
||||||
</div>
|
|
||||||
<p>Changes:</p>
|
<p>Changes:</p>
|
||||||
<ul>
|
<ul style="display: inline-block; margin: 0;">
|
||||||
<li>Fixed bug with URLs beginning with multiple slashes being rewritten incorrectly.</li>
|
<li>Updated <i>tar</i> and <i>graceful-fs</i> libraries.</li>
|
||||||
|
<li>Added support for URLs with double slashes.</li>
|
||||||
|
<li>Rewritten HTTP to HTTPS redirect functionality.</li>
|
||||||
|
<li>Changed default directory listing icons.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<br/>
|
<p>
|
||||||
<a href="/tests.html">Tests</a><br/>
|
<a href="/tests.html">Tests</a><br/>
|
||||||
<a href="/licenses">Licenses</a><br/>
|
<a href="/licenses/">Licenses</a><br/>
|
||||||
<a href="/svrjsstatus.svr">SVR.JS status page</a><br/>
|
<a href="/svrjsstatus.svr">SVR.JS status page</a><br/>
|
||||||
<a href="https://svrjs.org/docs">More Information</a>
|
<a href="https://svrjs.org/docs">SVR.JS documentation</a>
|
||||||
<br/>
|
</p>
|
||||||
<br/>
|
|
||||||
<img src="/powered.png" />
|
<img src="/powered.png" />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>SVR.JS 3.14.3 Licenses</title>
|
<title>SVR.JS 3.14.4 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.14.3 Licenses</h1>
|
<h1>SVR.JS 3.14.4 Licenses</h1>
|
||||||
<h2>SVR.JS 3.14.3</h2>
|
<h2>SVR.JS 3.14.4</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,8 @@
|
||||||
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.14.3</h2>
|
<h2>Packages used by SVR.JS 3.14.4</h2>
|
||||||
|
<div style="width: 100%; max-width: 1280px; margin: auto">
|
||||||
<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;">
|
||||||
|
@ -341,6 +342,7 @@
|
||||||
Yet Another Linked List
|
Yet Another Linked List
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<br/>
|
<br/>
|
||||||
<img src="/powered.png" />
|
<img src="/powered.png" />
|
||||||
</body>
|
</body>
|
||||||
|
|
108
node_modules/formidable/package.json
generated
vendored
|
@ -1,36 +1,33 @@
|
||||||
{
|
{
|
||||||
"_from": "formidable@2",
|
|
||||||
"_id": "formidable@2.1.2",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
|
|
||||||
"_location": "/formidable",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "formidable@2",
|
|
||||||
"name": "formidable",
|
"name": "formidable",
|
||||||
"escapedName": "formidable",
|
"version": "2.1.2",
|
||||||
"rawSpec": "2",
|
"license": "MIT",
|
||||||
"saveSpec": null,
|
"description": "A node.js module for parsing form data, especially file uploads.",
|
||||||
"fetchSpec": "2"
|
"homepage": "https://github.com/node-formidable/formidable",
|
||||||
},
|
"funding": "https://ko-fi.com/tunnckoCore/commissions",
|
||||||
"_requiredBy": [
|
"repository": "node-formidable/formidable",
|
||||||
"#USER",
|
"main": "./src/index.js",
|
||||||
"/"
|
"files": [
|
||||||
|
"src"
|
||||||
],
|
],
|
||||||
"_resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
|
"publishConfig": {
|
||||||
"_shasum": "fa973a2bec150e4ce7cac15589d7a25fc30ebd89",
|
"access": "public",
|
||||||
"_spec": "formidable@2",
|
"tag": "v2-latest"
|
||||||
"_where": "/home/ubuntu/forbidden",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/node-formidable/formidable/issues"
|
|
||||||
},
|
},
|
||||||
"bundleDependencies": false,
|
"scripts": {
|
||||||
"commitlint": {
|
"bench": "node benchmark",
|
||||||
"extends": [
|
"fmt": "yarn run fmt:prepare '**/*'",
|
||||||
"@commitlint/config-conventional"
|
"fmt:prepare": "prettier --write",
|
||||||
]
|
"lint": "yarn run lint:prepare .",
|
||||||
|
"lint:prepare": "eslint --cache --fix --quiet --format codeframe",
|
||||||
|
"reinstall": "del-cli ./node_modules ./yarn.lock",
|
||||||
|
"postreinstall": "yarn setup",
|
||||||
|
"setup": "yarn",
|
||||||
|
"pretest": "del-cli ./test/tmp && make-dir ./test/tmp",
|
||||||
|
"test": "jest --coverage",
|
||||||
|
"pretest:ci": "yarn run pretest",
|
||||||
|
"test:ci": "nyc jest --coverage",
|
||||||
|
"test:jest": "jest --coverage"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dezalgo": "^1.0.4",
|
"dezalgo": "^1.0.4",
|
||||||
|
@ -38,8 +35,6 @@
|
||||||
"once": "^1.4.0",
|
"once": "^1.4.0",
|
||||||
"qs": "^6.11.0"
|
"qs": "^6.11.0"
|
||||||
},
|
},
|
||||||
"deprecated": false,
|
|
||||||
"description": "A node.js module for parsing form data, especially file uploads.",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "8.3.5",
|
"@commitlint/cli": "8.3.5",
|
||||||
"@commitlint/config-conventional": "8.3.4",
|
"@commitlint/config-conventional": "8.3.4",
|
||||||
|
@ -62,17 +57,6 @@
|
||||||
"request": "2.88.2",
|
"request": "2.88.2",
|
||||||
"supertest": "4.0.2"
|
"supertest": "4.0.2"
|
||||||
},
|
},
|
||||||
"files": [
|
|
||||||
"src"
|
|
||||||
],
|
|
||||||
"funding": "https://ko-fi.com/tunnckoCore/commissions",
|
|
||||||
"homepage": "https://github.com/node-formidable/formidable",
|
|
||||||
"husky": {
|
|
||||||
"hooks": {
|
|
||||||
"pre-commit": "git status --porcelain && yarn lint-staged",
|
|
||||||
"commit-msg": "yarn commitlint -E HUSKY_GIT_PARAMS"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"jest": {
|
"jest": {
|
||||||
"verbose": true
|
"verbose": true
|
||||||
},
|
},
|
||||||
|
@ -86,7 +70,17 @@
|
||||||
"ulpoad",
|
"ulpoad",
|
||||||
"file"
|
"file"
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"husky": {
|
||||||
|
"hooks": {
|
||||||
|
"pre-commit": "git status --porcelain && yarn lint-staged",
|
||||||
|
"commit-msg": "yarn commitlint -E HUSKY_GIT_PARAMS"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commitlint": {
|
||||||
|
"extends": [
|
||||||
|
"@commitlint/config-conventional"
|
||||||
|
]
|
||||||
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"!*.{js,jsx,ts,tsx}": [
|
"!*.{js,jsx,ts,tsx}": [
|
||||||
"yarn run fmt:prepare"
|
"yarn run fmt:prepare"
|
||||||
|
@ -95,36 +89,10 @@
|
||||||
"yarn run lint"
|
"yarn run lint"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"main": "./src/index.js",
|
|
||||||
"name": "formidable",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public",
|
|
||||||
"tag": "v2-latest"
|
|
||||||
},
|
|
||||||
"renovate": {
|
"renovate": {
|
||||||
"extends": [
|
"extends": [
|
||||||
"@tunnckocore",
|
"@tunnckocore",
|
||||||
":pinAllExceptPeerDependencies"
|
":pinAllExceptPeerDependencies"
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/node-formidable/formidable.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"bench": "node benchmark",
|
|
||||||
"fmt": "yarn run fmt:prepare '**/*'",
|
|
||||||
"fmt:prepare": "prettier --write",
|
|
||||||
"lint": "yarn run lint:prepare .",
|
|
||||||
"lint:prepare": "eslint --cache --fix --quiet --format codeframe",
|
|
||||||
"postreinstall": "yarn setup",
|
|
||||||
"pretest": "del-cli ./test/tmp && make-dir ./test/tmp",
|
|
||||||
"pretest:ci": "yarn run pretest",
|
|
||||||
"reinstall": "del-cli ./node_modules ./yarn.lock",
|
|
||||||
"setup": "yarn",
|
|
||||||
"test": "jest --coverage",
|
|
||||||
"test:ci": "nyc jest --coverage",
|
|
||||||
"test:jest": "jest --coverage"
|
|
||||||
},
|
|
||||||
"version": "2.1.2"
|
|
||||||
}
|
}
|
||||||
|
|
2
node_modules/graceful-fs/LICENSE
generated
vendored
Executable file → Normal file
|
@ -1,6 +1,6 @@
|
||||||
The ISC License
|
The ISC License
|
||||||
|
|
||||||
Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors
|
Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
12
node_modules/graceful-fs/README.md
generated
vendored
Executable file → Normal file
|
@ -30,9 +30,19 @@ the directory.
|
||||||
var fs = require('graceful-fs')
|
var fs = require('graceful-fs')
|
||||||
|
|
||||||
// now go and do stuff with it...
|
// now go and do stuff with it...
|
||||||
fs.readFileSync('some-file-or-whatever')
|
fs.readFile('some-file-or-whatever', (err, data) => {
|
||||||
|
// Do stuff here.
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Sync methods
|
||||||
|
|
||||||
|
This module cannot intercept or handle `EMFILE` or `ENFILE` errors from sync
|
||||||
|
methods. If you use sync methods which open file descriptors then you are
|
||||||
|
responsible for dealing with any errors.
|
||||||
|
|
||||||
|
This is a known limitation, not a bug.
|
||||||
|
|
||||||
## Global Patching
|
## Global Patching
|
||||||
|
|
||||||
If you want to patch the global fs module (or any other fs-like
|
If you want to patch the global fs module (or any other fs-like
|
||||||
|
|
6
node_modules/graceful-fs/clone.js
generated
vendored
Executable file → Normal file
|
@ -2,12 +2,16 @@
|
||||||
|
|
||||||
module.exports = clone
|
module.exports = clone
|
||||||
|
|
||||||
|
var getPrototypeOf = Object.getPrototypeOf || function (obj) {
|
||||||
|
return obj.__proto__
|
||||||
|
}
|
||||||
|
|
||||||
function clone (obj) {
|
function clone (obj) {
|
||||||
if (obj === null || typeof obj !== 'object')
|
if (obj === null || typeof obj !== 'object')
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
if (obj instanceof Object)
|
if (obj instanceof Object)
|
||||||
var copy = { __proto__: obj.__proto__ }
|
var copy = { __proto__: getPrototypeOf(obj) }
|
||||||
else
|
else
|
||||||
var copy = Object.create(null)
|
var copy = Object.create(null)
|
||||||
|
|
||||||
|
|
162
node_modules/graceful-fs/graceful-fs.js
generated
vendored
Executable file → Normal file
|
@ -54,7 +54,7 @@ if (!fs[gracefulQueue]) {
|
||||||
return fs$close.call(fs, fd, function (err) {
|
return fs$close.call(fs, fd, function (err) {
|
||||||
// This function uses the graceful-fs shared queue
|
// This function uses the graceful-fs shared queue
|
||||||
if (!err) {
|
if (!err) {
|
||||||
retry()
|
resetQueue()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
|
@ -72,7 +72,7 @@ if (!fs[gracefulQueue]) {
|
||||||
function closeSync (fd) {
|
function closeSync (fd) {
|
||||||
// This function uses the graceful-fs shared queue
|
// This function uses the graceful-fs shared queue
|
||||||
fs$closeSync.apply(fs, arguments)
|
fs$closeSync.apply(fs, arguments)
|
||||||
retry()
|
resetQueue()
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.defineProperty(closeSync, previousSymbol, {
|
Object.defineProperty(closeSync, previousSymbol, {
|
||||||
|
@ -114,14 +114,13 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$readFile(path, options, cb)
|
return go$readFile(path, options, cb)
|
||||||
|
|
||||||
function go$readFile (path, options, cb) {
|
function go$readFile (path, options, cb, startTime) {
|
||||||
return fs$readFile(path, options, function (err) {
|
return fs$readFile(path, options, function (err) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$readFile, [path, options, cb]])
|
enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -135,14 +134,13 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$writeFile(path, data, options, cb)
|
return go$writeFile(path, data, options, cb)
|
||||||
|
|
||||||
function go$writeFile (path, data, options, cb) {
|
function go$writeFile (path, data, options, cb, startTime) {
|
||||||
return fs$writeFile(path, data, options, function (err) {
|
return fs$writeFile(path, data, options, function (err) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$writeFile, [path, data, options, cb]])
|
enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -157,14 +155,35 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$appendFile(path, data, options, cb)
|
return go$appendFile(path, data, options, cb)
|
||||||
|
|
||||||
function go$appendFile (path, data, options, cb) {
|
function go$appendFile (path, data, options, cb, startTime) {
|
||||||
return fs$appendFile(path, data, options, function (err) {
|
return fs$appendFile(path, data, options, function (err) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$appendFile, [path, data, options, cb]])
|
enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
|
||||||
|
else {
|
||||||
|
if (typeof cb === 'function')
|
||||||
|
cb.apply(this, arguments)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var fs$copyFile = fs.copyFile
|
||||||
|
if (fs$copyFile)
|
||||||
|
fs.copyFile = copyFile
|
||||||
|
function copyFile (src, dest, flags, cb) {
|
||||||
|
if (typeof flags === 'function') {
|
||||||
|
cb = flags
|
||||||
|
flags = 0
|
||||||
|
}
|
||||||
|
return go$copyFile(src, dest, flags, cb)
|
||||||
|
|
||||||
|
function go$copyFile (src, dest, flags, cb, startTime) {
|
||||||
|
return fs$copyFile(src, dest, flags, function (err) {
|
||||||
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
|
enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -172,34 +191,44 @@ function patch (fs) {
|
||||||
|
|
||||||
var fs$readdir = fs.readdir
|
var fs$readdir = fs.readdir
|
||||||
fs.readdir = readdir
|
fs.readdir = readdir
|
||||||
|
var noReaddirOptionVersions = /^v[0-5]\./
|
||||||
function readdir (path, options, cb) {
|
function readdir (path, options, cb) {
|
||||||
var args = [path]
|
if (typeof options === 'function')
|
||||||
if (typeof options !== 'function') {
|
cb = options, options = null
|
||||||
args.push(options)
|
|
||||||
} else {
|
var go$readdir = noReaddirOptionVersions.test(process.version)
|
||||||
cb = options
|
? function go$readdir (path, options, cb, startTime) {
|
||||||
|
return fs$readdir(path, fs$readdirCallback(
|
||||||
|
path, options, cb, startTime
|
||||||
|
))
|
||||||
|
}
|
||||||
|
: function go$readdir (path, options, cb, startTime) {
|
||||||
|
return fs$readdir(path, options, fs$readdirCallback(
|
||||||
|
path, options, cb, startTime
|
||||||
|
))
|
||||||
}
|
}
|
||||||
args.push(go$readdir$cb)
|
|
||||||
|
|
||||||
return go$readdir(args)
|
return go$readdir(path, options, cb)
|
||||||
|
|
||||||
function go$readdir$cb (err, files) {
|
function fs$readdirCallback (path, options, cb, startTime) {
|
||||||
|
return function (err, files) {
|
||||||
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
|
enqueue([
|
||||||
|
go$readdir,
|
||||||
|
[path, options, cb],
|
||||||
|
err,
|
||||||
|
startTime || Date.now(),
|
||||||
|
Date.now()
|
||||||
|
])
|
||||||
|
else {
|
||||||
if (files && files.sort)
|
if (files && files.sort)
|
||||||
files.sort()
|
files.sort()
|
||||||
|
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
|
||||||
enqueue([go$readdir, [args]])
|
|
||||||
|
|
||||||
else {
|
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.call(this, err, files)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function go$readdir (args) {
|
|
||||||
return fs$readdir.apply(fs, args)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.version.substr(0, 4) === 'v0.8') {
|
if (process.version.substr(0, 4) === 'v0.8') {
|
||||||
|
@ -324,14 +353,13 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$open(path, flags, mode, cb)
|
return go$open(path, flags, mode, cb)
|
||||||
|
|
||||||
function go$open (path, flags, mode, cb) {
|
function go$open (path, flags, mode, cb, startTime) {
|
||||||
return fs$open(path, flags, mode, function (err, fd) {
|
return fs$open(path, flags, mode, function (err, fd) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$open, [path, flags, mode, cb]])
|
enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -343,12 +371,78 @@ function patch (fs) {
|
||||||
function enqueue (elem) {
|
function enqueue (elem) {
|
||||||
debug('ENQUEUE', elem[0].name, elem[1])
|
debug('ENQUEUE', elem[0].name, elem[1])
|
||||||
fs[gracefulQueue].push(elem)
|
fs[gracefulQueue].push(elem)
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep track of the timeout between retry() calls
|
||||||
|
var retryTimer
|
||||||
|
|
||||||
|
// reset the startTime and lastTime to now
|
||||||
|
// this resets the start of the 60 second overall timeout as well as the
|
||||||
|
// delay between attempts so that we'll retry these jobs sooner
|
||||||
|
function resetQueue () {
|
||||||
|
var now = Date.now()
|
||||||
|
for (var i = 0; i < fs[gracefulQueue].length; ++i) {
|
||||||
|
// entries that are only a length of 2 are from an older version, don't
|
||||||
|
// bother modifying those since they'll be retried anyway.
|
||||||
|
if (fs[gracefulQueue][i].length > 2) {
|
||||||
|
fs[gracefulQueue][i][3] = now // startTime
|
||||||
|
fs[gracefulQueue][i][4] = now // lastTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// call retry to make sure we're actively processing the queue
|
||||||
|
retry()
|
||||||
}
|
}
|
||||||
|
|
||||||
function retry () {
|
function retry () {
|
||||||
|
// clear the timer and remove it to help prevent unintended concurrency
|
||||||
|
clearTimeout(retryTimer)
|
||||||
|
retryTimer = undefined
|
||||||
|
|
||||||
|
if (fs[gracefulQueue].length === 0)
|
||||||
|
return
|
||||||
|
|
||||||
var elem = fs[gracefulQueue].shift()
|
var elem = fs[gracefulQueue].shift()
|
||||||
if (elem) {
|
var fn = elem[0]
|
||||||
debug('RETRY', elem[0].name, elem[1])
|
var args = elem[1]
|
||||||
elem[0].apply(null, elem[1])
|
// these items may be unset if they were added by an older graceful-fs
|
||||||
|
var err = elem[2]
|
||||||
|
var startTime = elem[3]
|
||||||
|
var lastTime = elem[4]
|
||||||
|
|
||||||
|
// if we don't have a startTime we have no way of knowing if we've waited
|
||||||
|
// long enough, so go ahead and retry this item now
|
||||||
|
if (startTime === undefined) {
|
||||||
|
debug('RETRY', fn.name, args)
|
||||||
|
fn.apply(null, args)
|
||||||
|
} else if (Date.now() - startTime >= 60000) {
|
||||||
|
// it's been more than 60 seconds total, bail now
|
||||||
|
debug('TIMEOUT', fn.name, args)
|
||||||
|
var cb = args.pop()
|
||||||
|
if (typeof cb === 'function')
|
||||||
|
cb.call(null, err)
|
||||||
|
} else {
|
||||||
|
// the amount of time between the last attempt and right now
|
||||||
|
var sinceAttempt = Date.now() - lastTime
|
||||||
|
// the amount of time between when we first tried, and when we last tried
|
||||||
|
// rounded up to at least 1
|
||||||
|
var sinceStart = Math.max(lastTime - startTime, 1)
|
||||||
|
// backoff. wait longer than the total time we've been retrying, but only
|
||||||
|
// up to a maximum of 100ms
|
||||||
|
var desiredDelay = Math.min(sinceStart * 1.2, 100)
|
||||||
|
// it's been long enough since the last retry, do it again
|
||||||
|
if (sinceAttempt >= desiredDelay) {
|
||||||
|
debug('RETRY', fn.name, args)
|
||||||
|
fn.apply(null, args.concat([startTime]))
|
||||||
|
} else {
|
||||||
|
// if we can't do this job yet, push it to the end of the queue
|
||||||
|
// and let the next iteration check again
|
||||||
|
fs[gracefulQueue].push(elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// schedule our next run if one isn't already scheduled
|
||||||
|
if (retryTimer === undefined) {
|
||||||
|
retryTimer = setTimeout(retry, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
0
node_modules/graceful-fs/legacy-streams.js
generated
vendored
Executable file → Normal file
81
node_modules/graceful-fs/package.json
generated
vendored
Executable file → Normal file
|
@ -1,52 +1,22 @@
|
||||||
{
|
{
|
||||||
"_from": "graceful-fs",
|
|
||||||
"_id": "graceful-fs@4.2.4",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
|
|
||||||
"_location": "/graceful-fs",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "graceful-fs",
|
|
||||||
"name": "graceful-fs",
|
"name": "graceful-fs",
|
||||||
"escapedName": "graceful-fs",
|
|
||||||
"rawSpec": "",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "latest"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"#USER",
|
|
||||||
"/"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
|
|
||||||
"_shasum": "2256bde14d3632958c465ebc96dc467ca07a29fb",
|
|
||||||
"_spec": "graceful-fs",
|
|
||||||
"_where": "/media/serveradmin/Server/developement",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/isaacs/node-graceful-fs/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "A drop-in replacement for fs, making various improvements.",
|
"description": "A drop-in replacement for fs, making various improvements.",
|
||||||
"devDependencies": {
|
"version": "4.2.11",
|
||||||
"import-fresh": "^2.0.0",
|
"repository": {
|
||||||
"mkdirp": "^0.5.0",
|
"type": "git",
|
||||||
"rimraf": "^2.2.8",
|
"url": "https://github.com/isaacs/node-graceful-fs"
|
||||||
"tap": "^12.7.0"
|
|
||||||
},
|
},
|
||||||
|
"main": "graceful-fs.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"files": [
|
"scripts": {
|
||||||
"fs.js",
|
"preversion": "npm test",
|
||||||
"graceful-fs.js",
|
"postversion": "npm publish",
|
||||||
"legacy-streams.js",
|
"postpublish": "git push origin --follow-tags",
|
||||||
"polyfills.js",
|
"test": "nyc --silent node test.js | tap -c -",
|
||||||
"clone.js"
|
"posttest": "nyc report"
|
||||||
],
|
},
|
||||||
"homepage": "https://github.com/isaacs/node-graceful-fs#readme",
|
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"fs",
|
"fs",
|
||||||
"module",
|
"module",
|
||||||
|
@ -64,17 +34,20 @@
|
||||||
"EACCESS"
|
"EACCESS"
|
||||||
],
|
],
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"main": "graceful-fs.js",
|
"devDependencies": {
|
||||||
"name": "graceful-fs",
|
"import-fresh": "^2.0.0",
|
||||||
"repository": {
|
"mkdirp": "^0.5.0",
|
||||||
"type": "git",
|
"rimraf": "^2.2.8",
|
||||||
"url": "git+https://github.com/isaacs/node-graceful-fs.git"
|
"tap": "^16.3.4"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"files": [
|
||||||
"postpublish": "git push origin --follow-tags",
|
"fs.js",
|
||||||
"postversion": "npm publish",
|
"graceful-fs.js",
|
||||||
"preversion": "npm test",
|
"legacy-streams.js",
|
||||||
"test": "node test.js | tap -"
|
"polyfills.js",
|
||||||
},
|
"clone.js"
|
||||||
"version": "4.2.4"
|
],
|
||||||
|
"tap": {
|
||||||
|
"reporter": "classic"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
37
node_modules/graceful-fs/polyfills.js
generated
vendored
Executable file → Normal file
|
@ -14,10 +14,14 @@ try {
|
||||||
process.cwd()
|
process.cwd()
|
||||||
} catch (er) {}
|
} catch (er) {}
|
||||||
|
|
||||||
var chdir = process.chdir
|
// This check is needed until node.js 12 is required
|
||||||
process.chdir = function(d) {
|
if (typeof process.chdir === 'function') {
|
||||||
|
var chdir = process.chdir
|
||||||
|
process.chdir = function (d) {
|
||||||
cwd = null
|
cwd = null
|
||||||
chdir.call(process, d)
|
chdir.call(process, d)
|
||||||
|
}
|
||||||
|
if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = patch
|
module.exports = patch
|
||||||
|
@ -67,13 +71,13 @@ function patch (fs) {
|
||||||
fs.lstatSync = statFixSync(fs.lstatSync)
|
fs.lstatSync = statFixSync(fs.lstatSync)
|
||||||
|
|
||||||
// if lchmod/lchown do not exist, then make them no-ops
|
// if lchmod/lchown do not exist, then make them no-ops
|
||||||
if (!fs.lchmod) {
|
if (fs.chmod && !fs.lchmod) {
|
||||||
fs.lchmod = function (path, mode, cb) {
|
fs.lchmod = function (path, mode, cb) {
|
||||||
if (cb) process.nextTick(cb)
|
if (cb) process.nextTick(cb)
|
||||||
}
|
}
|
||||||
fs.lchmodSync = function () {}
|
fs.lchmodSync = function () {}
|
||||||
}
|
}
|
||||||
if (!fs.lchown) {
|
if (fs.chown && !fs.lchown) {
|
||||||
fs.lchown = function (path, uid, gid, cb) {
|
fs.lchown = function (path, uid, gid, cb) {
|
||||||
if (cb) process.nextTick(cb)
|
if (cb) process.nextTick(cb)
|
||||||
}
|
}
|
||||||
|
@ -90,12 +94,14 @@ function patch (fs) {
|
||||||
// CPU to a busy looping process, which can cause the program causing the lock
|
// CPU to a busy looping process, which can cause the program causing the lock
|
||||||
// contention to be starved of CPU by node, so the contention doesn't resolve.
|
// contention to be starved of CPU by node, so the contention doesn't resolve.
|
||||||
if (platform === "win32") {
|
if (platform === "win32") {
|
||||||
fs.rename = (function (fs$rename) { return function (from, to, cb) {
|
fs.rename = typeof fs.rename !== 'function' ? fs.rename
|
||||||
|
: (function (fs$rename) {
|
||||||
|
function rename (from, to, cb) {
|
||||||
var start = Date.now()
|
var start = Date.now()
|
||||||
var backoff = 0;
|
var backoff = 0;
|
||||||
fs$rename(from, to, function CB (er) {
|
fs$rename(from, to, function CB (er) {
|
||||||
if (er
|
if (er
|
||||||
&& (er.code === "EACCES" || er.code === "EPERM")
|
&& (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY")
|
||||||
&& Date.now() - start < 60000) {
|
&& Date.now() - start < 60000) {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
fs.stat(to, function (stater, st) {
|
fs.stat(to, function (stater, st) {
|
||||||
|
@ -111,11 +117,15 @@ function patch (fs) {
|
||||||
}
|
}
|
||||||
if (cb) cb(er)
|
if (cb) cb(er)
|
||||||
})
|
})
|
||||||
}})(fs.rename)
|
}
|
||||||
|
if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)
|
||||||
|
return rename
|
||||||
|
})(fs.rename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if read() returns EAGAIN, then just try it again.
|
// if read() returns EAGAIN, then just try it again.
|
||||||
fs.read = (function (fs$read) {
|
fs.read = typeof fs.read !== 'function' ? fs.read
|
||||||
|
: (function (fs$read) {
|
||||||
function read (fd, buffer, offset, length, position, callback_) {
|
function read (fd, buffer, offset, length, position, callback_) {
|
||||||
var callback
|
var callback
|
||||||
if (callback_ && typeof callback_ === 'function') {
|
if (callback_ && typeof callback_ === 'function') {
|
||||||
|
@ -132,11 +142,12 @@ function patch (fs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This ensures `util.promisify` works as it does for native `fs.read`.
|
// This ensures `util.promisify` works as it does for native `fs.read`.
|
||||||
read.__proto__ = fs$read
|
if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)
|
||||||
return read
|
return read
|
||||||
})(fs.read)
|
})(fs.read)
|
||||||
|
|
||||||
fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync
|
||||||
|
: (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
||||||
var eagCounter = 0
|
var eagCounter = 0
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
|
@ -195,7 +206,7 @@ function patch (fs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function patchLutimes (fs) {
|
function patchLutimes (fs) {
|
||||||
if (constants.hasOwnProperty("O_SYMLINK")) {
|
if (constants.hasOwnProperty("O_SYMLINK") && fs.futimes) {
|
||||||
fs.lutimes = function (path, at, mt, cb) {
|
fs.lutimes = function (path, at, mt, cb) {
|
||||||
fs.open(path, constants.O_SYMLINK, function (er, fd) {
|
fs.open(path, constants.O_SYMLINK, function (er, fd) {
|
||||||
if (er) {
|
if (er) {
|
||||||
|
@ -229,7 +240,7 @@ function patch (fs) {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else if (fs.futimes) {
|
||||||
fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
|
fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
|
||||||
fs.lutimesSync = function () {}
|
fs.lutimesSync = function () {}
|
||||||
}
|
}
|
||||||
|
@ -306,8 +317,10 @@ function patch (fs) {
|
||||||
return function (target, options) {
|
return function (target, options) {
|
||||||
var stats = options ? orig.call(fs, target, options)
|
var stats = options ? orig.call(fs, target, options)
|
||||||
: orig.call(fs, target)
|
: orig.call(fs, target)
|
||||||
|
if (stats) {
|
||||||
if (stats.uid < 0) stats.uid += 0x100000000
|
if (stats.uid < 0) stats.uid += 0x100000000
|
||||||
if (stats.gid < 0) stats.gid += 0x100000000
|
if (stats.gid < 0) stats.gid += 0x100000000
|
||||||
|
}
|
||||||
return stats;
|
return stats;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
83
node_modules/mime-db/package.json
generated
vendored
|
@ -1,49 +1,23 @@
|
||||||
{
|
{
|
||||||
"_from": "mime-db@1.52.0",
|
|
||||||
"_id": "mime-db@1.52.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
|
||||||
"_location": "/mime-db",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "version",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "mime-db@1.52.0",
|
|
||||||
"name": "mime-db",
|
"name": "mime-db",
|
||||||
"escapedName": "mime-db",
|
|
||||||
"rawSpec": "1.52.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "1.52.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/mime-types"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
||||||
"_shasum": "bbabcdc02859f4987301c856e3387ce5ec43bf70",
|
|
||||||
"_spec": "mime-db@1.52.0",
|
|
||||||
"_where": "/home/ubuntu/formidable/node_modules/mime-types",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/jshttp/mime-db/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Douglas Christopher Wilson",
|
|
||||||
"email": "doug@somethingdoug.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Robert Kieffer",
|
|
||||||
"email": "robert@broofa.com",
|
|
||||||
"url": "http://github.com/broofa"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Media Type Database",
|
"description": "Media Type Database",
|
||||||
|
"version": "1.52.0",
|
||||||
|
"contributors": [
|
||||||
|
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
||||||
|
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
|
||||||
|
"Robert Kieffer <robert@broofa.com> (http://github.com/broofa)"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"mime",
|
||||||
|
"db",
|
||||||
|
"type",
|
||||||
|
"types",
|
||||||
|
"database",
|
||||||
|
"charset",
|
||||||
|
"charsets"
|
||||||
|
],
|
||||||
|
"repository": "jshttp/mime-db",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bluebird": "3.7.2",
|
"bluebird": "3.7.2",
|
||||||
"co": "4.6.0",
|
"co": "4.6.0",
|
||||||
|
@ -63,9 +37,6 @@
|
||||||
"raw-body": "2.5.0",
|
"raw-body": "2.5.0",
|
||||||
"stream-to-array": "2.3.0"
|
"stream-to-array": "2.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"HISTORY.md",
|
"HISTORY.md",
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
|
@ -73,21 +44,8 @@
|
||||||
"db.json",
|
"db.json",
|
||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/jshttp/mime-db#readme",
|
"engines": {
|
||||||
"keywords": [
|
"node": ">= 0.6"
|
||||||
"mime",
|
|
||||||
"db",
|
|
||||||
"type",
|
|
||||||
"types",
|
|
||||||
"database",
|
|
||||||
"charset",
|
|
||||||
"charsets"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "mime-db",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jshttp/mime-db.git"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node scripts/build",
|
"build": "node scripts/build",
|
||||||
|
@ -98,6 +56,5 @@
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
||||||
"update": "npm run fetch && npm run build",
|
"update": "npm run fetch && npm run build",
|
||||||
"version": "node scripts/version-history.js && git add HISTORY.md"
|
"version": "node scripts/version-history.js && git add HISTORY.md"
|
||||||
},
|
}
|
||||||
"version": "1.52.0"
|
|
||||||
}
|
}
|
||||||
|
|
72
node_modules/mime-types/package.json
generated
vendored
|
@ -1,53 +1,21 @@
|
||||||
{
|
{
|
||||||
"_from": "mime-types",
|
|
||||||
"_id": "mime-types@2.1.35",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
|
||||||
"_location": "/mime-types",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "mime-types",
|
|
||||||
"name": "mime-types",
|
"name": "mime-types",
|
||||||
"escapedName": "mime-types",
|
"description": "The ultimate javascript content-type utility.",
|
||||||
"rawSpec": "",
|
"version": "2.1.35",
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "latest"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"#USER",
|
|
||||||
"/"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
|
||||||
"_shasum": "381a871b62a734450660ae3deee44813f70d959a",
|
|
||||||
"_spec": "mime-types",
|
|
||||||
"_where": "/home/ubuntu/formidable/a",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/jshttp/mime-types/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
"contributors": [
|
||||||
{
|
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
||||||
"name": "Douglas Christopher Wilson",
|
"Jeremiah Senkpiel <fishrock123@rocketmail.com> (https://searchbeam.jit.su)",
|
||||||
"email": "doug@somethingdoug.com"
|
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jeremiah Senkpiel",
|
|
||||||
"email": "fishrock123@rocketmail.com",
|
|
||||||
"url": "https://searchbeam.jit.su"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com"
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"mime",
|
||||||
|
"types"
|
||||||
|
],
|
||||||
|
"repository": "jshttp/mime-types",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mime-db": "1.52.0"
|
"mime-db": "1.52.0"
|
||||||
},
|
},
|
||||||
"deprecated": false,
|
|
||||||
"description": "The ultimate javascript content-type utility.",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "7.32.0",
|
"eslint": "7.32.0",
|
||||||
"eslint-config-standard": "14.1.1",
|
"eslint-config-standard": "14.1.1",
|
||||||
|
@ -59,30 +27,18 @@
|
||||||
"mocha": "9.2.2",
|
"mocha": "9.2.2",
|
||||||
"nyc": "15.1.0"
|
"nyc": "15.1.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"HISTORY.md",
|
"HISTORY.md",
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/jshttp/mime-types#readme",
|
"engines": {
|
||||||
"keywords": [
|
"node": ">= 0.6"
|
||||||
"mime",
|
|
||||||
"types"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "mime-types",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jshttp/mime-types.git"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"test": "mocha --reporter spec test/test.js",
|
"test": "mocha --reporter spec test/test.js",
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
||||||
},
|
}
|
||||||
"version": "2.1.35"
|
|
||||||
}
|
}
|
||||||
|
|
68
node_modules/tar/CHANGELOG.md
generated
vendored
|
@ -1,68 +0,0 @@
|
||||||
# Changelog
|
|
||||||
|
|
||||||
## 6.0
|
|
||||||
|
|
||||||
- Drop support for node 6 and 8
|
|
||||||
- fix symlinks and hardlinks on windows being packed with `\`-style path
|
|
||||||
targets
|
|
||||||
|
|
||||||
## 5.0
|
|
||||||
|
|
||||||
- Address unpack race conditions using path reservations
|
|
||||||
- Change large-numbers errors from TypeError to Error
|
|
||||||
- Add `TAR_*` error codes
|
|
||||||
- Raise `TAR_BAD_ARCHIVE` warning/error when there are no valid entries
|
|
||||||
found in an archive
|
|
||||||
- do not treat ignored entries as an invalid archive
|
|
||||||
- drop support for node v4
|
|
||||||
- unpack: conditionally use a file mapping to write files on Windows
|
|
||||||
- Set more portable 'mode' value in portable mode
|
|
||||||
- Set `portable` gzip option in portable mode
|
|
||||||
|
|
||||||
## 4.4
|
|
||||||
|
|
||||||
- Add 'mtime' option to tar creation to force mtime
|
|
||||||
- unpack: only reuse file fs entries if nlink = 1
|
|
||||||
- unpack: rename before unlinking files on Windows
|
|
||||||
- Fix encoding/decoding of base-256 numbers
|
|
||||||
- Use `stat` instead of `lstat` when checking CWD
|
|
||||||
- Always provide a callback to fs.close()
|
|
||||||
|
|
||||||
## 4.3
|
|
||||||
|
|
||||||
- Add 'transform' unpack option
|
|
||||||
|
|
||||||
## 4.2
|
|
||||||
|
|
||||||
- Fail when zlib fails
|
|
||||||
|
|
||||||
## 4.1
|
|
||||||
|
|
||||||
- Add noMtime flag for tar creation
|
|
||||||
|
|
||||||
## 4.0
|
|
||||||
|
|
||||||
- unpack: raise error if cwd is missing or not a dir
|
|
||||||
- pack: don't drop dots from dotfiles when prefixing
|
|
||||||
|
|
||||||
## 3.1
|
|
||||||
|
|
||||||
- Support `@file.tar` as an entry argument to copy entries from one tar
|
|
||||||
file to another.
|
|
||||||
- Add `noPax` option
|
|
||||||
- `noResume` option for tar.t
|
|
||||||
- win32: convert `>|<?:` chars to windows-friendly form
|
|
||||||
- Exclude mtime for dirs in portable mode
|
|
||||||
|
|
||||||
## 3.0
|
|
||||||
|
|
||||||
- Minipass-based implementation
|
|
||||||
- Entirely new API surface, `tar.c()`, `tar.x()` etc., much closer to
|
|
||||||
system tar semantics
|
|
||||||
- Massive performance improvement
|
|
||||||
- Require node 4.x and higher
|
|
||||||
|
|
||||||
## 0.x, 1.x, 2.x - 2011-2014
|
|
||||||
|
|
||||||
- fstream-based implementation
|
|
||||||
- slow and kinda bad, but better than npm shelling out to the system `tar`
|
|
12
node_modules/tar/lib/pack.js
generated
vendored
|
@ -79,6 +79,11 @@ const Pack = warner(class Pack extends Minipass {
|
||||||
|
|
||||||
this.portable = !!opt.portable
|
this.portable = !!opt.portable
|
||||||
this.zip = null
|
this.zip = null
|
||||||
|
|
||||||
|
if (opt.gzip || opt.brotli) {
|
||||||
|
if (opt.gzip && opt.brotli) {
|
||||||
|
throw new TypeError('gzip and brotli are mutually exclusive')
|
||||||
|
}
|
||||||
if (opt.gzip) {
|
if (opt.gzip) {
|
||||||
if (typeof opt.gzip !== 'object') {
|
if (typeof opt.gzip !== 'object') {
|
||||||
opt.gzip = {}
|
opt.gzip = {}
|
||||||
|
@ -87,6 +92,13 @@ const Pack = warner(class Pack extends Minipass {
|
||||||
opt.gzip.portable = true
|
opt.gzip.portable = true
|
||||||
}
|
}
|
||||||
this.zip = new zlib.Gzip(opt.gzip)
|
this.zip = new zlib.Gzip(opt.gzip)
|
||||||
|
}
|
||||||
|
if (opt.brotli) {
|
||||||
|
if (typeof opt.brotli !== 'object') {
|
||||||
|
opt.brotli = {}
|
||||||
|
}
|
||||||
|
this.zip = new zlib.BrotliCompress(opt.brotli)
|
||||||
|
}
|
||||||
this.zip.on('data', chunk => super.write(chunk))
|
this.zip.on('data', chunk => super.write(chunk))
|
||||||
this.zip.on('end', _ => super.end())
|
this.zip.on('end', _ => super.end())
|
||||||
this.zip.on('drain', _ => this[ONDRAIN]())
|
this.zip.on('drain', _ => this[ONDRAIN]())
|
||||||
|
|
49
node_modules/tar/lib/parse.js
generated
vendored
|
@ -97,6 +97,16 @@ module.exports = warner(class Parser extends EE {
|
||||||
this.strict = !!opt.strict
|
this.strict = !!opt.strict
|
||||||
this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize
|
this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize
|
||||||
this.filter = typeof opt.filter === 'function' ? opt.filter : noop
|
this.filter = typeof opt.filter === 'function' ? opt.filter : noop
|
||||||
|
// Unlike gzip, brotli doesn't have any magic bytes to identify it
|
||||||
|
// Users need to explicitly tell us they're extracting a brotli file
|
||||||
|
// Or we infer from the file extension
|
||||||
|
const isTBR = (opt.file && (
|
||||||
|
opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr')))
|
||||||
|
// if it's a tbr file it MIGHT be brotli, but we don't know until
|
||||||
|
// we look at it and verify it's not a valid tar file.
|
||||||
|
this.brotli = !opt.gzip && opt.brotli !== undefined ? opt.brotli
|
||||||
|
: isTBR ? undefined
|
||||||
|
: false
|
||||||
|
|
||||||
// have to set this so that streams are ok piping into it
|
// have to set this so that streams are ok piping into it
|
||||||
this.writable = true
|
this.writable = true
|
||||||
|
@ -347,7 +357,9 @@ module.exports = warner(class Parser extends EE {
|
||||||
}
|
}
|
||||||
|
|
||||||
// first write, might be gzipped
|
// first write, might be gzipped
|
||||||
if (this[UNZIP] === null && chunk) {
|
const needSniff = this[UNZIP] === null ||
|
||||||
|
this.brotli === undefined && this[UNZIP] === false
|
||||||
|
if (needSniff && chunk) {
|
||||||
if (this[BUFFER]) {
|
if (this[BUFFER]) {
|
||||||
chunk = Buffer.concat([this[BUFFER], chunk])
|
chunk = Buffer.concat([this[BUFFER], chunk])
|
||||||
this[BUFFER] = null
|
this[BUFFER] = null
|
||||||
|
@ -356,15 +368,45 @@ module.exports = warner(class Parser extends EE {
|
||||||
this[BUFFER] = chunk
|
this[BUFFER] = chunk
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// look for gzip header
|
||||||
for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) {
|
for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) {
|
||||||
if (chunk[i] !== gzipHeader[i]) {
|
if (chunk[i] !== gzipHeader[i]) {
|
||||||
this[UNZIP] = false
|
this[UNZIP] = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this[UNZIP] === null) {
|
|
||||||
|
const maybeBrotli = this.brotli === undefined
|
||||||
|
if (this[UNZIP] === false && maybeBrotli) {
|
||||||
|
// read the first header to see if it's a valid tar file. If so,
|
||||||
|
// we can safely assume that it's not actually brotli, despite the
|
||||||
|
// .tbr or .tar.br file extension.
|
||||||
|
// if we ended before getting a full chunk, yes, def brotli
|
||||||
|
if (chunk.length < 512) {
|
||||||
|
if (this[ENDED]) {
|
||||||
|
this.brotli = true
|
||||||
|
} else {
|
||||||
|
this[BUFFER] = chunk
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if it's tar, it's pretty reliably not brotli, chances of
|
||||||
|
// that happening are astronomical.
|
||||||
|
try {
|
||||||
|
new Header(chunk.slice(0, 512))
|
||||||
|
this.brotli = false
|
||||||
|
} catch (_) {
|
||||||
|
this.brotli = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this[UNZIP] === null || (this[UNZIP] === false && this.brotli)) {
|
||||||
const ended = this[ENDED]
|
const ended = this[ENDED]
|
||||||
this[ENDED] = false
|
this[ENDED] = false
|
||||||
this[UNZIP] = new zlib.Unzip()
|
this[UNZIP] = this[UNZIP] === null
|
||||||
|
? new zlib.Unzip()
|
||||||
|
: new zlib.BrotliDecompress()
|
||||||
this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))
|
this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))
|
||||||
this[UNZIP].on('error', er => this.abort(er))
|
this[UNZIP].on('error', er => this.abort(er))
|
||||||
this[UNZIP].on('end', _ => {
|
this[UNZIP].on('end', _ => {
|
||||||
|
@ -502,6 +544,7 @@ module.exports = warner(class Parser extends EE {
|
||||||
this[UNZIP].end(chunk)
|
this[UNZIP].end(chunk)
|
||||||
} else {
|
} else {
|
||||||
this[ENDED] = true
|
this[ENDED] = true
|
||||||
|
if (this.brotli === undefined) chunk = chunk || Buffer.alloc(0)
|
||||||
this.write(chunk)
|
this.write(chunk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
node_modules/tar/lib/replace.js
generated
vendored
|
@ -23,7 +23,7 @@ module.exports = (opt_, files, cb) => {
|
||||||
throw new TypeError('file is required')
|
throw new TypeError('file is required')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt.gzip) {
|
if (opt.gzip || opt.brotli || opt.file.endsWith('.br') || opt.file.endsWith('.tbr')) {
|
||||||
throw new TypeError('cannot append to compressed archives')
|
throw new TypeError('cannot append to compressed archives')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
node_modules/tar/lib/update.js
generated
vendored
|
@ -13,7 +13,7 @@ module.exports = (opt_, files, cb) => {
|
||||||
throw new TypeError('file is required')
|
throw new TypeError('file is required')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt.gzip) {
|
if (opt.gzip || opt.brotli || opt.file.endsWith('.br') || opt.file.endsWith('.tbr')) {
|
||||||
throw new TypeError('cannot append to compressed archives')
|
throw new TypeError('cannot append to compressed archives')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
61
node_modules/tar/package.json
generated
vendored
|
@ -1,35 +1,17 @@
|
||||||
{
|
{
|
||||||
"_from": "tar",
|
"author": "GitHub Inc.",
|
||||||
"_id": "tar@6.1.15",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
|
|
||||||
"_location": "/tar",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "tar",
|
|
||||||
"name": "tar",
|
"name": "tar",
|
||||||
"escapedName": "tar",
|
"description": "tar for node",
|
||||||
"rawSpec": "",
|
"version": "6.2.0",
|
||||||
"saveSpec": null,
|
"repository": {
|
||||||
"fetchSpec": "latest"
|
"type": "git",
|
||||||
|
"url": "https://github.com/isaacs/node-tar.git"
|
||||||
},
|
},
|
||||||
"_requiredBy": [
|
"scripts": {
|
||||||
"#USER",
|
"genparse": "node scripts/generate-parse-fixtures.js",
|
||||||
"/"
|
"snap": "tap",
|
||||||
],
|
"test": "tap"
|
||||||
"_resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
|
|
||||||
"_shasum": "c9738b0b98845a3b344d334b8fa3041aaba53a69",
|
|
||||||
"_spec": "tar",
|
|
||||||
"_where": "/home/ubuntu/fix",
|
|
||||||
"author": {
|
|
||||||
"name": "GitHub Inc."
|
|
||||||
},
|
},
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/isaacs/node-tar/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chownr": "^2.0.0",
|
"chownr": "^2.0.0",
|
||||||
"fs-minipass": "^2.0.0",
|
"fs-minipass": "^2.0.0",
|
||||||
|
@ -38,8 +20,6 @@
|
||||||
"mkdirp": "^1.0.3",
|
"mkdirp": "^1.0.3",
|
||||||
"yallist": "^4.0.0"
|
"yallist": "^4.0.0"
|
||||||
},
|
},
|
||||||
"deprecated": false,
|
|
||||||
"description": "tar for node",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@npmcli/eslint-config": "^4.0.0",
|
"@npmcli/eslint-config": "^4.0.0",
|
||||||
"@npmcli/template-oss": "4.11.0",
|
"@npmcli/template-oss": "4.11.0",
|
||||||
|
@ -51,6 +31,7 @@
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"tap": "^16.0.1"
|
"tap": "^16.0.1"
|
||||||
},
|
},
|
||||||
|
"license": "ISC",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
},
|
},
|
||||||
|
@ -59,23 +40,6 @@
|
||||||
"lib/",
|
"lib/",
|
||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/isaacs/node-tar#readme",
|
|
||||||
"license": "ISC",
|
|
||||||
"name": "tar",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/isaacs/node-tar.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"genparse": "node scripts/generate-parse-fixtures.js",
|
|
||||||
"lint": "eslint \"**/*.js\"",
|
|
||||||
"lintfix": "npm run lint -- --fix",
|
|
||||||
"postlint": "template-oss-check",
|
|
||||||
"posttest": "npm run lint",
|
|
||||||
"snap": "tap",
|
|
||||||
"template-oss-apply": "template-oss-apply --force",
|
|
||||||
"test": "tap"
|
|
||||||
},
|
|
||||||
"tap": {
|
"tap": {
|
||||||
"coverage-map": "map.js",
|
"coverage-map": "map.js",
|
||||||
"timeout": 0,
|
"timeout": 0,
|
||||||
|
@ -102,6 +66,5 @@
|
||||||
"16.x",
|
"16.x",
|
||||||
"18.x"
|
"18.x"
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
"version": "6.1.15"
|
|
||||||
}
|
}
|
||||||
|
|
160
svr.js
|
@ -69,7 +69,7 @@ function deleteFolderRecursive(path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var os = require("os");
|
var os = require("os");
|
||||||
var version = "3.14.3";
|
var version = "3.14.4";
|
||||||
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
|
||||||
|
@ -1176,6 +1176,8 @@ var disableTrailingSlashRedirects = false;
|
||||||
var environmentVariables = {};
|
var environmentVariables = {};
|
||||||
var wwwrootPostfixesVHost = [];
|
var wwwrootPostfixesVHost = [];
|
||||||
var wwwrootPostfixPrefixesVHost = [];
|
var wwwrootPostfixPrefixesVHost = [];
|
||||||
|
var allowDoubleSlashes = false;
|
||||||
|
var allowPostfixDoubleSlashes = false;
|
||||||
|
|
||||||
// Get properties from config.json
|
// Get properties from config.json
|
||||||
if (configJSON.blacklist != undefined) rawBlackList = configJSON.blacklist;
|
if (configJSON.blacklist != undefined) rawBlackList = configJSON.blacklist;
|
||||||
|
@ -1231,6 +1233,8 @@ if (configJSON.disableTrailingSlashRedirects != undefined) disableTrailingSlashR
|
||||||
if (configJSON.environmentVariables != undefined) environmentVariables = configJSON.environmentVariables;
|
if (configJSON.environmentVariables != undefined) environmentVariables = configJSON.environmentVariables;
|
||||||
if (configJSON.wwwrootPostfixesVHost != undefined) wwwrootPostfixesVHost = configJSON.wwwrootPostfixesVHost;
|
if (configJSON.wwwrootPostfixesVHost != undefined) wwwrootPostfixesVHost = configJSON.wwwrootPostfixesVHost;
|
||||||
if (configJSON.wwwrootPostfixPrefixesVHost != undefined) wwwrootPostfixPrefixesVHost = configJSON.wwwrootPostfixPrefixesVHost;
|
if (configJSON.wwwrootPostfixPrefixesVHost != undefined) wwwrootPostfixPrefixesVHost = configJSON.wwwrootPostfixPrefixesVHost;
|
||||||
|
if (configJSON.allowDoubleSlashes != undefined) allowDoubleSlashes = configJSON.allowDoubleSlashes;
|
||||||
|
if (configJSON.allowPostfixDoubleSlashes != undefined) allowPostfixDoubleSlashes = configJSON.allowPostfixDoubleSlashes;
|
||||||
|
|
||||||
var wwwrootError = null;
|
var wwwrootError = null;
|
||||||
try {
|
try {
|
||||||
|
@ -1288,13 +1292,12 @@ if (vnum === undefined) vnum = 0;
|
||||||
if (process.isBun) vnum = 64;
|
if (process.isBun) vnum = 64;
|
||||||
|
|
||||||
// SVR.JS path sanitizer function
|
// SVR.JS path sanitizer function
|
||||||
function sanitizeURL(resource) {
|
function sanitizeURL(resource, allowDoubleSlashes) {
|
||||||
if (resource == "*") return "*";
|
if (resource == "*" || resource == "") return resource;
|
||||||
if (resource == "") return "";
|
|
||||||
// Remove null characters
|
// Remove null characters
|
||||||
resource = resource.replace(/%00/ig, "").replace(/\0/g, "");
|
resource = resource.replace(/%00|\0/g, "");
|
||||||
// Check if URL is malformed (e.g. %c0%af or %u002f or simply %as)
|
// Check if URL is malformed (e.g. %c0%af or %u002f or simply %as)
|
||||||
if (resource.match(/%(?:c[01]|f[ef]|(?![0-9a-f]{2}).{2}|.{0,1}$)/gi)) throw new URIError("URI malformed");
|
if (resource.match(/%(?:c[01]|f[ef]|(?![0-9a-f]{2}).{2}|.{0,1}$)/i)) throw new URIError("URI malformed");
|
||||||
// Decode URL-encoded characters while preserving certain characters
|
// Decode URL-encoded characters while preserving certain characters
|
||||||
resource = resource.replace(/%([0-9a-f]{2})/gi, function (match, hex) {
|
resource = resource.replace(/%([0-9a-f]{2})/gi, function (match, hex) {
|
||||||
var decodedChar = String.fromCharCode(parseInt(hex, 16));
|
var decodedChar = String.fromCharCode(parseInt(hex, 16));
|
||||||
|
@ -1308,14 +1311,14 @@ function sanitizeURL(resource) {
|
||||||
var sanitizedResource = resource;
|
var sanitizedResource = resource;
|
||||||
// Ensure the resource starts with a slash
|
// Ensure the resource starts with a slash
|
||||||
if (resource[0] != "/") sanitizedResource = "/" + sanitizedResource;
|
if (resource[0] != "/") sanitizedResource = "/" + sanitizedResource;
|
||||||
// Convert backslashes to slashes and remove duplicate slashes
|
// Convert backslashes to slashes and handle duplicate slashes
|
||||||
sanitizedResource = sanitizedResource.replace(/\\/g, "/").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\\/g, "/").replace(allowDoubleSlashes ? /\/{3,}/g : /\/+/g, "/");
|
||||||
// Handle relative navigation (e.g., "/./", "/../", "../", "./"), also remove trailing dots in paths
|
// Handle relative navigation (e.g., "/./", "/../", "../", "./"), also remove trailing dots in paths
|
||||||
sanitizedResource = sanitizedResource.replace(/\/\.(?:\.{2,})?(?=($|\/))/g, "$1").replace(/([^.\/])\.+(?=($|\/))/g, "$1$2").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\/\.(?:\.{2,})?(?=\/|$)/g, "").replace(/([^.\/])\.+(?=\/|$)/g, "$1");
|
||||||
while (sanitizedResource.match(/\/(?!\.\.\/)[^\/]+\/\.\.(?=(\/|$))/g)) {
|
while (sanitizedResource.match(/\/(?!\.\.\/)[^\/]+\/\.\.(?=\/|$)/)) {
|
||||||
sanitizedResource = sanitizedResource.replace(/\/(?!\.\.\/)[^\/]+\/\.\.(?=(\/|$))/g, "$1").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\/(?!\.\.\/)[^\/]+\/\.\.(?=\/|$)/g, "");
|
||||||
}
|
}
|
||||||
sanitizedResource = sanitizedResource.replace(/\/\.\.(?=(\/|$))/g, "$1").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\/\.\.(?=\/|$)/g, "");
|
||||||
if (sanitizedResource.length == 0) return "/";
|
if (sanitizedResource.length == 0) return "/";
|
||||||
else return sanitizedResource;
|
else return sanitizedResource;
|
||||||
}
|
}
|
||||||
|
@ -3328,17 +3331,19 @@ if (!cluster.isPrimary) {
|
||||||
|
|
||||||
// Function to parse a URL string into a URL object
|
// Function to parse a URL string into a URL object
|
||||||
function parseURL(uri) {
|
function parseURL(uri) {
|
||||||
|
// Prepare the path (remove multiple slashes)
|
||||||
|
var preparedURI = uri.replace(/^\/{2,}/,"/");
|
||||||
// Check if the URL API is available (Node.js version >= 10)
|
// Check if the URL API is available (Node.js version >= 10)
|
||||||
if (typeof URL !== "undefined" && url.Url) {
|
if (typeof URL !== "undefined" && url.Url) {
|
||||||
try {
|
try {
|
||||||
// Create a new URL object using the provided URI and base URL
|
// Create a new URL object using the provided URI and base URL
|
||||||
var uobject = new URL(uri.replace(/^\/{2,}/,"/"), "http" + (req.socket.encrypted ? "s" : "") + "://" + (req.headers.host ? req.headers.host : (domain ? domain : "unknown.invalid")));
|
var uobject = new URL(preparedURI, "http" + (req.socket.encrypted ? "s" : "") + "://" + (req.headers.host ? req.headers.host : (domain ? domain : "unknown.invalid")));
|
||||||
|
|
||||||
// Create a new URL object (similar to deprecated url.Url)
|
// Create a new URL object (similar to deprecated url.Url)
|
||||||
var nuobject = new url.Url();
|
var nuobject = new url.Url();
|
||||||
|
|
||||||
// Set properties of the new URL object from the provided URL
|
// Set properties of the new URL object from the provided URL
|
||||||
if (uri.indexOf("/") != -1) nuobject.slashes = true;
|
if (preparedURI.indexOf("/") != -1) nuobject.slashes = true;
|
||||||
if (uobject.protocol != "") nuobject.protocol = uobject.protocol;
|
if (uobject.protocol != "") nuobject.protocol = uobject.protocol;
|
||||||
if (uobject.username != "" && uobject.password != "") nuobject.auth = uobject.username + ":" + uobject.password;
|
if (uobject.username != "" && uobject.password != "") nuobject.auth = uobject.username + ":" + uobject.password;
|
||||||
if (uobject.host != "") nuobject.host = uobject.host;
|
if (uobject.host != "") nuobject.host = uobject.host;
|
||||||
|
@ -3350,7 +3355,7 @@ if (!cluster.isPrimary) {
|
||||||
if (uobject.href != "") nuobject.href = uobject.href;
|
if (uobject.href != "") nuobject.href = uobject.href;
|
||||||
|
|
||||||
// Adjust the pathname and href properties if the URI doesn't start with "/"
|
// Adjust the pathname and href properties if the URI doesn't start with "/"
|
||||||
if (uri.indexOf("/") != 0) {
|
if (preparedURI.indexOf("/") != 0) {
|
||||||
if (nuobject.pathname) {
|
if (nuobject.pathname) {
|
||||||
nuobject.pathname = nuobject.pathname.substr(1);
|
nuobject.pathname = nuobject.pathname.substr(1);
|
||||||
nuobject.href = nuobject.pathname + (nuobject.search ? nuobject.search : "");
|
nuobject.href = nuobject.pathname + (nuobject.search ? nuobject.search : "");
|
||||||
|
@ -3372,11 +3377,11 @@ if (!cluster.isPrimary) {
|
||||||
return nuobject;
|
return nuobject;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// If there was an error using the URL API, fall back to deprecated url.parse
|
// If there was an error using the URL API, fall back to deprecated url.parse
|
||||||
return url.parse(uri, true);
|
return url.parse(preparedURI, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// If the URL API is not available, fall back to deprecated url.parse
|
// If the URL API is not available, fall back to deprecated url.parse
|
||||||
return url.parse(uri, true);
|
return url.parse(preparedURI, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3770,7 +3775,7 @@ if (!cluster.isPrimary) {
|
||||||
} else if (estats.isSocket()) {
|
} else if (estats.isSocket()) {
|
||||||
entry = entry.replace("[img]", "/.dirimages/socket.png").replace("[alt]", "[SCK]");
|
entry = entry.replace("[img]", "/.dirimages/socket.png").replace("[alt]", "[SCK]");
|
||||||
}
|
}
|
||||||
} else if ((/README/ig).test(ename) || (/LICEN[SC]E/ig).test(ename)) {
|
} else if (ename.match(/README|LICEN[SC]E/i)) {
|
||||||
entry = entry.replace("[img]", "/.dirimages/important.png").replace("[alt]", "[IMP]");
|
entry = entry.replace("[img]", "/.dirimages/important.png").replace("[alt]", "[IMP]");
|
||||||
} else if (checkEXT(ename, ".html") || checkEXT(ename, ".htm") || checkEXT(ename, ".xml") || checkEXT(ename, ".xhtml") || checkEXT(ename, ".shtml")) {
|
} else if (checkEXT(ename, ".html") || checkEXT(ename, ".htm") || checkEXT(ename, ".xml") || checkEXT(ename, ".xhtml") || checkEXT(ename, ".shtml")) {
|
||||||
entry = entry.replace("[img]", "/.dirimages/html.png").replace("[alt]", (checkEXT(ename, ".xml") ? "[XML]" : "[HTM]"));
|
entry = entry.replace("[img]", "/.dirimages/html.png").replace("[alt]", (checkEXT(ename, ".xml") ? "[XML]" : "[HTM]"));
|
||||||
|
@ -4154,7 +4159,7 @@ if (!cluster.isPrimary) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanitize URL
|
// Sanitize URL
|
||||||
var sanitizedHref = sanitizeURL(href);
|
var sanitizedHref = sanitizeURL(href, allowDoubleSlashes);
|
||||||
var preparedReqUrl = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
var preparedReqUrl = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
||||||
|
|
||||||
// Check if URL is "dirty"
|
// Check if URL is "dirty"
|
||||||
|
@ -4214,67 +4219,22 @@ if (!cluster.isPrimary) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var urlp = parseURL("http://" + hostx);
|
var isPublicServer = !(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);
|
||||||
try {
|
|
||||||
if (urlp.path.indexOf("//") == 0) {
|
var destinationPort = 0;
|
||||||
urlp = parseURL("http:" + url.path);
|
|
||||||
}
|
var parsedHostx = hostx.match(/(\[[^\]]*\]|[^:]*)(?::([0-9]+))?/);
|
||||||
} catch (err) {
|
var hostname = parsedHostx[1];
|
||||||
// URL parse error...
|
var hostPort = parsedHostx[2] ? parseInt(parsedHostx[2]) : 80;
|
||||||
|
if (isNaN(hostPort)) hostPort = 80;
|
||||||
|
|
||||||
|
if (hostPort == port || (port == pubport && !isPublicServer)) {
|
||||||
|
destinationPort = sport;
|
||||||
|
} else {
|
||||||
|
destinationPort = spubport;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (urlp.host == "localhost" || urlp.host == "localhost:" + port.toString() || urlp.host == "127.0.0.1" || urlp.host == "127.0.0.1:" + port.toString() || urlp.host == "::1" || urlp.host == "::1:" + port.toString()) {
|
redirect("https://" + hostname + (destinationPort == 443 ? "" : (":" + destinationPort)) + req.url);
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (sport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + sport.toString();
|
|
||||||
urlp.port = sport.toString();
|
|
||||||
}
|
|
||||||
} else if (urlp.host == (listenAddress ? listenAddress : host) || urlp.host == (listenAddress ? listenAddress : host) + ":" + port.toString()) {
|
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (sport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + sport.toString();
|
|
||||||
urlp.port = sport.toString();
|
|
||||||
}
|
|
||||||
} else if (urlp.host == pubip || urlp.host == pubip + ":" + pubport.toString()) {
|
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (spubport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + spubport.toString();
|
|
||||||
urlp.port = spubport.toString();
|
|
||||||
}
|
|
||||||
} else if (urlp.hostname == domain || urlp.hostname.indexOf(domain) != -1) {
|
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (spubport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + spubport.toString();
|
|
||||||
urlp.port = spubport.toString();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
urlp.protocol = "https:";
|
|
||||||
}
|
|
||||||
urlp.path = null;
|
|
||||||
urlp.pathname = null;
|
|
||||||
var lloc = url.format(urlp);
|
|
||||||
var requestURL = req.url;
|
|
||||||
try {
|
|
||||||
if (requestURL.split("/")[1].indexOf(".onion") != -1) {
|
|
||||||
requestURL = requestURL.split("/");
|
|
||||||
requestURL.shift();
|
|
||||||
requestURL.shift();
|
|
||||||
requestURL.unshift("");
|
|
||||||
requestURL = requestURL.join("/");
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// Leave URL as it is...
|
|
||||||
}
|
|
||||||
|
|
||||||
redirect(lloc + requestURL);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4313,7 +4273,13 @@ if (!cluster.isPrimary) {
|
||||||
doCallback = false;
|
doCallback = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
var tempRewrittenURL = rewrittenURL;
|
||||||
|
if (!mapEntry.allowDoubleSlashes) {
|
||||||
|
address = address.replace(/\/+/g,"/");
|
||||||
|
tempRewrittenURL = address;
|
||||||
|
}
|
||||||
if (matchHostname(mapEntry.host) && ipMatch(mapEntry.ip, req.socket ? req.socket.localAddress : undefined) && address.match(createRegex(mapEntry.definingRegex)) && !(mapEntry.isNotDirectory && _fileState == 2) && !(mapEntry.isNotFile && _fileState == 1)) {
|
if (matchHostname(mapEntry.host) && ipMatch(mapEntry.ip, req.socket ? req.socket.localAddress : undefined) && address.match(createRegex(mapEntry.definingRegex)) && !(mapEntry.isNotDirectory && _fileState == 2) && !(mapEntry.isNotFile && _fileState == 1)) {
|
||||||
|
rewrittenURL = tempRewrittenURL;
|
||||||
try {
|
try {
|
||||||
mapEntry.replacements.forEach(function (replacement) {
|
mapEntry.replacements.forEach(function (replacement) {
|
||||||
rewrittenURL = rewrittenURL.replace(createRegex(replacement.regex), replacement.replacement);
|
rewrittenURL = rewrittenURL.replace(createRegex(replacement.regex), replacement.replacement);
|
||||||
|
@ -4321,7 +4287,7 @@ if (!cluster.isPrimary) {
|
||||||
if (mapEntry.append) rewrittenURL += mapEntry.append;
|
if (mapEntry.append) rewrittenURL += mapEntry.append;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
doCallback = false;
|
doCallback = false;
|
||||||
callback(err, address);
|
callback(err, null);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4363,10 +4329,11 @@ if (!cluster.isPrimary) {
|
||||||
|
|
||||||
// Add web root postfixes
|
// Add web root postfixes
|
||||||
if (!isProxy) {
|
if (!isProxy) {
|
||||||
var urlWithPostfix = req.url;
|
var preparedReqUrl3 = (allowPostfixDoubleSlashes ? (href.replace(/\/+/,"/") + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "")) : req.url);
|
||||||
|
var urlWithPostfix = preparedReqUrl3;
|
||||||
var postfixPrefix = "";
|
var postfixPrefix = "";
|
||||||
wwwrootPostfixPrefixesVHost.every(function (currentPostfixPrefix) {
|
wwwrootPostfixPrefixesVHost.every(function (currentPostfixPrefix) {
|
||||||
if (req.url.indexOf(currentPostfixPrefix) == 0) {
|
if (preparedReqUrl3.indexOf(currentPostfixPrefix) == 0) {
|
||||||
if (currentPostfixPrefix.match(/\/+$/)) postfixPrefix = currentPostfixPrefix.replace(/\/+$/, "");
|
if (currentPostfixPrefix.match(/\/+$/)) postfixPrefix = currentPostfixPrefix.replace(/\/+$/, "");
|
||||||
else if (urlWithPostfix.length == currentPostfixPrefix.length || urlWithPostfix[currentPostfixPrefix.length] == "?" || urlWithPostfix[currentPostfixPrefix.length] == "/" || urlWithPostfix[currentPostfixPrefix.length] == "#") postfixPrefix = currentPostfixPrefix;
|
else if (urlWithPostfix.length == currentPostfixPrefix.length || urlWithPostfix[currentPostfixPrefix.length] == "?" || urlWithPostfix[currentPostfixPrefix.length] == "/" || urlWithPostfix[currentPostfixPrefix.length] == "#") postfixPrefix = currentPostfixPrefix;
|
||||||
else return true;
|
else return true;
|
||||||
|
@ -4377,14 +4344,14 @@ if (!cluster.isPrimary) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
wwwrootPostfixesVHost.every(function (postfixEntry) {
|
wwwrootPostfixesVHost.every(function (postfixEntry) {
|
||||||
if (matchHostname(postfixEntry.host) && ipMatch(postfixEntry.ip, req.socket ? req.socket.localAddress : undefined) && !(postfixEntry.skipRegex && req.url.match(createRegex(postfixEntry.skipRegex)))) {
|
if (matchHostname(postfixEntry.host) && ipMatch(postfixEntry.ip, req.socket ? req.socket.localAddress : undefined) && !(postfixEntry.skipRegex && preparedReqUrl3.match(createRegex(postfixEntry.skipRegex)))) {
|
||||||
urlWithPostfix = postfixPrefix + "/" + postfixEntry.postfix + urlWithPostfix;
|
urlWithPostfix = postfixPrefix + "/" + postfixEntry.postfix + urlWithPostfix;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (urlWithPostfix != req.url) {
|
if (urlWithPostfix != preparedReqUrl3) {
|
||||||
serverconsole.resmessage("Added web root postfix: " + req.url + " => " + urlWithPostfix);
|
serverconsole.resmessage("Added web root postfix: " + req.url + " => " + urlWithPostfix);
|
||||||
req.url = urlWithPostfix;
|
req.url = urlWithPostfix;
|
||||||
uobject = parseURL(req.url);
|
uobject = parseURL(req.url);
|
||||||
|
@ -4402,7 +4369,7 @@ if (!cluster.isPrimary) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sHref = sanitizeURL(href);
|
var sHref = sanitizeURL(href, allowDoubleSlashes);
|
||||||
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
||||||
|
|
||||||
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
||||||
|
@ -4463,7 +4430,7 @@ if (!cluster.isPrimary) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sHref = sanitizeURL(href);
|
var sHref = sanitizeURL(href, allowDoubleSlashes);
|
||||||
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
||||||
|
|
||||||
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
||||||
|
@ -4510,24 +4477,27 @@ if (!cluster.isPrimary) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prepare the path (remove multiple slashes)
|
||||||
|
var decodedHrefWithoutDuplicateSlashes = decodedHref.replace(/\/+/g,"/");
|
||||||
|
|
||||||
// Check if path is forbidden
|
// Check if path is forbidden
|
||||||
if ((isForbiddenPath(decodedHref, "config") || isForbiddenPath(decodedHref, "certificates")) && !isProxy) {
|
if ((isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "config") || isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "certificates")) && !isProxy) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to configuration file/certificates is denied.");
|
serverconsole.errmessage("Access to configuration file/certificates is denied.");
|
||||||
return;
|
return;
|
||||||
} else if (isIndexOfForbiddenPath(decodedHref, "temp") && !isProxy) {
|
} else if (isIndexOfForbiddenPath(decodedHrefWithoutDuplicateSlashes, "temp") && !isProxy) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to temporary folder is denied.");
|
serverconsole.errmessage("Access to temporary folder is denied.");
|
||||||
return;
|
return;
|
||||||
} else if (isIndexOfForbiddenPath(decodedHref, "log") && !isProxy && (configJSON.enableLogging || configJSON.enableLogging == undefined) && !configJSON.enableRemoteLogBrowsing) {
|
} else if (isIndexOfForbiddenPath(decodedHrefWithoutDuplicateSlashes, "log") && !isProxy && (configJSON.enableLogging || configJSON.enableLogging == undefined) && !configJSON.enableRemoteLogBrowsing) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to log files is denied.");
|
serverconsole.errmessage("Access to log files is denied.");
|
||||||
return;
|
return;
|
||||||
} else if (isForbiddenPath(decodedHref, "svrjs") && !isProxy && !exposeServerVersion) {
|
} else if (isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "svrjs") && !isProxy && !exposeServerVersion) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to SVR.JS script is denied.");
|
serverconsole.errmessage("Access to SVR.JS script is denied.");
|
||||||
return;
|
return;
|
||||||
} else if ((isForbiddenPath(decodedHref, "svrjs") || isForbiddenPath(decodedHref, "serverSideScripts") || isIndexOfForbiddenPath(decodedHref, "serverSideScriptDirectories")) && !isProxy && (configJSON.disableServerSideScriptExpose || configJSON.disableServerSideScriptExpose === undefined)) {
|
} else if ((isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "svrjs") || isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "serverSideScripts") || isIndexOfForbiddenPath(decodedHrefWithoutDuplicateSlashes, "serverSideScriptDirectories")) && !isProxy && (configJSON.disableServerSideScriptExpose || configJSON.disableServerSideScriptExpose === undefined)) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to sources is denied.");
|
serverconsole.errmessage("Access to sources is denied.");
|
||||||
return;
|
return;
|
||||||
|
@ -4541,14 +4511,15 @@ if (!cluster.isPrimary) {
|
||||||
for (var i = 0; i < nonStandardCodes.length; i++) {
|
for (var i = 0; i < nonStandardCodes.length; i++) {
|
||||||
if (matchHostname(nonStandardCodes[i].host) && ipMatch(nonStandardCodes[i].ip, req.socket ? req.socket.localAddress : undefined)) {
|
if (matchHostname(nonStandardCodes[i].host) && ipMatch(nonStandardCodes[i].ip, req.socket ? req.socket.localAddress : undefined)) {
|
||||||
var isMatch = false;
|
var isMatch = false;
|
||||||
|
var hrefWithoutDuplicateSlashes = href.replace(/\/+/g,"/");
|
||||||
if (nonStandardCodes[i].regex) {
|
if (nonStandardCodes[i].regex) {
|
||||||
// Regex match
|
// Regex match
|
||||||
var createdRegex = createRegex(nonStandardCodes[i].regex, true);
|
var createdRegex = createRegex(nonStandardCodes[i].regex, true);
|
||||||
isMatch = req.url.match(createdRegex) || href.match(createdRegex);
|
isMatch = req.url.match(createdRegex) || hrefWithoutDuplicateSlashes.match(createdRegex);
|
||||||
regexI[i] = createdRegex;
|
regexI[i] = createdRegex;
|
||||||
} else {
|
} else {
|
||||||
// Non-regex match
|
// Non-regex match
|
||||||
isMatch = nonStandardCodes[i].url == href || (os.platform() == "win32" && nonStandardCodes[i].url.toLowerCase() == href.toLowerCase());
|
isMatch = nonStandardCodes[i].url == hrefWithoutDuplicateSlashes || (os.platform() == "win32" && nonStandardCodes[i].url.toLowerCase() == hrefWithoutDuplicateSlashes.toLowerCase());
|
||||||
}
|
}
|
||||||
if (isMatch) {
|
if (isMatch) {
|
||||||
if (nonStandardCodes[i].scode == 401) {
|
if (nonStandardCodes[i].scode == 401) {
|
||||||
|
@ -4577,6 +4548,10 @@ if (!cluster.isPrimary) {
|
||||||
var location = "";
|
var location = "";
|
||||||
if (regexI[nonscodeIndex]) {
|
if (regexI[nonscodeIndex]) {
|
||||||
location = req.url.replace(regexI[nonscodeIndex], nonscode.location);
|
location = req.url.replace(regexI[nonscodeIndex], nonscode.location);
|
||||||
|
if(location == req.url) {
|
||||||
|
// Fallback replacement
|
||||||
|
location = hrefWithoutDuplicateSlashes.replace(regexI[nonscodeIndex], nonscode.location);
|
||||||
|
}
|
||||||
} else if (req.url.split("?")[1] == undefined || req.url.split("?")[1] == null || req.url.split("?")[1] == "" || req.url.split("?")[1] == " ") {
|
} else if (req.url.split("?")[1] == undefined || req.url.split("?")[1] == null || req.url.split("?")[1] == "" || req.url.split("?")[1] == " ") {
|
||||||
location = nonscode.location;
|
location = nonscode.location;
|
||||||
} else {
|
} else {
|
||||||
|
@ -5829,6 +5804,7 @@ function saveConfig() {
|
||||||
if (configJSONobj.exposeModsInErrorPages === undefined) configJSONobj.exposeModsInErrorPages = true;
|
if (configJSONobj.exposeModsInErrorPages === undefined) configJSONobj.exposeModsInErrorPages = true;
|
||||||
if (configJSONobj.disableTrailingSlashRedirects === undefined) configJSONobj.disableTrailingSlashRedirects = false;
|
if (configJSONobj.disableTrailingSlashRedirects === undefined) configJSONobj.disableTrailingSlashRedirects = false;
|
||||||
if (configJSONobj.environmentVariables === undefined) configJSONobj.environmentVariables = {};
|
if (configJSONobj.environmentVariables === undefined) configJSONobj.environmentVariables = {};
|
||||||
|
if (configJSONobj.allowDoubleSlashes === undefined) configJSONobj.allowDoubleSlashes = false;
|
||||||
|
|
||||||
var configString = JSON.stringify(configJSONobj, null, 2) + "\n";
|
var configString = JSON.stringify(configJSONobj, null, 2) + "\n";
|
||||||
fs.writeFileSync(__dirname + "/config.json", configString);
|
fs.writeFileSync(__dirname + "/config.json", configString);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>SVR.JS 3.14.3 Tests</title>
|
<title>SVR.JS 3.14.4 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.14.3 Tests</h1>
|
<h1>SVR.JS 3.14.4 Tests</h1>
|
||||||
<h2>Directory (without trailing slash)</h2>
|
<h2>Directory (without trailing slash)</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>
|
||||||
|
|