http-rewrite-proxy
Version:
Simple HTTP proxy rewriting server responses and serving on host.
79 lines (68 loc) • 1.97 kB
JavaScript
;
var http = require('follow-redirects').http;
var through = require('through');
var argv = require('minimist')(
process.argv.slice(2),
{
alias: {
'host': 'h',
'port': 'p',
'target-host': 's',
'target-port': 'r'
}
}
);
var log = require('npmlog');
log.info(
'init',
'Starting server proxying %s:%s, listening on %s:%s',
argv['target-host'],
argv['target-port'],
argv.host,
argv.port
);
http.createServer(function proxySite(clientRequest, clientResponse) {
var departureProcessor = through(function write(requestData) {
this.queue(requestData);
});
var proxy = http.request({
hostname: argv['target-host'],
port: argv['target-port'],
path: clientRequest.url,
method: 'GET'
},
function modifyResponse(serverResponse) {
var headers = serverResponse.headers;
var load = serverResponse.client._httpMessage;
var type = headers['content-type'];
log.http(load.method, load.path);
var arrivalProcessor = through(function write(responseData) {
if (type && type.indexOf('image') < 0) {
this.queue(
new Buffer(responseData.toString()
.replace(
new RegExp(argv['target-host'], 'g'),
argv.host + ':' + argv.port
)
.replace(
new RegExp(argv['target-host'] + ':' + argv['target-port'], 'g'),
argv.host + ':' + argv.port
)
)
);
} else {
this.queue(responseData);
}
});
for (var key in headers) {
if (key) {
clientResponse.setHeader(key, headers[key]);
}
}
serverResponse.pipe(arrivalProcessor);
arrivalProcessor.pipe(clientResponse);
});
clientRequest.pipe(departureProcessor, {end: true});
departureProcessor.pipe(proxy, {end: true});
}).listen(argv.port);