Bra*_*rad 7 javascript shoutcast node.js internet-radio
我http.request()在普通的HTTP服务器上使用Node的基本功能没有问题.我需要http.request()与SHOUTcast服务器一起使用(或类似).SHOUTcast"协议"与HTTP完全兼容,除了一个细节......第一个响应行.
普通HTTP服务器响应:
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
SHOUTcast服务器响应:
ICY 200 OK
Run Code Online (Sandbox Code Playgroud)
同样,协议的其余部分是相同的.唯一的区别是HTTP/1.xvs ICY..
我想扩展,子类或以某种方式修改Node的http.request()功能,以便我可以使它与SHOUTcast服务器一起工作.之前已经完成了与节点连接到SHOUTcast ,但只能通过重新发明整个轮子.我宁愿不这样做,因为它只是一个小的协议差异.
创建我自己的代码来解析HTTP的相关部分,但尽可能多地重用HTTP的现有Node组件.
创建一个简单的内部代理(或以某种方式中继数据),以便我可以在它到达Node的HTTP解析器之前修改第一个服务器响应行.
别的什么?
我也考虑过使用Shred,但它没有提供流式响应的选项.(它等待整个服务器响应在触发事件之前完成,这对于数据无限期运行的流服务器不起作用.)沿着同样的路线,我尝试了Request,但它使用了Node自己的HTTP解析器,所以我得到与原生HTTP客户端相同的解析错误.
我想出了另一种方法,类似于内部代理,但没有额外的连接.似乎可以覆盖HTTP客户端的内部使用的套接字.完成此操作后,在将数据传递给原始内部套接字ondata函数之前,很容易挂钩并修改数据.
var httpicy = new HttpIcyClient();
httpicy.request(/* your normal request parameters here */);
Run Code Online (Sandbox Code Playgroud)
var http = require('http');
var HttpIcyClient = function () {};
HttpIcyClient.prototype.request = function (options, callback) {
var req = http.request(options, callback),
originalOnDataFunction,
receiveBuffer = new Buffer(0);
req.on('socket', function (socket) {
originalOnDataFunction = socket.ondata;
socket.ondata = function (d, start, end) {
receiveBuffer = Buffer.concat([receiveBuffer, d.slice(start, end)]);
if (receiveBuffer.length >= 4) {
socket.ondata = originalOnDataFunction;
if (receiveBuffer.toString('ascii', 0, 4) === 'ICY ') {
receiveBuffer = Buffer.concat([new Buffer('HTTP/1.0 ', 'ascii'), receiveBuffer.slice(4)]);
}
socket.ondata.apply(this, [receiveBuffer, 0, receiveBuffer.length]);
}
};
});
return req;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3573 次 |
| 最近记录: |