"use strict"; const request = require('request'); const http = require('http'); const url = require('url'); const fs = require('fs').promises; let PORT = process.env.PORT || 8000; process.argv.forEach(function (arg) { if(arg.indexOf('--port=') === 0) { PORT = parseInt(arg.replace('--port=', ''), 10); } }); http.createServer((req, response) => { if (!req.url.substring(1)) { return loadWebpage(req, response); } let remoteURL = url.parse(req.url.substring(1)); if(!remoteURL.hostname || remoteURL.hostname === 'localhost') return response.end(); if(req.method === 'OPTIONS') { response.writeHead(200, { 'access-control-allow-origin': req.headers.origin || '*', 'access-control-allow-headers': 'Origin, X-Requested-With, Content-Type, Accept, authorization' }); return response.end(); } for(let key in req.headers) { if(key.match(/host|cookie/ig)){ delete req.headers[key]; } } let config = { url: remoteURL, followAllRedirects: true, method: req.method, headers: req.headers, gzip: true }; if(req.method !== 'HEAD') { config.body = req; } request(config) .on('response', res => { res.headers['access-control-allow-origin'] = req.headers.origin || '*'; res.headers['access-control-allow-headers'] = 'Origin, X-Requested-With, Content-Type, Accept, authorization'; delete res.headers['access-control-allow-credentials']; delete res.headers['access-control-allow-methods']; delete res.headers['content-encoding']; delete res.headers['content-length']; delete res.headers['x-frame-options']; response.writeHead(res.statusCode, res.headers); }) .on('data', function(data) { response.write(data); }) .on('error', () => response.end()) .on('end', () => response.end()); }).listen(PORT); function loadWebpage(req, res) { fs.readFile(__dirname + "/index.html") .then(contents => { res.setHeader("Content-Type", "text/html"); res.writeHead(200); res.end(contents); }) .catch(err => { res.writeHead(500); res.end(err); return; }); }