2014-04-19 3 views
4

String 또는 Buffer 형식의 HTTP 응답을 Object으로 구문 분석하려고합니다.HTTP 응답 구문 분석 문자열/버퍼

결과는 http 모듈의 응답과 마찬가지로 Object이됩니다.

나는 네이티브 HTTP 파서를 가져올 시도했지만 결과는 내 사용의 경우 너무 원했다 :

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 
} 

두 가지가 부족 : 이런 식으로 뭔가를 반환하는

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); 

내 사용 사례의 경우 :

  1. 헤더 값과 관련된 헤더 이름의 맵
  2. 응답 본문

    를 분석
    • 사람이를 달성하는 방법을 알고 있나요?

당신의 도움에 미리 감사합니다!

+0

는 왜 수동 구문 분석하려고 HTTP 응답? – mscdex

+2

나는 Node.js의'net' 모듈을 사용하여 HTTP 서버를 테스트하기 위해 잘못된 HTTP 요청을 보내는 fuzzer를 작성하고 있습니다. –

답변

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도 배우려고하고 있는데, 어제부터 시작했습니다. 이후 자바 스크립트 일이, 여기 내 제안 된 솔루션입니다.

여기에서 구문 분석되는 개체가 '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