From e436f0674f76e35f7c784166128c5dbc128f9b45 Mon Sep 17 00:00:00 2001 From: Sandeep Patel Date: Tue, 10 Dec 2019 00:57:04 +0530 Subject: [PATCH 01/11] Adding typescript support --- server.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 server.ts diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server.ts @@ -0,0 +1 @@ + From b290634dab65afbd767e4a441da7dd5a66351c8c Mon Sep 17 00:00:00 2001 From: Sandeep Patel Date: Tue, 10 Dec 2019 01:10:21 +0530 Subject: [PATCH 02/11] Update server.ts --- server.ts | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/server.ts b/server.ts index 8b13789..4a9c55c 100644 --- a/server.ts +++ b/server.ts @@ -1 +1,61 @@ + import express from 'express'; + import request from 'request'; + import bodyParser from 'body-parser'; + + +export class Server { + public static bootstrap(): Server { + return new Server(); + } + + public app: express.Application; + + constructor() { + // create expressjs application + this.app = express(); + + // configure application + this.config(); + } + public config() { + // add body parser + this.app.use(bodyParser.json({ limit: '50mb' })); + // mount query string parser + this.app.use( + bodyParser.urlencoded({ + extended: true, + }), + ); + public enableCors() { + + this.app.use (function (req, res, next) { + + // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); + res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); + + if (req.method === 'OPTIONS') { + // CORS Preflight + res.send(); + } else { + var targetURL = req.header('Target-URL'); + if (!targetURL) { + res.send(500, { error: 'There is no Target-Endpoint header in the request' }); + return; + } + request({ url: targetURL + req.url, method: req.method, json: req.body, headers: {'Authorization': req.header('Authorization')} }, + function (error, response, body) { + if (error) { + console.error('error: ' + response.statusCode) + } +// console.log(body); + }).pipe(res); + } +}); + + + } + } +} From 01dd2366ec6cba17bc3729c55cc3cf93d3805aa9 Mon Sep 17 00:00:00 2001 From: Sandeep Patel Date: Tue, 10 Dec 2019 22:33:37 +0530 Subject: [PATCH 03/11] Update README.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 883b883..d05db62 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,3 @@ The proxy currently passes the "Authorization" header to the target endpoint. Yo additional headers (or all of them). -## Other Implementations - -Check out James Ward's [Saleforce CORS Proxy](https://github.com/jamesward/sf-cors-proxy) written in Scala. From e651238a730471ed31c352d0714b352878e6340e Mon Sep 17 00:00:00 2001 From: Sandeep Patel Date: Tue, 10 Dec 2019 22:36:10 +0530 Subject: [PATCH 04/11] Adding typescript support --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d05db62..0973d09 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ There are different options to get your own instance of the CORS proxy up and ru ``` node server ``` +2. To run on Typescript ## Usage From f008bc9e5fbc837dc777e0108aa43db9dc32f1c0 Mon Sep 17 00:00:00 2001 From: sandeepp2016 Date: Wed, 11 Dec 2019 18:23:07 +0530 Subject: [PATCH 05/11] adding gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44a34fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Ignore node_modules folder +node_modules From 7c2c84e69bac26e300d44106d411aee76e91dac8 Mon Sep 17 00:00:00 2001 From: sandeepp2016 Date: Wed, 11 Dec 2019 18:24:02 +0530 Subject: [PATCH 06/11] typescript version of cors-proxy --- index.js | 12 + index.ts | 11 + package-lock.json | 796 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 11 +- server-ts.js | 53 +++ server-ts.ts | 60 ++++ server.js | 41 --- server.ts | 61 ---- tsconfig.json | 10 + 9 files changed, 950 insertions(+), 105 deletions(-) create mode 100644 index.js create mode 100644 index.ts create mode 100644 package-lock.json create mode 100644 server-ts.js create mode 100644 server-ts.ts delete mode 100644 server.js delete mode 100644 server.ts create mode 100644 tsconfig.json diff --git a/index.js b/index.js new file mode 100644 index 0000000..de3d4a7 --- /dev/null +++ b/index.js @@ -0,0 +1,12 @@ +"use strict"; +exports.__esModule = true; +var server_ts_1 = require("./server-ts"); +var bodyLimit = typeof (process.argv[2]) != 'undefined' ? process.argv[2] : '100kb'; +exports.app = server_ts_1.Server.bootstrap(bodyLimit).app; +exports.app.listen(3000, function (err) { + if (!err) + console.log("cors proxy listening at 3000"); + else { + console.error(err); + } +}); diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..7cc0af5 --- /dev/null +++ b/index.ts @@ -0,0 +1,11 @@ +import { Server } from './server-ts'; + +const bodyLimit: string = typeof (process.argv[2]) != 'undefined' ? process.argv[2] : '100kb'; +export const app = Server.bootstrap(bodyLimit).app; +app.listen(3000, function (err) { + if (!err) + console.log("cors proxy listening at 3000") + else { + console.error(err) + } +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..97b2fff --- /dev/null +++ b/package-lock.json @@ -0,0 +1,796 @@ +{ + "name": "CorsProxy", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/body-parser": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", + "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, + "@types/connect": { + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", + "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", + "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", + "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true + }, + "@types/node": { + "version": "12.12.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.17.tgz", + "integrity": "sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/request": { + "version": "2.48.3", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.3.tgz", + "integrity": "sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==", + "dev": true, + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "@types/tough-cookie": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.6.tgz", + "integrity": "sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "requires": { + "mime-db": "1.42.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "psl": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", + "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json index fd9de52..a8b957b 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,13 @@ "version": "0.0.1", "private": true, "dependencies": { - "express": "~4.4.3", - "request": "~2.36.0", - "body-parser": "~1.5.2" + "body-parser": "^1.19.0", + "express": "^4.17.1", + "request": "^2.88.0" + }, + "devDependencies": { + "@types/express": "^4.17.2", + "@types/node": "^12.12.17", + "@types/request": "^2.48.3" } } diff --git a/server-ts.js b/server-ts.js new file mode 100644 index 0000000..96ec0c0 --- /dev/null +++ b/server-ts.js @@ -0,0 +1,53 @@ +"use strict"; +exports.__esModule = true; +var express = require("express"); +var request = require("request"); +var bodyParser = require("body-parser"); +var Server = /** @class */ (function () { + function Server(bodyLimit) { + // create expressjs application + this.app = express(); + // configure application + this.config(bodyLimit); + this.enableCors(); + } + Server.bootstrap = function (bodyLimit) { + return new Server(bodyLimit); + }; + Server.prototype.config = function (bodyLimit) { + // add body parser + this.app.use(bodyParser.json({ limit: bodyLimit })); + // mount query string parser + this.app.use(bodyParser.urlencoded({ + extended: true + })); + }; + Server.prototype.enableCors = function () { + console.log("inside cors"); + this.app.use(function (req, res, next) { + // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); + res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); + if (req.method === 'OPTIONS') { + // CORS Preflight + res.send(); + } + else { + var targetURL = req.header('Target-URL'); + if (!targetURL) { + res.status(500).send({ error: 'There is no Target-Endpoint header in the request' }); + return; + } + request({ url: targetURL + req.url, method: req.method, json: req.body, headers: { 'Authorization': req.header('Authorization') } }, function (error, response, body) { + if (error) { + console.error('error: ' + response.statusCode); + } + // console.log(body); + }).pipe(res); + } + }); + }; + return Server; +}()); +exports.Server = Server; diff --git a/server-ts.ts b/server-ts.ts new file mode 100644 index 0000000..2064442 --- /dev/null +++ b/server-ts.ts @@ -0,0 +1,60 @@ + +import * as express from 'express'; +import * as request from 'request'; +import * as bodyParser from 'body-parser'; + +export class Server { + public static bootstrap(bodyLimit:string): Server { + return new Server(bodyLimit); + } + + public app: express.Application; + + private constructor(bodyLimit:string) { + // create expressjs application + this.app = express(); + + // configure application + this.config(bodyLimit); + this.enableCors(); + } + private config(bodyLimit:string) { + // add body parser + this.app.use(bodyParser.json({ limit: bodyLimit })); + + // mount query string parser + this.app.use( + bodyParser.urlencoded({ + extended: true, + }), + ); + } + private enableCors() { + //console.log("inside cors") + this.app.use(function (req, res, next) { + // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); + res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); + + if (req.method === 'OPTIONS') { + // CORS Preflight + res.send(); + } else { + var targetURL = req.header('Target-URL'); + if (!targetURL) { + res.status(500).send({ error: 'There is no Target-Endpoint header in the request' }); + return; + } + request({ url: targetURL + req.url, method: req.method, json: req.body, headers: { 'Authorization': req.header('Authorization') } }, + function (error, response, body) { + if (error) { + console.error('error: ' + response.statusCode) + } + // console.log(body); + }).pipe(res); + } + }); + } +} + diff --git a/server.js b/server.js deleted file mode 100644 index 2b46d89..0000000 --- a/server.js +++ /dev/null @@ -1,41 +0,0 @@ -var express = require('express'), - request = require('request'), - bodyParser = require('body-parser'), - app = express(); - -var myLimit = typeof(process.argv[2]) != 'undefined' ? process.argv[2] : '100kb'; -console.log('Using limit: ', myLimit); - -app.use(bodyParser.json({limit: myLimit})); - -app.all('*', function (req, res, next) { - - // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); - res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); - - if (req.method === 'OPTIONS') { - // CORS Preflight - res.send(); - } else { - var targetURL = req.header('Target-URL'); - if (!targetURL) { - res.send(500, { error: 'There is no Target-Endpoint header in the request' }); - return; - } - request({ url: targetURL + req.url, method: req.method, json: req.body, headers: {'Authorization': req.header('Authorization')} }, - function (error, response, body) { - if (error) { - console.error('error: ' + response.statusCode) - } -// console.log(body); - }).pipe(res); - } -}); - -app.set('port', process.env.PORT || 3000); - -app.listen(app.get('port'), function () { - console.log('Proxy server listening on port ' + app.get('port')); -}); \ No newline at end of file diff --git a/server.ts b/server.ts deleted file mode 100644 index 4a9c55c..0000000 --- a/server.ts +++ /dev/null @@ -1,61 +0,0 @@ - - import express from 'express'; - import request from 'request'; - import bodyParser from 'body-parser'; - - -export class Server { - public static bootstrap(): Server { - return new Server(); - } - - public app: express.Application; - - constructor() { - // create expressjs application - this.app = express(); - - // configure application - this.config(); - } - public config() { - // add body parser - this.app.use(bodyParser.json({ limit: '50mb' })); - // mount query string parser - this.app.use( - bodyParser.urlencoded({ - extended: true, - }), - ); - public enableCors() { - - this.app.use (function (req, res, next) { - - // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); - res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); - - if (req.method === 'OPTIONS') { - // CORS Preflight - res.send(); - } else { - var targetURL = req.header('Target-URL'); - if (!targetURL) { - res.send(500, { error: 'There is no Target-Endpoint header in the request' }); - return; - } - request({ url: targetURL + req.url, method: req.method, json: req.body, headers: {'Authorization': req.header('Authorization')} }, - function (error, response, body) { - if (error) { - console.error('error: ' + response.statusCode) - } -// console.log(body); - }).pipe(res); - } -}); - - - } - } -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..21ae1aa --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "moduleResolution": "node", + } +} From bc256cb5aa949751a0f491060b49cb423942652d Mon Sep 17 00:00:00 2001 From: sandeepp2016 Date: Wed, 11 Dec 2019 18:26:47 +0530 Subject: [PATCH 07/11] typescript version of cors-proxy --- server.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 server.js diff --git a/server.js b/server.js new file mode 100644 index 0000000..2b46d89 --- /dev/null +++ b/server.js @@ -0,0 +1,41 @@ +var express = require('express'), + request = require('request'), + bodyParser = require('body-parser'), + app = express(); + +var myLimit = typeof(process.argv[2]) != 'undefined' ? process.argv[2] : '100kb'; +console.log('Using limit: ', myLimit); + +app.use(bodyParser.json({limit: myLimit})); + +app.all('*', function (req, res, next) { + + // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); + res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); + + if (req.method === 'OPTIONS') { + // CORS Preflight + res.send(); + } else { + var targetURL = req.header('Target-URL'); + if (!targetURL) { + res.send(500, { error: 'There is no Target-Endpoint header in the request' }); + return; + } + request({ url: targetURL + req.url, method: req.method, json: req.body, headers: {'Authorization': req.header('Authorization')} }, + function (error, response, body) { + if (error) { + console.error('error: ' + response.statusCode) + } +// console.log(body); + }).pipe(res); + } +}); + +app.set('port', process.env.PORT || 3000); + +app.listen(app.get('port'), function () { + console.log('Proxy server listening on port ' + app.get('port')); +}); \ No newline at end of file From d58d144df56f53022dc6c74861f2261d8b0c49b7 Mon Sep 17 00:00:00 2001 From: sandeepp2016 Date: Wed, 11 Dec 2019 18:54:10 +0530 Subject: [PATCH 08/11] updating package.json file to includ build and start command --- index.ts => cors-proxy-ts/index.ts | 6 ++- server-ts.ts => cors-proxy-ts/server-ts.ts | 15 +++--- index.js | 12 ----- package.json | 5 ++ server-ts.js | 53 ---------------------- 5 files changed, 17 insertions(+), 74 deletions(-) rename index.ts => cors-proxy-ts/index.ts (55%) rename server-ts.ts => cors-proxy-ts/server-ts.ts (81%) delete mode 100644 index.js delete mode 100644 server-ts.js diff --git a/index.ts b/cors-proxy-ts/index.ts similarity index 55% rename from index.ts rename to cors-proxy-ts/index.ts index 7cc0af5..033c114 100644 --- a/index.ts +++ b/cors-proxy-ts/index.ts @@ -1,10 +1,12 @@ import { Server } from './server-ts'; const bodyLimit: string = typeof (process.argv[2]) != 'undefined' ? process.argv[2] : '100kb'; +console.log('Using limit: ',bodyLimit); export const app = Server.bootstrap(bodyLimit).app; -app.listen(3000, function (err) { +app.set('port', process.env.PORT || 3000); +app.listen(app.get('port'), function (err) { if (!err) - console.log("cors proxy listening at 3000") + console.log('Proxy server listening on port ' + app.get('port')); else { console.error(err) } diff --git a/server-ts.ts b/cors-proxy-ts/server-ts.ts similarity index 81% rename from server-ts.ts rename to cors-proxy-ts/server-ts.ts index 2064442..e25a706 100644 --- a/server-ts.ts +++ b/cors-proxy-ts/server-ts.ts @@ -4,13 +4,13 @@ import * as request from 'request'; import * as bodyParser from 'body-parser'; export class Server { - public static bootstrap(bodyLimit:string): Server { + public static bootstrap(bodyLimit: string): Server { return new Server(bodyLimit); } public app: express.Application; - private constructor(bodyLimit:string) { + private constructor(bodyLimit: string) { // create expressjs application this.app = express(); @@ -18,10 +18,10 @@ export class Server { this.config(bodyLimit); this.enableCors(); } - private config(bodyLimit:string) { + private config(bodyLimit: string) { // add body parser this.app.use(bodyParser.json({ limit: bodyLimit })); - + // mount query string parser this.app.use( bodyParser.urlencoded({ @@ -32,16 +32,16 @@ export class Server { private enableCors() { //console.log("inside cors") this.app.use(function (req, res, next) { - // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment + // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); if (req.method === 'OPTIONS') { // CORS Preflight - res.send(); + res.send(); } else { - var targetURL = req.header('Target-URL'); + const targetURL = req.header('Target-URL'); if (!targetURL) { res.status(500).send({ error: 'There is no Target-Endpoint header in the request' }); return; @@ -53,6 +53,7 @@ export class Server { } // console.log(body); }).pipe(res); + } }); } diff --git a/index.js b/index.js deleted file mode 100644 index de3d4a7..0000000 --- a/index.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -exports.__esModule = true; -var server_ts_1 = require("./server-ts"); -var bodyLimit = typeof (process.argv[2]) != 'undefined' ? process.argv[2] : '100kb'; -exports.app = server_ts_1.Server.bootstrap(bodyLimit).app; -exports.app.listen(3000, function (err) { - if (!err) - console.log("cors proxy listening at 3000"); - else { - console.error(err); - } -}); diff --git a/package.json b/package.json index a8b957b..bf01f46 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,11 @@ "description": "Simple Cors Proxy", "version": "0.0.1", "private": true, + "scripts": { + "build" :"tsc ./cors-proxy-ts/index.ts", + "start": "node server.js", + "start-ts": "node ./cors-proxy-ts/index.js" + }, "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1", diff --git a/server-ts.js b/server-ts.js deleted file mode 100644 index 96ec0c0..0000000 --- a/server-ts.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -exports.__esModule = true; -var express = require("express"); -var request = require("request"); -var bodyParser = require("body-parser"); -var Server = /** @class */ (function () { - function Server(bodyLimit) { - // create expressjs application - this.app = express(); - // configure application - this.config(bodyLimit); - this.enableCors(); - } - Server.bootstrap = function (bodyLimit) { - return new Server(bodyLimit); - }; - Server.prototype.config = function (bodyLimit) { - // add body parser - this.app.use(bodyParser.json({ limit: bodyLimit })); - // mount query string parser - this.app.use(bodyParser.urlencoded({ - extended: true - })); - }; - Server.prototype.enableCors = function () { - console.log("inside cors"); - this.app.use(function (req, res, next) { - // Set CORS headers: allow all origins, methods, and headers: you may want to lock this down in a production environment - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); - res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); - if (req.method === 'OPTIONS') { - // CORS Preflight - res.send(); - } - else { - var targetURL = req.header('Target-URL'); - if (!targetURL) { - res.status(500).send({ error: 'There is no Target-Endpoint header in the request' }); - return; - } - request({ url: targetURL + req.url, method: req.method, json: req.body, headers: { 'Authorization': req.header('Authorization') } }, function (error, response, body) { - if (error) { - console.error('error: ' + response.statusCode); - } - // console.log(body); - }).pipe(res); - } - }); - }; - return Server; -}()); -exports.Server = Server; From 6cb6426ef3761953da634163a4f3886987a017be Mon Sep 17 00:00:00 2001 From: sandeepp2016 Date: Wed, 11 Dec 2019 19:07:43 +0530 Subject: [PATCH 09/11] updating instruction for Typescript --- README.md | 20 ++++++++++++++++++-- package.json | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0973d09..8dc60a9 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,26 @@ There are different options to get your own instance of the CORS proxy up and ru - Start the server ``` - node server + npm start ``` 2. To run on Typescript - + - Intall typescript + ``` + npm install -g typescript + ``` + - Install the server dependencies + ``` + npm install + ``` + - Compile typescipt + ``` + npm run compile + ``` + - Start the server + ``` + npm run start-ts + ``` + ## Usage When making an API call using JavaScript (using XMLHTTPRequest, $.ajax, etc): diff --git a/package.json b/package.json index bf01f46..cfeffd4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.0.1", "private": true, "scripts": { - "build" :"tsc ./cors-proxy-ts/index.ts", + "compile" :"tsc ./cors-proxy-ts/index.ts", "start": "node server.js", "start-ts": "node ./cors-proxy-ts/index.js" }, From 41e16190eaeedafd22c77e062500a819b681c175 Mon Sep 17 00:00:00 2001 From: Sandeep Patel Date: Sun, 5 Jan 2020 21:27:15 +0530 Subject: [PATCH 10/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8dc60a9..182e0be 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ When making an API call using JavaScript (using XMLHTTPRequest, $.ajax, etc): 1. Set the request method, query parameters, and body as usual -1. Set the actual service URL in a header named 'Target-Endpoint' +1. Set the actual service URL in a header named 'Target-URL' 1. Send the request as usual From d7952544eea79c18960056cd47869bc11d6d3d8a Mon Sep 17 00:00:00 2001 From: Sandeep Patel Date: Fri, 7 Aug 2020 18:18:48 +0530 Subject: [PATCH 11/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 182e0be..bfdb753 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ There are different options to get your own instance of the CORS proxy up and ru ``` npm start ``` -2. To run on Typescript +2. To run with Typescript - Intall typescript ``` npm install -g typescript