node.js从原始http请求字符串创建对象

Pau*_*lva 19 parsing http node.js

我有一个原始的HTTP请求字符串,我需要从中创建一个对象表示.

我正在考虑使用内部的http解析器来获取http.IncomingMessage的实例,而不是重新发明轮子

可能吗?

我是这么认为的,因为字符串与完整的流没有那么不同.

怎么做?

我查看了源代码,他们得到了一个请求解析器,如下所示

var HTTPParser = process.binding('http_parser').HTTPParser;
var parser = new HTTPParser(HTTPParser.REQUEST)
Run Code Online (Sandbox Code Playgroud)

编辑

node.js测试的一些进展

var request = Buffer(raw);
var parser = new HTTPParser(HTTPParser.REQUEST);

parser.execute(request, 0, request.length);
Run Code Online (Sandbox Code Playgroud)

编辑2

一些eventHandler丢失了(所有这些)

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

parser.onBody = function(body) {
    console.log('body done');
    console.log(body.toString());
}

parser.onMessageComplete = function(res) {
    console.log('done');
};
Run Code Online (Sandbox Code Playgroud)

谢谢

KT.*_*KT. 2

显然,该http_parser模块是一个基于回调的低级解析器。它将通过这些回调将它可以解析的字符串的任何部分发送给您,并且您可以IncomingMessage从它们中创建一个或任何您需要的其他内容。

我相信类似的东西可能就是您正在寻找的:

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

function parseMessage(request) {
    var _message = {};
    var _parser = new HTTPParser(HTTPParser.REQUEST);

    _parser.onHeadersComplete = function(headers) { 
        _message = headers; 
    }

    _parser.onBody = function(body, start, len) {
        _message.data = body.slice(start, start+len);
    }

    var _result = _parser.execute(request, 0, request.length);

    if (_result != request.length) { 
        _message.error = _result; 
    }
    else {
        _message.error = false;
    }
    return _message;
}

var request = Buffer("GET / HTTP/1.1\nHost: localhost\nContent-Length: 2\n\nHi\n\n");
result = parseMessage(request);
Run Code Online (Sandbox Code Playgroud)

请注意,特定的IncomingMessage类是用 a 参数化的socket,并且通常围绕在服务器中使用它的想法构建。解析它的代码按原样重用有点混乱(根据我的口味)。

  • 最近的 Node 版本更改了接口,现在回调的分配类似于 `parser[HTTPParser.kOnHeaders] = function() {...}` (2认同)