2014-04-19 46 views
4

我正試圖解析一個StringBuffer形式的HTTP響應到Object解析HTTP響應字符串/緩衝區

結果將會是Object,就像原生http模塊的響應一樣。

我試圖導入本地HTTP分析器,但結果太生了我的用例:

var HTTPParser = process.binding('http_parser').HTTPParser; 

var parser = new HTTPParser(HTTPParser.RESPONSE); 

parser.onHeadersComplete = function(res) { 
    console.log('onHeadersComplete'); 
    console.log(res); 
}; 

parser.execute(data, 0, data.length); 

這將返回是這樣的:

onHeadersComplete 
{ 
    headers: 
    [ 'X-Powered-By', 
    'Express', 
    'Content-Type', 
    'text/plain', 
    'Content-Length', 
    '2', 
    'Date', 
    'Sat, 19 Apr 2014 20:16:45 GMT', 
    'Connection', 
    'keep-alive' ], 
    statusCode: 200, 
    versionMajor: 1, 
    versionMinor: 1, 
    shouldKeepAlive: true, 
    upgrade: false 
} 

還缺兩樣東西:對於我的用例:

  1. 與標題值相關聯的標題名稱映射
  2. 解析響應體

    • 沒有人知道如何實現這一目標?

預先感謝您的幫助!

+0

爲什麼你想手動解析HTTP響應? – mscdex

+2

因爲我正在寫一個模糊器,它使用Node.js的'net'模塊發送錯誤構造的'HTTP'請求來測試HTTP服務器。 –

回答

4

您必須填寫所有回調。

var HTTPParser = require('http-parser-js').HTTPParser; 
var parser = new HTTPParser(HTTPParser.RESPONSE); 
parser.onHeadersComplete = function(res) { 
    console.log(res.headers); 
}; 
parser.onBody = function(chunk, offset, length) { 
    console.log("body", chunk.toString(), offset, length) 
} 
parser.onMessageComplete = function() { 

} 
parser.execute(new Buffer('HTTP/1.1 200 OK\r\nContent-Type: text/plain; xya\r\nContent-Length: 11\r\n\r\nhello world')) 
-1

我也試圖研究node.js,我剛剛從昨天開始。由於這是一個JavaScript的東西,這裏是我建議的解決方案。

我假設這裏解析的對象是'res'參數。

var headers = {}; 
for (index = 0; index < res.headers.length; index++) { 
    headers[res.headers[index].replace('-', '')] = res.headers[++index]; 
} 

// or this 
for (index = 0; index < res.headers.length; index+=2) { 
    var headerName = res.headers[index].replace('-', ''); 
    headers[headerName] = res.headers[index + 1]; 
} 

// Note that we removed the '-' in the name since it's an invalid character for property name. 

// Access sample. 
console.log(headers.ContentType); 
console.log(headers['ContentType']); 

我希望它能幫助你。

+1

對不起,但我不想重塑Express對象。我想要做的是從TCP流結果緩衝區解析HTTP協議「數據包」。 –

0

頁眉改造就可以使用私有方法http.IncomingMessage(socket)._addHeaderLines(headersArr, headersNumber)

var msg=new http.IncomingMessage() 

msg._addHeaderLines(['X-Powered-By', 
    'Express', 
    'Content-Type', 
    'text/plain', 
    'Content-Length', 
    '2', 
    'Date', 
    'Sat, 19 Apr 2014 20:16:45 GMT', 
    'Connection', 
    'keep-alive' ], 10); 
console.log(msg); 

結果:從節點來源

IncomingMessage { 
    ... 
    headers: 
    { 'x-powered-by': 'Express', 
    'content-type': 'text/plain', 
    'content-length': '2', 
    date: 'Sat, 19 Apr 2014 20:16:45 GMT', 
    connection: 'keep-alive' }, 
    rawHeaders: 
    [ 'X-Powered-By', 
    'Express', 
    'Content-Type', 
    'text/plain', 
    'Content-Length', 
    '2', 
    'Date', 
    'Sat, 19 Apr 2014 20:16:45 GMT', 
    'Connection', 
    'keep-alive' ], 
    ... 
} 

用法示例:https://github.com/nodejs/node/blob/master/lib/_http_common.js