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

标签 node.js parsing 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, 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/

相关文章:

ruby-on-rails - Rails XML 解析

http - 黑莓 http 连接在 3g 上不起作用

sql - PostgreSQL 行读锁

javascript - Socketio 配置错误,无法连接/登录连接

python - 如何使用 Python 解析带有表格的 HTML 文件

java - 使用少量线程并发发送大量 HTTP 请求

Python HTTP Server - 在不使用 HTTP 模块的情况下创建

node.js - 如何使用 firestore admin nodejs sdk 设置服务器时间戳?

sql - 如何检索用户输入的特定合作伙伴 ID 的电子邮件并将其发送回 Controller 。

android - OffsetDateTime 至今 Android