Skip to content

Instantly share code, notes, and snippets.

@renanyoy
Created September 7, 2016 08:53
Show Gist options
  • Save renanyoy/33ce7d49377c134d6d232b613ad423bf to your computer and use it in GitHub Desktop.
Save renanyoy/33ce7d49377c134d6d232b613ad423bf to your computer and use it in GitHub Desktop.
// relay.js
var util = require('util');
var net = require('net');
var dns = require('dns');
var nurl = require('url');
var host = '127.0.0.1';
var port = 6969;
var source = '';
var rename = '';
if (process.argv.length > 3) {
port = parseInt(process.argv[2]);
source = process.argv[3];
if (process.argv.length > 4) {
rename = process.argv[4];
console.log('rename stream to ' + rename);
}
} else {
console.log('error, bad parameters, expected port source [rename]');
process.exit(1);
}
var usource = nurl.parse(source);
var ipsource = '';
var portsource = 80;
dns.resolve4(usource.hostname, function(err, addr) {
ipsource = addr[0];
});
if (usource.port) {
portsource = usource.port;
}
net.createServer(function(sock) {
var closed = false;
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
sock.on('data', function(request) {
console.log('DATA ' + sock.remoteAddress + ': ' + request);
console.log(util.inspect(request));
var header = request.toString('utf8').split('\r\n');
var theader = ''
console.log('#fields in header ' + header.length);
for (var i = 0; i < header.length; i++) {
if (header[i].indexOf('GET ') >= 0) {
theader += 'GET ' + usource.path + ' HTTP/1.0\r\n';
} else if (header[i].indexOf('Host:') >= 0) {
theader += 'Host: ' + usource.host + ':' + portsource + '\r\n';
} else {
theader += header[i] + '\r\n';
}
}
console.log('new header:' + theader);
var client = new net.Socket();
console.log('connecting to source ' + ipsource + ':' + portsource);
client.connect(portsource, ipsource, function() {
console.log('source connected');
client.write(theader);
});
var first = (rename.length > 0);
client.on('data', function(data) {
if (closed) {
client.end()
} else if (first) {
first = false;
console.log('response header: ' + data);
header = data.toString('utf8').split('\r\n');
theader = ''
for (var i = 0; i < header.length; i++) {
var h = header[i];
if (h.indexOf('icy-name: ') >= 0) {
theader += 'icy-name: ' + rename + '\r\n';
} else if (h.length > 0) {
theader += h + '\r\n';
}
}
console.log('new header:' + theader);
sock.write(theader + '\r\n');
} else {
sock.write(data);
}
});
client.on('close', function() {
console.log('source closed');
if (!closed) {
sock.end()
}
});
});
sock.on('close', function(data) {
console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
closed = true;
});
}).listen(port, host);
console.log('Relay listening on ' + host + ':' + port);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment