一尘不染

http.request中的nodeJS最大标头大小

node.js

使用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)

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

谢谢


阅读 466

收藏
2020-07-07

共1个答案

一尘不染

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

听起来确实像您正在使用的服务通过将大量数据放在标头中而犯了一个错误。标头用于有关请求正文的元数据。如果要返回的数据量很大,则可能应将其包含在请求正文中。

您可以使用替代HTTP解析器(例如http-parser-js)进行探索,因为它似乎没有限制。

2020-07-07