2012-11-30 26 views
3

我在Node.js v0.8.15中使用HTTPParser。不幸的是,一些回調從未被調用。Node.js HTTPParser不調用某些回調

例如,以下代碼僅調用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); 

怎麼了?

回答

1

process.binding只能由核心節點庫使用。從我對源代碼的簡短閱讀中,http解析器C++代碼僅公開了一小部分事件(onHeaders,onHeadersComplete,onBody,onMessageComplete),所以我相信這些是您可以鎖定的唯一事件。

解析器在內部使用一些額外的解析器回調,但它們不會暴露給JS land作爲事件。

1

對於那些從搜索引擎來到這裏的人。 最近版本的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' 
    )); 

另外,還有一些包裝模塊。 對象當前具有以下方法:

  • 接近 - 取消解析和釋放解析器
  • 執行 - 讀取數據的塊,並解析它(?)。可以被稱爲任意次數,如果報頭到達慢慢
  • 光潔度 - 告訴解析器不會有數據了,完成解析
  • 重新初始化 - 用於其他類型的消息(請求/響應)
  • 暫停準備解析器 - IDK,可能停止對數據解析除了
  • 簡歷 - IDK,也許開始解析
  • 消耗 - IDK,東西流
  • unconsume - IDK,東西流
  • getCurrentBuffer - 返回當前數據山坳(?)講師

對於使用細節,你可以參考節點來源: