NodeJS, WebSockets,升级头部

6
我正在使用NodeJS和WebSockets进行编程,其中有升级事件及其头参数。根据这里的理解,它基本上是直接跟踪标头的数据,但对于我的用例来说,它总是为空,所以我不知道它的含义。如果有人能提供一个简单的用例,其中升级事件中的数据参数不为空,那就太好了。
1个回答

1

查看在node仓库中发出升级事件的源代码, 您将看到以下实现:

  function socketOnData(d) {
    assert(!socket._paused);
    debug('SERVER socketOnData %d', d.length);
    var ret = parser.execute(d);

    onParserExecuteCommon(ret, d);
  }

  function onParserExecute(ret, d) {
    debug('SERVER socketOnParserExecute %d', ret);
    onParserExecuteCommon(ret, undefined);
  }

  function onParserExecuteCommon(ret, d) {
    if (ret instanceof Error) {
      debug('parse error');
      socket.destroy(ret);
    } else if (parser.incoming && parser.incoming.upgrade) {
      // Upgrade or CONNECT
      var bytesParsed = ret;
      var req = parser.incoming;
      debug('SERVER upgrade or connect', req.method);

      if (!d)
        d = parser.getCurrentBuffer();

      socket.removeListener('data', socketOnData);
      socket.removeListener('end', socketOnEnd);
      socket.removeListener('close', serverSocketCloseListener);
      unconsume(parser, socket);
      parser.finish();
      freeParser(parser, req, null);
      parser = null;

      var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';
      if (EventEmitter.listenerCount(self, eventName) > 0) {
        debug('SERVER have listener for %s', eventName);
        var bodyHead = d.slice(bytesParsed, d.length);

        // TODO(isaacs): Need a way to reset a stream to fresh state
        // IE, not flowing, and not explicitly paused.
        socket._readableState.flowing = null;
        self.emit(eventName, req, socket, bodyHead);
...

传递的参数bodyHead反映了socketOnData函数中传递的参数d的数据,这是默认的data事件处理程序。另一方面,如果从onParserExecute调用onParserExecuteCommon,则它可能是undefined。我需要仔细查看源代码以了解哪些情况适用于服务器实现方式。也许您可以启用调试日志来查看调用了哪些方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接