Node.js HTTPParser不调用一些callback

我正在使用Node.js v0.8.15中的HTTPParser。 不幸的是,一些callback从来没有被调用。

例如,下面的代码只调用onHeadersComplete 。 无法设法调用onURLonHeaderFieldonHeaderValue

 var HTTPParser = process.binding('http_parser').HTTPParser, parser = new HTTPParser(HTTPParser.REQUEST), request = new Buffer( 'GET /test HTTP/1.1\r\n' + 'Host: www.example.com\r\n' + 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0\r\n' + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' + 'Accept-Language: en-US,en;q=0.5\r\n' + 'Accept-Encoding: gzip, deflate\r\n' + '\r\n' ); parser.onURL = function() { console.log('onURL'); } parser.onHeaderField = function() { console.log('onHeaderField'); } parser.onHeaderValue = function() { console.log('onHeaderValue'); } parser.onHeadersComplete = function() { console.log('onHeadersComplete'); } parser.execute(request, 0, request.length); 

怎么了?

process.binding只能被核心节点库使用。 从我简短的源代码中可以onHeaders ,httpparsing器的C ++代码只公开了一小部分事件( onHeadersonHeadersCompleteonBodyonMessageComplete ),所以我相信这是唯一可以锁住的事件。

parsing器在内部使用了一些额外的parsing器callback,但是它们并没有暴露给JS land作为事件。

对于那些从search引擎来到这里的人。 最近版本的Node使用稍微不同的组织。 此代码工作:

 var HTTPParser = process.binding('http_parser').HTTPParser; var parser = new HTTPParser(HTTPParser.REQUEST); const kOnHeaders = HTTPParser.kOnHeaders | 0; const kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0; const kOnBody = HTTPParser.kOnBody | 0; const kOnMessageComplete = HTTPParser.kOnMessageComplete | 0; const kOnExecute = HTTPParser.kOnExecute | 0; parser[kOnHeaders] = function(headers, url) { console.log('kOnHeaders'); } parser[kOnHeadersComplete] = function(versionMajor, versionMinor, headers, method, url, statusCode, statusMessage, upgrade, shouldKeepAlive) { console.log('kOnHeadersComplete'); } parser[kOnBody] = function(b, start, len) { console.log('kOnBody'); } parser[kOnMessageComplete] = function() { console.log('kOnMessageComplete'); } parser[kOnExecute] = function() { console.log('kOnExecute'); } var ret = parser.execute(new Buffer( 'GET /test HTTP/1.1\r\n' + 'Host: www.example.com\r\n' + 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0\r\n' + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' + 'Accept-Language: en-US,en;q=0.5\r\n' + 'Accept-Encoding: gzip, deflate\r\n' + '\r\n' )); 

或者,有一些包装模块。 该对象目前有以下几种方法:

  • closures – 取消parsing并释放parsing器(?)
  • 执行 – 读取数据块并parsing它。 如果标题缓慢到达,可以调用任意次数
  • 完成 – 告诉parsing器将不再有数据,完成parsing
  • 重新初始化 – 为其他types的消息准备parsing器(请求/响应)
  • 暂停 – IDK,也许停止parsing数据添加
  • 简历 – IDK,也许开始parsing
  • 消耗 – IDK,Stream的东西
  • unconsume – IDK,Stream的东西
  • getCurrentBuffer – 返回当前数据收集器(?)

至于使用的细节,你可以参考节点来源: