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