对于nodeJS v0.10.28,http请求中标题内容的大小/长度是否有限制?
让我解释一下:
我需要使用第三方提供商提供的休息服务。返回给我的数据是在请求的标题中,正文大部分是空的(120左右的字符)。标题中的数据量从几个字符到几百字节不等。
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子句会抛出此异常:
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)
标题大小是否有限制,我可以改变吗?我有什么解决方案?
由于
答案 0 :(得分:14)
Node使用的HTTP协议解析器似乎是硬编码的,最大标头大小为80KB
。 Relevant constant。由于这是一个编译时常量,您必须使用自定义编译的Node版本来设置更大的常量。
这听起来好像您正在使用的服务因为将大量数据放入标题而犯了错误。标头用于有关请求正文的元数据。如果他们要返回那么多数据,他们应该将它包含在请求体中。
您可以使用其他HTTP解析器(例如http-parser-js)进行探索,因为它似乎没有限制。
答案 1 :(得分:6)
在recent update to Node.js中,默认允许的最大标头大小最近已从80KB
更改为8KB
:
The total size of HTTP headers received by Node.js now must not exceed 8192 bytes.
在我们的案例中,我们更新了Node的版本,并且突然开始从我们的快递服务器上获取400 Bad Request
,这至少可以说令人困惑。
有一个issue open可以将此响应更改为431 Request Header Fields Too Large
,这将更具描述性和帮助性。
它也被称为configurable,因为它是breaking change for some:
--max-http-header-size=size#
Added in: v11.6.0
Specify the maximum size, in bytes, of HTTP headers. Defaults to 8KB.
答案 2 :(得分:1)
在节点命令行上使用--max-http-header-size
接受较大的标头。如果出现“节点:错误的选项:-max-http-header-size”,请升级到节点v10.15.0或更高版本。 Relevant changelog
node --max-http-header-size 15000 client.js
贷给@murad。
答案 3 :(得分:0)
标头应包含元数据-如果它们传递80KB,则表示您做错了事。
Node.js允许标头数据中的最大大小为80KB。
您可以在此处阅读有关http标头的更多信息: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/