微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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有些凌乱,要按原样重复使用(对我而言).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐