使用 nodeJS v0.10.28,http 请求中标头内容的大小/长度是否有限制?
让我解释:
我需要使用第三方提供商提供的休息服务。返回给我的数据在请求的标头中,主体大部分是空的(120 个左右的字符)。标头中的数据量从几个字符到几个 100kb 不等。
var https = require('https');
var httpHeaders = {
Authorization: 'Basic ' + new Buffer(user + ':' + psw).toString('base64'),
accept: '*/*',
'Content-Type': 'text/plain; charset=utf-8'
};
var options = {
host: "www.website.com",
port: 8080,
path: "/" ,
method: 'GET',
headers: httpHeaders,
rejectUnauthorized: false,
requestCert: true,
agent: false
};
https.request(options, function(res) {
res.setEncoding('utf8');
if (res.statusCode == 200) {
var json = res.headers["someHeaderInfo"];
callback(null,{ "result" : JSON.parse(json) });
} else {
callback({ "error" : res.statusCode });
}
}).on('data', function (chunk) {
console.log('BODY: ' + chunk);
}).on('error', function(e, res) {
console.log(" Got error: " + e.message);
callback({ "error" : e.message });
}).end();
上面的代码适用于较小的标头,但在 on(‘error’, 较大的标头上显示“Parse Error”消息时失败。
删除 on error 子句会引发此异常:
Error: Parse Error
at CleartextStream.socketOnData (http.js:1583:20)
at CleartextStream.read [as _read] (tls.js:511:12)
at CleartextStream.Readable.read (_stream_readable.js:320:10)
at EncryptedStream.write [as _write] (tls.js:366:25)
at doWrite (_stream_writable.js:226:10)
at writeOrBuffer (_stream_writable.js:216:5)
at EncryptedStream.Writable.write (_stream_writable.js:183:11)
at write (_stream_readable.js:582:24)
at flow (_stream_readable.js:591:7)
at Socket.pipeOnReadable (_stream_readable.js:623:5)
标题大小有限制,我可以更改吗?我有什么解决方案?
谢谢
原文由 pts4 发布,翻译遵循 CC BY-SA 4.0 许可协议
Node 使用的 HTTP 协议解析器似乎是硬编码的,最大标头大小为
8KB
。 相关常数。由于这是一个编译时常量,因此您必须使用 Node 的自定义编译版本来将该常量设置得更大。听起来您正在使用的服务确实犯了一个错误,将这么多数据放在标题中。标头用于有关请求正文的元数据。如果他们有那么多数据要返回,他们可能应该将其包含在请求正文中。
您可以探索使用像 http-parser-js 这样的替代 HTTP 解析器,因为它似乎没有限制。