Last active
February 5, 2021 12:52
-
-
Save tudorilisoi/2cad7b12aeb88515e5e9bdb7cb8e1fa0 to your computer and use it in GitHub Desktop.
A https proxy server for external URLs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//a modified version of a gist ...which I forgot the URL of | |
var url = require('url') | |
, http = require('http') | |
, https = require('https'); | |
var fs = require('fs'); | |
var PORT = process.argv[2] || 443; | |
var serverOptions = { | |
key: fs.readFileSync('key.pem'), | |
cert: fs.readFileSync('cert.pem') | |
}; | |
var server = https.createServer(serverOptions,function(req, res) { | |
//var reqUrl = req.url.substr(1); | |
var reqUrl = url.parse(req.url, true).query['image-url'] | |
if(!reqUrl){ | |
return | |
} | |
console.log("Proxy " + reqUrl); | |
console.log('==> Making req for' + reqUrl + '\n'); | |
req.pause(); | |
var options = url.parse(reqUrl); | |
options.headers = req.headers; | |
options.method = req.method; | |
options.agent = false; | |
options.headers['host'] = options.host; | |
var connector = (options.protocol == 'https:' ? https : http).request(options, function(serverResponse) { | |
console.log('<== Received res for', serverResponse.statusCode, reqUrl); | |
console.log('\t-> Request Headers: ', options); | |
console.log(' '); | |
console.log('\t-> Response Headers: ', serverResponse.headers); | |
serverResponse.pause(); | |
serverResponse.headers['access-control-allow-origin'] = '*'; | |
switch (serverResponse.statusCode) { | |
// pass through. we're not too smart here... | |
case 200: case 201: case 202: case 203: case 204: case 205: case 206: | |
case 304: | |
case 400: case 401: case 402: case 403: case 404: case 405: | |
case 406: case 407: case 408: case 409: case 410: case 411: | |
case 412: case 413: case 414: case 415: case 416: case 417: case 418: | |
res.writeHeader(serverResponse.statusCode, serverResponse.headers); | |
serverResponse.pipe(res, {end:true}); | |
serverResponse.resume(); | |
break; | |
// fix host and pass through. | |
case 301: | |
case 302: | |
case 303: | |
serverResponse.statusCode = 303; | |
serverResponse.headers['location'] = 'http://localhost:'+PORT+'/'+serverResponse.headers['location']; | |
console.log('\t-> Redirecting to ', serverResponse.headers['location']); | |
res.writeHeader(serverResponse.statusCode, serverResponse.headers); | |
serverResponse.pipe(res, {end:true}); | |
serverResponse.resume(); | |
break; | |
// error everything else | |
default: | |
var stringifiedHeaders = JSON.stringify(serverResponse.headers, null, 4); | |
serverResponse.resume(); | |
res.writeHeader(500, { | |
'content-type': 'text/plain' | |
}); | |
res.end(process.argv.join(' ') + ':\n\nError ' + serverResponse.statusCode + '\n' + stringifiedHeaders); | |
break; | |
} | |
console.log('\n\n'); | |
}); | |
req.pipe(connector, {end:true}); | |
req.resume(); | |
}); | |
console.log('Listening on http://localhost:%s...', PORT); | |
server.listen(PORT); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment