2

我正在尝试在将 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% 的时间内都可以工作。但是,它会不断丢弃然后只是超时的请求。我看不出它是如何或在哪里丢弃它们的。任何人都可以帮忙。

谢谢,

标记

请注意,secureConnection 来自 node.js https.createServer( 调用

4

2 回答 2

0

乔纳森第一个数据包似乎是所有的标题,所以这条线工作正常。我确实让它工作了,问题似乎在于 .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);
    }
  }
});
于 2013-04-17T13:10:36.547 回答
0

你确定你想要

if (receiveBuffer.length >= 4)

如果第一个缓冲区是包含至少前四个字节的部分 MKCALENDAR,则上面的代码不会转换为 MKCOL。

于 2013-04-16T12:38:55.140 回答