【问题标题】:nodeJS max header size in http.requesthttp.request中的nodeJS最大标头大小
【发布时间】:2023-04-03 07:10:01
【问题描述】:

对于 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)

标题大小有限制,我可以更改吗?我有什么解决方案?

谢谢

【问题讨论】:

    标签: node.js http-headers


    【解决方案1】:

    在节点命令行上使用--max-http-header-size 来接受更大的标头。如果您得到“节点:错误选项:--max-http-header-size”,请升级到节点 v10.15.0 或更新版本。 Relevant changelog

    node --max-http-header-size 15000 client.js
    

    感谢@murad。

    【讨论】:

    • 只是注意到节点 v8 也支持 --max-http-header-size 但不支持 v9 (nodejs.org/docs/latest-v8.x/api/…)
    • @DavidThomas 那么我们如何增加最新节点版本的最大标头大小?
    【解决方案2】:

    Node 使用的 HTTP 协议解析器似乎是硬编码的,最大标头大小为 8KBRelevant constant。由于这是一个编译时常量,因此您必须使用 Node 的自定义编译版本来将该常量设置得更大。

    听起来您正在使用的服务确实犯了一个错误,将这么多数据放在标题中。标头用于有关请求正文的元数据。如果他们有这么多数据要返回,他们可能应该将其包含在请求正文中。

    您可以探索使用像 http-parser-js 这样的备用 HTTP 解析器,因为它似乎没有限制。

    【讨论】:

    • 重要:最近默认的最大标头大小已从 80K 更改为 8K。请参阅此处的讨论github.com/nodejs/node/issues/24692 配置有可用的参数--max-http-header-size
    • 更新:这已更改,请参阅 this answer 以获取有关更改方式和原因的详细说明。
    【解决方案3】:

    recent update to Node.js 中,默认允许的最大标头大小最近更改80KB8KB

    The total size of HTTP headers received by Node.js now must not exceed 8192 bytes.
    

    在我们的案例中,我们更新了 Node 的版本,并且突然开始从我们的 express 服务器获取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.
    

    【讨论】:

    • 是的,没错,最近我遇到了同样的问题,发现最大尺寸是8K,而不是80K;并且有描述:node_modules/@types/node/http.d.ts: * Defaults to 8KB. Configurable using the [`--max-http-header-size`][] CLI option.
    • 在 v13.13.0 中标头大小已更新为 16KB
    【解决方案4】:

    标头应包含元数据 - 如果它们超过 80KB,则意味着您做错了。

    Node.js 允许标头数据的最大大小为 80KB。

    您可以在此处阅读有关 http 标头的更多信息: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/

    【讨论】:

    • headers 是否包含查询字符串?即,如果我有一个文本值为15200 字节的查询字符串,是否会添加到标题大小中?
    • 我没有检查,但你可能是对的。无论如何,尝试 id's,一些短值而不是完整的对象和标题中的实际数据,你不应该考虑 80kb。
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多