Created
September 7, 2016 08:53
-
-
Save renanyoy/33ce7d49377c134d6d232b613ad423bf to your computer and use it in GitHub Desktop.
This file contains 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
// 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