Skip to content

Instantly share code, notes, and snippets.

@Akiyamka
Last active November 27, 2019 12:41
Show Gist options
  • Save Akiyamka/ae74b8b2dff7d2467b1f88871f0b730f to your computer and use it in GitHub Desktop.
Save Akiyamka/ae74b8b2dff7d2467b1f88871f0b730f to your computer and use it in GitHub Desktop.
2KB CORS proxy cli util
/**
* -p proxy listen requests incoming to this port
* -t proxy request resourse from this target without cors
*
* USAGE EXAMPLE
* node microCorsProxy.js -t http://site-without-cors.com -p 5000
**/
const express = require('express');
const request = require('request');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json({limit: '1024kb'}));
const filtrateHeaders = objectFilter(['host', 'origin', 'pragma', 'referer']);
function objectFilter(blackList) {
return obj => Object.entries(obj)
.reduce((acc, [k,v]) => blackList.includes(k) ? acc : (acc[k] = v, acc), {});
}
function parseArgs(args) {
const params = { _flags: [] };
for (let i = 0; i < args.length; i++) {
args[i][0] === '-'
? (params[args[i].slice(1)] = args[i + 1], i++)
: params._flags.push(args[i]);
}
return params;
}
function init(args) {
const params = parseArgs(args);
if (params.t === undefined) {
console.log('\x1b[33m%s\x1b[0m', 'Redirect target for proxy not specified');
console.log('Use -t <url> for set target');
return;
}
if (params.p === undefined) {
console.log('\x1b[33m%s\x1b[0m', 'Port not specified');
console.log('Use -p <url> for set port');
params.p = process.env.PORT || 4000;
console.log('Fallback to default port:', params.p);
}
const router = (req, res, next) => {
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') {
res.send();
} else {
console.log('\x1b[32m%s\x1b[0m', `[PROXY] ${req.url} -> ${params.t + req.url}`);
const popHeaders = ['host', 'origin', 'pragma', 'referer'];
request(
{
url: params.t + req.url,
method: req.method,
json: req.body,
headers: filtrateHeaders(req.headers)
},
(error, response, body) => {
console.log(response.statusCode)
error && console.error('\x1b[31m%s\x1b[0m', 'error: ' , error);
}
).pipe(res);
}
};
app.all('*', router);
app.set('port', params.p);
app.listen(app.get('port'), function () {
console.log('---------------------------------');
console.log('Proxy server started at port', app.get('port'));
console.log('---------------------------------');
});
}
init(process.argv.slice(2));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment