我有一个原始的 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, 0, 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, 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);
请注意,特定的 IncomingMessage
类是用 socket
参数化的,并且通常围绕它在服务器中使用的想法构建。 code for parsing it按原样重复使用有点困惑(按我的口味)。
关于node.js 从原始 http 请求字符串创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181018/