gpt4 book ai didi

Node.js HTTPParser 不调用一些回调

转载 作者:搜寻专家 更新时间:2023-10-31 23:39:12 26 4
gpt4 key购买 nike

我在 Node.js v0.8.15 中使用 HTTPParser。不幸的是,一些回调永远不会被调用。

例如,下面的代码只调用onHeadersComplete。无法让它调用 onURLonHeaderFieldonHeaderValue

var
HTTPParser = process.binding('http_parser').HTTPParser,
parser = new HTTPParser(HTTPParser.REQUEST),
request = new Buffer(
'GET /test HTTP/1.1\r\n' +
'Host: www.example.com\r\n' +
'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0\r\n' +
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' +
'Accept-Language: en-US,en;q=0.5\r\n' +
'Accept-Encoding: gzip, deflate\r\n' +
'\r\n'
);

parser.onURL = function() {
console.log('onURL');
}

parser.onHeaderField = function() {
console.log('onHeaderField');
}

parser.onHeaderValue = function() {
console.log('onHeaderValue');
}

parser.onHeadersComplete = function() {
console.log('onHeadersComplete');
}

parser.execute(request, 0, request.length);

怎么了?

最佳答案

对于那些通过搜索引擎来到这里的人。最新版本的 Node 使用略有不同的组织。此代码有效:

var HTTPParser = process.binding('http_parser').HTTPParser;

var parser = new HTTPParser(HTTPParser.REQUEST);

const kOnHeaders = HTTPParser.kOnHeaders | 0;
const kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0;
const kOnBody = HTTPParser.kOnBody | 0;
const kOnMessageComplete = HTTPParser.kOnMessageComplete | 0;
const kOnExecute = HTTPParser.kOnExecute | 0;

parser[kOnHeaders] =
function(headers, url) {
console.log('kOnHeaders');
}
parser[kOnHeadersComplete] =
function(versionMajor, versionMinor, headers, method,
url, statusCode, statusMessage, upgrade, shouldKeepAlive) {
console.log('kOnHeadersComplete');
}
parser[kOnBody] =
function(b, start, len) {
console.log('kOnBody');
}
parser[kOnMessageComplete] =
function() {
console.log('kOnMessageComplete');
}
parser[kOnExecute] =
function() {
console.log('kOnExecute');
}

var ret = parser.execute(new Buffer(
'GET /test HTTP/1.1\r\n' +
'Host: www.example.com\r\n' +
'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0\r\n' +
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' +
'Accept-Language: en-US,en;q=0.5\r\n' +
'Accept-Encoding: gzip, deflate\r\n' +
'\r\n'
));

或者,还有一些包装器模块。该对象目前有以下方法:

  • 关闭 - 取消解析并释放解析器 (?)
  • 执行 - 读取数据 block 并解析它。如果 header 到达缓慢,可以调用任意次数
  • finish - 告诉解析器没有数据了,完成解析
  • 重新初始化 - 为另一种类型的消息(请求/响应)准备解析器
  • 暂停 - IDK,可能停止解析数据添加
  • resume - IDK,可能开始解析
  • 消费 - IDK,Stream 的东西
  • 未使用 - IDK,用于 Stream 的东西
  • getCurrentBuffer - 返回当前数据收集器(?)

具体使用方法可以引用Node源码:

关于Node.js HTTPParser 不调用一些回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13651071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com