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)
谢谢
显然,该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,并且通常围绕在服务器中使用它的想法构建。解析它的代码按原样重用有点混乱(根据我的口味)。