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

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

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

可能吗?

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

怎么做?

我看过源代码,他们得到一个请求解析器如下

var HTTPParser = process.binding('http_parser').HTTPParser;
var parser = new HTTPParser(HTTPParser.REQUEST)

编辑

node.js test的一些进展

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

parser.execute(request,request.length);

编辑2

一些事件手持器丢失(所有这些)

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

谢谢

解决方法

显然,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,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);

请注意,特定的IncomingMessage类是使用套接字进行参数化的,并且通常围绕在服务器中使用的想法构建. code for parsing it有些凌乱,要按原样重复使用(对我而言).

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...