diff --git a/README.md b/README.md index 663873e..2307c42 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,9 @@ Options: --port, -p Set the port to listen on. [default: 8000] --hostname, -h Set the hostname to listen on. [default: "localhost"] --header, -H Set a specific header. + --corsDisable Disable CORS by automaticcally handle OPTION request. + Use --no-corsDisable to disable this feature + [boolean][default: true] --proxyHost, -P Set Host HTTP header to proxy hostname. [boolean] --verify Verify SSL certificates. Use --no-verify to disable. [boolean] [default: true] diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7de530e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,469 @@ +{ + "name": "http-proxy-cli", + "version": "2.2.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "http-proxy-cli", + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "http-proxy": "^1.18.1", + "yargs": "^13.2.1" + }, + "bin": { + "http-proxy": "bin/http-proxy.js" + }, + "devDependencies": { + "@types/http-proxy": "^1.17.9", + "@types/node": "^18.11.13", + "@types/yargs": "^17.0.17" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.11.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/string-width": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "13.3.2", + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + }, + "dependencies": { + "@types/http-proxy": { + "version": "1.17.9", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "18.11.13", + "dev": true + }, + "@types/yargs": { + "version": "17.0.17", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1" + }, + "ansi-styles": { + "version": "3.2.1", + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1" + }, + "cliui": { + "version": "5.0.0", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3" + }, + "decamelize": { + "version": "1.2.0" + }, + "emoji-regex": { + "version": "7.0.3" + }, + "eventemitter3": { + "version": "4.0.7" + }, + "find-up": { + "version": "3.0.0", + "requires": { + "locate-path": "^3.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2" + }, + "get-caller-file": { + "version": "2.0.5" + }, + "http-proxy": { + "version": "1.18.1", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0" + }, + "locate-path": { + "version": "3.0.0", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0" + }, + "path-exists": { + "version": "3.0.0" + }, + "require-directory": { + "version": "2.1.1" + }, + "require-main-filename": { + "version": "2.0.0" + }, + "requires-port": { + "version": "1.0.0" + }, + "set-blocking": { + "version": "2.0.0" + }, + "string-width": { + "version": "3.1.0", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which-module": { + "version": "2.0.0" + }, + "wrap-ansi": { + "version": "5.1.0", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3" + }, + "yargs": { + "version": "13.3.2", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json index f3779ef..4f15fa8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-proxy-cli", - "version": "2.1.0", + "version": "2.2.0", "description": "CLI for http-proxy.", "main": "src/index.js", "preferGlobal": true, @@ -9,7 +9,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/foss-haas/http-proxy-cli.git" + "url": "git+https://github.com/ntvinhit/http-proxy-cli.git" }, "files": [ "bin/", @@ -23,14 +23,19 @@ "http", "cli" ], - "author": "Alan Plum ", + "author": "Alan Plum , fork and edited by NTVinh", "license": "MIT", "bugs": { - "url": "https://github.com/foss-haas/http-proxy-cli/issues" + "url": "https://github.com/ntvinhit/http-proxy-cli/issues" }, - "homepage": "https://github.com/foss-haas/http-proxy-cli#readme", + "homepage": "https://github.com/ntvinhit/http-proxy-cli#readme", "dependencies": { - "http-proxy": "^1.11.1", + "http-proxy": "^1.18.1", "yargs": "^13.2.1" + }, + "devDependencies": { + "@types/http-proxy": "^1.17.9", + "@types/node": "^18.11.13", + "@types/yargs": "^17.0.17" } } diff --git a/src/index.js b/src/index.js index 1c61734..9fc5641 100644 --- a/src/index.js +++ b/src/index.js @@ -59,6 +59,8 @@ module.exports = function(args) { .describe("hostname", "Set the hostname to listen on.") .default("hostname", "localhost") .alias("hostname", "h") + .describe('corsDisable', 'Enable or disable cors, use --no-corsDisable to enable cors') + .default('corsDisable', true) .describe("header", "Set a specific header.") .alias("header", "H") .describe("proxyHost", "Set Host HTTP header to proxy hostname.") @@ -82,8 +84,44 @@ module.exports = function(args) { const headers = parseHeaders(argv.header); const proxy = httpProxy.createProxyServer({ secure: argv.verify }); + + /** + * @param req IncomingMessage + * @param res ServerResponse + */ + function disableCors(req, res) { + if (req.headers['access-control-request-method']) { + res.setHeader('access-control-allow-methods', req.headers['access-control-request-method']); + } + + if (req.headers['access-control-request-headers']) { + res.setHeader('access-control-allow-headers', req.headers['access-control-request-headers']); + } + + if (req.headers.origin) { + res.setHeader('access-control-allow-origin', req.headers.origin); + res.setHeader('access-control-allow-credentials', 'true'); + } + } + + proxy.on('proxyRes', function proxyResHandler(proxyRes, req, res) { + if (argv.corsDisable) { + disableCors(req, res) + } + }) + http .createServer(function(req, res) { + + if (req.method === 'OPTIONS') { + if (argv.corsDisable) { + disableCors(req, res) + } + res.writeHead(200); + res.end(); + return; + } + if (argv.verbose >= 4) console.log(req); const { url } = req; for (const route of routes) {