我正在尝试编辑node.js http流,然后再将其发送到解析器。我已经实现了以下代码
//catch any connection event to this server
server.on('secureConnection', function (stream) {
//create a new buffer to hold what we are receiving in this stream
var receiveBuffer = new Buffer(0);
//store a link to the original ondata function so we can call it and restore it
originalOnDataFunction = stream.ondata;
//declare a new ondata function for this stream
stream.ondata = function (d, start, end) {
//record what we have received
receiveBuffer = Buffer.concat([receiveBuffer, d.slice(start, end)]);
//if what we have received is greater than 4 (i.e. we have at least got a GET request)
//then make changes
if (receiveBuffer.length >= 4) {
//reset the streams ondata function to the original
//this is all we want to edit for this connection
stream.ondata = originalOnDataFunction;
//if the first 11 characters of the buffer are 'MKCALENDAR ' then make a change
if (receiveBuffer.toString('ascii', 0, 11) === 'MKCALENDAR ') {
//I change this to MKCOL /MKCALENDAR<rest of buffer> as this will work with the node.js http parser
//and then I can check on the other side for a MKCOL method with /MKCALENDAR as the start of the url and
//know that it was a MKCALENDAR method
var rewrittenBuffer = Buffer.concat([new Buffer('MKCOL /MKCALENDAR', 'ascii'), receiveBuffer.slice(11)]);
//now call the original ondata function with this new buffer
stream.ondata.apply(this, [rewrittenBuffer, 0, rewrittenBuffer.length]);
} else {
//no change needed just call the original ondata function with this buffer
stream.ondata.apply(this, [receiveBuffer, 0, receiveBuffer.length]);
}
}
}
});
我从这里得到答案Overriding Node.js HTTP parser
上述代码似乎在95%的时间内起作用。但是,它会不断删除那些只是超时的请求。我看不出它是怎么回事。任何人都可以提供帮助。
谢谢,
标记
注意on secureConnection来自node.js https.createServer(call
答案 0 :(得分:0)
您确定要
吗?if (receiveBuffer.length >= 4)
如果第一个缓冲区是部分MKCALENDAR且至少有前四个字节,则上面的代码不会转换为MKCOL。
答案 1 :(得分:0)
Jonathan第一个数据包似乎是所有标题所以这行很好。我确实让它工作了,问题似乎与.apply语句并不总是有效。以下工作正常:
//catch any secure connection event to this server
server.on('secureConnection', function (stream) {
//create a new buffer to hold what we are receiving in this stream
var receiveBuffer = new Buffer(0);
//store a link to the original ondata function so we can call it and restore it
stream._ondataOld = stream.ondata;
stream.ondata = function(d,start,end){
receiveBuffer = Buffer.concat([receiveBuffer, d.slice(start, end)]);
//if what we have received is greater than 4 (i.e. we have at least got a GET request)
//then make changes
if (receiveBuffer.length >= 4) {
//reset the streams ondata function to the original
//this is all we want to edit for this connection
stream.ondata = stream._ondataOld;
//if the first 11 characters of the buffer are 'MKCALENDAR ' then make a change
if (receiveBuffer.toString('ascii', 0, 11) === 'MKCALENDAR ') {
//I change this to MKCOL /MKCALENDAR<rest of buffer> as this will work with the node.js http parser
//and then I can check on the other side for a MKCOL method with /MKCALENDAR as the start of the url and
//know that it was a MKCALENDAR method
//this facilitates MKCALENDAR calls on the CALDAV server
var rewrittenBuffer = Buffer.concat([new Buffer('MKCOL /MKCALENDAR', 'ascii'), receiveBuffer.slice(11)]);
//console.log(rewrittenBuffer.toString('ascii',0,rewrittenBuffer.length));
//console.log(rewrittenBuffer.toString('ascii'));
//now call the original ondata function with this new buffer
stream.ondata(rewrittenBuffer,0,rewrittenBuffer.length);
} else {
//no change needed just call the original ondata function with this buffer
stream.ondata(d,start,end);
}
} else {
stream.ondata(d,start,end);
}
}
});